/*
* 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