/* * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2 * Copyright (C) 2008-2016 TrinityCore * Copyright (C) 2005-2009 MaNGOS */ #ifndef __ACORE_SOCIALMGR_H #define __ACORE_SOCIALMGR_H #include "Common.h" #include "DatabaseEnv.h" #include class Player; class WorldPacket; enum FriendStatus { FRIEND_STATUS_OFFLINE = 0x00, FRIEND_STATUS_ONLINE = 0x01, FRIEND_STATUS_AFK = 0x02, FRIEND_STATUS_DND = 0x04, FRIEND_STATUS_RAF = 0x08 }; enum SocialFlag { SOCIAL_FLAG_FRIEND = 0x01, SOCIAL_FLAG_IGNORED = 0x02, SOCIAL_FLAG_MUTED = 0x04, // guessed SOCIAL_FLAG_UNK = 0x08, // Unknown - does not appear to be RaF SOCIAL_FLAG_ALL = SOCIAL_FLAG_FRIEND | SOCIAL_FLAG_IGNORED | SOCIAL_FLAG_MUTED }; struct FriendInfo { FriendStatus Status; uint8 Flags; uint32 Area; uint8 Level; uint8 Class; std::string Note; FriendInfo() : Status(FRIEND_STATUS_OFFLINE), Flags(0), Area(0), Level(0), Class(0), Note() { } FriendInfo(uint8 flags, std::string const& note) : Status(FRIEND_STATUS_OFFLINE), Flags(flags), Area(0), Level(0), Class(0), Note(note) { } }; /// Results of friend related commands enum FriendsResult : uint8 { FRIEND_DB_ERROR = 0x00, FRIEND_LIST_FULL = 0x01, FRIEND_ONLINE = 0x02, FRIEND_OFFLINE = 0x03, FRIEND_NOT_FOUND = 0x04, FRIEND_REMOVED = 0x05, FRIEND_ADDED_ONLINE = 0x06, FRIEND_ADDED_OFFLINE = 0x07, FRIEND_ALREADY = 0x08, FRIEND_SELF = 0x09, FRIEND_ENEMY = 0x0A, FRIEND_IGNORE_FULL = 0x0B, FRIEND_IGNORE_SELF = 0x0C, FRIEND_IGNORE_NOT_FOUND = 0x0D, FRIEND_IGNORE_ALREADY = 0x0E, FRIEND_IGNORE_ADDED = 0x0F, FRIEND_IGNORE_REMOVED = 0x10, FRIEND_IGNORE_AMBIGUOUS = 0x11, // That name is ambiguous, type more of the player's server name FRIEND_MUTE_FULL = 0x12, FRIEND_MUTE_SELF = 0x13, FRIEND_MUTE_NOT_FOUND = 0x14, FRIEND_MUTE_ALREADY = 0x15, FRIEND_MUTE_ADDED = 0x16, FRIEND_MUTE_REMOVED = 0x17, FRIEND_MUTE_AMBIGUOUS = 0x18, // That name is ambiguous, type more of the player's server name FRIEND_UNK1 = 0x19, // no message at client FRIEND_UNK2 = 0x1A, FRIEND_UNK3 = 0x1B, FRIEND_UNKNOWN = 0x1C // Unknown friend response from server }; #define SOCIALMGR_FRIEND_LIMIT 50u #define SOCIALMGR_IGNORE_LIMIT 50u class PlayerSocial { friend class SocialMgr; public: PlayerSocial(); // adding/removing bool AddToSocialList(uint64 friend_guid, SocialFlag flag); void RemoveFromSocialList(uint64 friend_guid, SocialFlag flag); void SetFriendNote(uint64 friendGuid, std::string note); // Packet send's void SendSocialList(Player* player, uint32 flags); // Misc bool HasFriend(uint64 friend_guid) const; bool HasIgnore(uint64 ignore_guid) const; uint64 GetPlayerGUID() const { return m_playerGUID; } void SetPlayerGUID(uint64 guid) { m_playerGUID = guid; } uint32 GetNumberOfSocialsWithFlag(SocialFlag flag) const; private: bool _checkContact(uint64 guid, SocialFlag flags) const; typedef std::map PlayerSocialMap; PlayerSocialMap m_playerSocialMap; uint64 m_playerGUID; }; class SocialMgr { private: SocialMgr(); ~SocialMgr(); public: static SocialMgr* instance(); // Misc void RemovePlayerSocial(uint64 guid) { m_socialMap.erase(guid); } static void GetFriendInfo(Player* player, uint64 friendGUID, FriendInfo& friendInfo); // Packet management void MakeFriendStatusPacket(FriendsResult result, uint64 friend_guid, WorldPacket* data); void SendFriendStatus(Player* player, FriendsResult result, uint64 friend_guid, bool broadcast); void BroadcastToFriendListers(Player* player, WorldPacket* packet); // Loading PlayerSocial* LoadFromDB(PreparedQueryResult result, uint64 guid); private: typedef std::map SocialMap; SocialMap m_socialMap; }; #define sSocialMgr SocialMgr::instance() #endif