/* * Copyright (C) 2008-2015 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #ifndef __TRINITY_GUILDFINDER_H #define __TRINITY_GUILDFINDER_H #include "Common.h" #include "ObjectGuid.h" #include "World.h" #include "GuildMgr.h" enum GuildFinderOptionsInterest { INTEREST_QUESTING = 0x01, INTEREST_DUNGEONS = 0x02, INTEREST_RAIDS = 0x04, INTEREST_PVP = 0x08, INTEREST_ROLE_PLAYING = 0x10, ALL_INTERESTS = INTEREST_QUESTING | INTEREST_DUNGEONS | INTEREST_RAIDS | INTEREST_PVP | INTEREST_ROLE_PLAYING }; enum GuildFinderOptionsAvailability { AVAILABILITY_WEEKDAYS = 0x1, AVAILABILITY_WEEKENDS = 0x2, AVAILABILITY_ALWAYS = AVAILABILITY_WEEKDAYS | AVAILABILITY_WEEKENDS }; enum GuildFinderOptionsRoles { GUILDFINDER_ROLE_TANK = 0x1, GUILDFINDER_ROLE_HEALER = 0x2, GUILDFINDER_ROLE_DPS = 0x4, GUILDFINDER_ALL_ROLES = GUILDFINDER_ROLE_TANK | GUILDFINDER_ROLE_HEALER | GUILDFINDER_ROLE_DPS }; enum GuildFinderOptionsLevel { ANY_FINDER_LEVEL = 0x1, MAX_FINDER_LEVEL = 0x2, ALL_GUILDFINDER_LEVELS = ANY_FINDER_LEVEL | MAX_FINDER_LEVEL }; /// Holds all required informations about a membership request struct MembershipRequest { public: MembershipRequest(MembershipRequest const& settings) : _comment(settings.GetComment()) { _availability = settings.GetAvailability(); _classRoles = settings.GetClassRoles(); _interests = settings.GetInterests(); _guildId = settings.GetGuildGuid(); _playerGUID = settings.GetPlayerGUID(); _time = settings.GetSubmitTime(); } MembershipRequest(ObjectGuid const& playerGUID, ObjectGuid const& guildId, uint32 availability, uint32 classRoles, uint32 interests, std::string& comment, time_t submitTime) : _comment(comment), _guildId(guildId), _playerGUID(playerGUID), _availability(availability), _classRoles(classRoles), _interests(interests), _time(submitTime) {} MembershipRequest() : _availability(0), _classRoles(0), _interests(0), _time(time(NULL)) {} ObjectGuid const& GetGuildGuid() const { return _guildId; } ObjectGuid const& GetPlayerGUID() const { return _playerGUID; } uint8 GetAvailability() const { return _availability; } uint8 GetClassRoles() const { return _classRoles; } uint8 GetInterests() const { return _interests; } uint8 GetClass() const { return sWorld->GetCharacterInfo(GetPlayerGUID())->Class; } uint8 GetLevel() const { return sWorld->GetCharacterInfo(GetPlayerGUID())->Level; } time_t GetSubmitTime() const { return _time; } time_t GetExpiryTime() const { return time_t(_time + 30 * 24 * 3600); } // Adding 30 days std::string const& GetComment() const { return _comment; } std::string const& GetName() const { return sWorld->GetCharacterInfo(GetPlayerGUID())->Name; } private: std::string _comment; ObjectGuid _guildId; ObjectGuid _playerGUID; uint8 _availability; uint8 _classRoles; uint8 _interests; time_t _time; }; /// Holds all informations about a player's finder settings. _NOT_ stored in database. struct LFGuildPlayer { public: LFGuildPlayer() { _roles = 0; _availability = 0; _interests = 0; _level = 0; } LFGuildPlayer(ObjectGuid const& guid, uint8 role, uint8 availability, uint8 interests, uint8 level) { _guid = guid; _roles = role; _availability = availability; _interests = interests; _level = level; } LFGuildPlayer(ObjectGuid const& guid, uint8 role, uint8 availability, uint8 interests, uint8 level, std::string& comment) : _comment(comment) { _guid = guid; _roles = role; _availability = availability; _interests = interests; _level = level; } LFGuildPlayer(LFGuildPlayer const& settings) : _comment(settings.GetComment()) { _guid = settings.GetGUID(); _roles = settings.GetClassRoles(); _availability = settings.GetAvailability(); _interests = settings.GetInterests(); _level = settings.GetLevel(); } ObjectGuid const& GetGUID() const { return _guid; } uint8 GetClassRoles() const { return _roles; } uint8 GetAvailability() const { return _availability; } uint8 GetInterests() const { return _interests; } uint8 GetLevel() const { return _level; } std::string const& GetComment() const { return _comment; } private: std::string _comment; ObjectGuid _guid; uint8 _roles; uint8 _availability; uint8 _interests; uint8 _level; }; /// Holds settings for a guild in the finder system. Saved to database. struct LFGuildSettings : public LFGuildPlayer { public: LFGuildSettings() : LFGuildPlayer(), _listed(false), _team(TEAM_ALLIANCE) {} LFGuildSettings(bool listed, TeamId team) : LFGuildPlayer(), _listed(listed), _team(team) {} LFGuildSettings(bool listed, TeamId team, ObjectGuid const& guid, uint8 role, uint8 availability, uint8 interests, uint8 level) : LFGuildPlayer(guid, role, availability, interests, level), _listed(listed), _team(team) {} LFGuildSettings(bool listed, TeamId team, ObjectGuid const& guid, uint8 role, uint8 availability, uint8 interests, uint8 level, std::string& comment) : LFGuildPlayer(guid, role, availability, interests, level, comment), _listed(listed), _team(team) {} LFGuildSettings(LFGuildSettings const& settings) : LFGuildPlayer(settings), _listed(settings.IsListed()), _team(settings.GetTeam()) {} bool IsListed() const { return _listed; } void SetListed(bool state) { _listed = state; } TeamId GetTeam() const { return _team; } private: bool _listed; TeamId _team; }; typedef std::map LFGuildStore; typedef std::map > MembershipRequestStore; class GuildFinderMgr { private: GuildFinderMgr(); ~GuildFinderMgr(); LFGuildStore _guildSettings; MembershipRequestStore _membershipRequests; void LoadGuildSettings(); void LoadMembershipRequests(); public: void LoadFromDB(); /** * @brief Stores guild settings and begins an asynchronous database insert * @param guildGuid The guild's database guid. * @param LFGuildSettings The guild's settings storage. */ void SetGuildSettings(ObjectGuid const& guildGuid, LFGuildSettings const& settings); /** * @brief Returns settings for a guild. * @param guildGuid The guild's database guid. */ LFGuildSettings GetGuildSettings(ObjectGuid const& guildGuid) { return _guildSettings[guildGuid]; } /** * @brief Files a membership request to a guild * @param guildGuid The guild's database GUID. * @param MembershipRequest An object storing all data related to the request. */ void AddMembershipRequest(ObjectGuid const& guildGuid, MembershipRequest const& request); /** * @brief Removes all membership request from a player. * @param playerId The player's database guid whose application shall be deleted. */ void RemoveAllMembershipRequestsFromPlayer(ObjectGuid const& playerId); /** * @brief Removes a membership request to a guild. * @param playerId The player's database guid whose application shall be deleted. * @param guildId The guild's database guid */ void RemoveMembershipRequest(ObjectGuid const& playerId, ObjectGuid const& guildId); /// Wipes everything related to a guild. Used when that guild is disbanded void DeleteGuild(ObjectGuid const& guildId); /** * @brief Returns a set of membership requests for a guild * @param guildGuid The guild's database guid. */ std::vector GetAllMembershipRequestsForGuild(ObjectGuid const& guildGuid) { return _membershipRequests[guildGuid]; } /** * @brief Returns a list of membership requests for a player. * @param playerGuid The player's database guid. */ std::list GetAllMembershipRequestsForPlayer(ObjectGuid const& playerGuid); /** * @brief Returns a store of guilds matching the settings provided, using bitmask operators. * @param settings The player's finder settings * @param teamId The player's faction (TEAM_ALLIANCE or TEAM_HORDE) */ LFGuildStore GetGuildsMatchingSetting(LFGuildPlayer& settings, TeamId faction); /// Provided a player guid and a guild guid, determines if a pending request is filed with these keys. bool HasRequest(ObjectGuid const& playerId, ObjectGuid const& guildId); /// Counts the amount of pending membership requests, given the player's db guid. uint8 CountRequestsFromPlayer(ObjectGuid const& playerId); static void SendApplicantListUpdate(Guild* guild); static void SendMembershipRequestListUpdate(Player* player); static GuildFinderMgr* instance() { static GuildFinderMgr instance; return &instance; } }; #define sGuildFinderMgr GuildFinderMgr::instance() #endif // __TRINITY_GUILDFINDER_H