AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
SocialMgr Class Reference

#include "SocialMgr.h"

Public Member Functions

void RemovePlayerSocial (ObjectGuid const &guid)
 
void MakeFriendStatusPacket (FriendsResult result, ObjectGuid const &friend_guid, WorldPacket *data)
 
void SendFriendStatus (Player *player, FriendsResult result, ObjectGuid const &friend_guid, bool broadcast)
 
void BroadcastToFriendListers (Player *player, WorldPacket *packet)
 
PlayerSocialLoadFromDB (PreparedQueryResult result, ObjectGuid const &guid)
 

Static Public Member Functions

static SocialMgrinstance ()
 
static void GetFriendInfo (Player *player, ObjectGuid const &friendGUID, FriendInfo &friendInfo)
 

Private Types

typedef std::map< ObjectGuid, PlayerSocialSocialMap
 

Private Member Functions

 SocialMgr ()
 
 ~SocialMgr ()
 

Private Attributes

SocialMap m_socialMap
 

Detailed Description

Member Typedef Documentation

◆ SocialMap

typedef std::map<ObjectGuid, PlayerSocial> SocialMgr::SocialMap
private

Constructor & Destructor Documentation

◆ SocialMgr()

SocialMgr::SocialMgr ( )
private
200{
201}

◆ ~SocialMgr()

SocialMgr::~SocialMgr ( )
private
204{
205}

Member Function Documentation

◆ BroadcastToFriendListers()

void SocialMgr::BroadcastToFriendListers ( Player player,
WorldPacket packet 
)
301{
302 if (!player)
303 return;
304
305 TeamId teamId = player->GetTeamId();
306 AccountTypes gmLevelInWhoList = AccountTypes(sWorld->getIntConfig(CONFIG_GM_LEVEL_IN_WHO_LIST));
307
308 for (auto const& itr : m_socialMap)
309 {
310 auto const& itr2 = itr.second.m_playerSocialMap.find(player->GetGUID());
311 if (itr2 != itr.second.m_playerSocialMap.end() && (itr2->second.Flags & SOCIAL_FLAG_FRIEND))
312 {
313 Player* pFriend = ObjectAccessor::FindPlayer(itr.first);
314 if (!pFriend)
315 continue;
316
317 WorldSession* session = pFriend->GetSession();
318 // PLAYER see his team only and PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters
319 // MODERATOR, GAME MASTER, ADMINISTRATOR can see all
320 if (!session->HasPermission(rbac::RBAC_PERM_WHO_SEE_ALL_SEC_LEVELS) && player->GetSession()->GetSecurity() > gmLevelInWhoList)
321 continue;
322
323 if (pFriend->GetTeamId() != teamId && !session->HasPermission(rbac::RBAC_PERM_TWO_SIDE_WHO_LIST))
324 continue;
325
326 if (player->IsVisibleGloballyFor(pFriend))
327 pFriend->SendDirectMessage(packet);
328 }
329 }
330}
AccountTypes
Definition Common.h:56
TeamId
Definition SharedDefines.h:747
@ SOCIAL_FLAG_FRIEND
Definition SocialMgr.h:39
@ CONFIG_GM_LEVEL_IN_WHO_LIST
Definition WorldConfig.h:212
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114
Definition Player.h:1084
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5692
TeamId GetTeamId(bool original=false) const
Definition Player.h:2128
WorldSession * GetSession() const
Definition Player.h:2020
bool IsVisibleGloballyFor(Player const *player) const
Definition Player.cpp:11429
SocialMap m_socialMap
Definition SocialMgr.h:144
Player session in the World.
Definition WorldSession.h:384
AccountTypes GetSecurity() const
Definition WorldSession.h:441
bool HasPermission(uint32 permissionId)
Definition WorldSession.cpp:1551
#define sWorld
Definition World.h:317
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245
@ RBAC_PERM_WHO_SEE_ALL_SEC_LEVELS
Definition RBAC.h:86
@ RBAC_PERM_TWO_SIDE_WHO_LIST
Definition RBAC.h:79

References CONFIG_GM_LEVEL_IN_WHO_LIST, ObjectAccessor::FindPlayer(), Object::GetGUID(), WorldSession::GetSecurity(), Player::GetSession(), Player::GetTeamId(), WorldSession::HasPermission(), Player::IsVisibleGloballyFor(), m_socialMap, rbac::RBAC_PERM_TWO_SIDE_WHO_LIST, rbac::RBAC_PERM_WHO_SEE_ALL_SEC_LEVELS, Player::SendDirectMessage(), SOCIAL_FLAG_FRIEND, and sWorld.

Referenced by SendFriendStatus().

◆ GetFriendInfo()

void SocialMgr::GetFriendInfo ( Player player,
ObjectGuid const &  friendGUID,
FriendInfo friendInfo 
)
static
214{
215 if (!player)
216 return;
217
218 friendInfo.Status = FRIEND_STATUS_OFFLINE;
219 friendInfo.Area = 0;
220 friendInfo.Level = 0;
221 friendInfo.Class = 0;
222
223 Player* pFriend = ObjectAccessor::FindConnectedPlayer(friendGUID);
224 if (!pFriend || pFriend->GetSession()->IsGMAccount())
225 return;
226
227 TeamId teamId = player->GetTeamId();
228 AccountTypes gmLevelInWhoList = AccountTypes(sWorld->getIntConfig(CONFIG_GM_LEVEL_IN_WHO_LIST));
229
230 auto const& itr = player->GetSocial()->m_playerSocialMap.find(friendGUID);
231 if (itr != player->GetSocial()->m_playerSocialMap.end())
232 friendInfo.Note = itr->second.Note;
233
234 // PLAYER see his team only and PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters
235 // MODERATOR, GAME MASTER, ADMINISTRATOR can see all
237 pFriend->GetSession()->GetSecurity() > gmLevelInWhoList)
238 return;
239
240 if (pFriend->GetTeamId() != teamId && !player->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_WHO_LIST))
241 return;
242
243 if (pFriend->IsVisibleGloballyFor(player))
244 {
245 friendInfo.Status = FRIEND_STATUS_ONLINE;
246 if (pFriend->isAFK())
247 friendInfo.Status = FRIEND_STATUS_AFK;
248 if (pFriend->isDND())
249 friendInfo.Status = FRIEND_STATUS_DND;
250 friendInfo.Area = pFriend->GetZoneId();
251 friendInfo.Level = pFriend->GetLevel();
252 friendInfo.Class = pFriend->getClass();
253 }
254}
@ FRIEND_STATUS_AFK
Definition SocialMgr.h:32
@ FRIEND_STATUS_DND
Definition SocialMgr.h:33
@ FRIEND_STATUS_OFFLINE
Definition SocialMgr.h:30
@ FRIEND_STATUS_ONLINE
Definition SocialMgr.h:31
PlayerSocialMap m_playerSocialMap
Definition SocialMgr.h:121
bool isDND() const
Definition Player.h:1150
PlayerSocial * GetSocial()
Definition Player.h:1156
bool isAFK() const
Definition Player.h:1149
uint8 getClass() const
Definition Unit.h:843
uint8 GetLevel() const
Definition Unit.h:1103
uint32 GetZoneId() const
Definition Object.cpp:3111
bool IsGMAccount() const
Definition WorldSession.cpp:210
Player * FindConnectedPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:257
FriendStatus Status
Definition SocialMgr.h:49
uint8 Level
Definition SocialMgr.h:52
uint8 Class
Definition SocialMgr.h:53
std::string Note
Definition SocialMgr.h:54
uint32 Area
Definition SocialMgr.h:51

References FriendInfo::Area, FriendInfo::Class, CONFIG_GM_LEVEL_IN_WHO_LIST, ObjectAccessor::FindConnectedPlayer(), FRIEND_STATUS_AFK, FRIEND_STATUS_DND, FRIEND_STATUS_OFFLINE, FRIEND_STATUS_ONLINE, Unit::getClass(), Unit::GetLevel(), WorldSession::GetSecurity(), Player::GetSession(), Player::GetSocial(), Player::GetTeamId(), WorldObject::GetZoneId(), WorldSession::HasPermission(), Player::isAFK(), Player::isDND(), WorldSession::IsGMAccount(), Player::IsVisibleGloballyFor(), FriendInfo::Level, PlayerSocial::m_playerSocialMap, FriendInfo::Note, rbac::RBAC_PERM_TWO_SIDE_WHO_LIST, rbac::RBAC_PERM_WHO_SEE_ALL_SEC_LEVELS, FriendInfo::Status, and sWorld.

Referenced by SendFriendStatus().

◆ instance()

SocialMgr * SocialMgr::instance ( )
static
208{
209 static SocialMgr instance;
210 return &instance;
211}
Definition SocialMgr.h:126
static SocialMgr * instance()
Definition SocialMgr.cpp:207

References instance().

Referenced by instance().

◆ LoadFromDB()

PlayerSocial * SocialMgr::LoadFromDB ( PreparedQueryResult  result,
ObjectGuid const &  guid 
)
333{
334 PlayerSocial* social = &m_socialMap[guid];
335 social->SetPlayerGUID(guid);
336
337 if (!result)
338 return social;
339
340 do
341 {
342 Field* fields = result->Fetch();
343
344 auto friendGuid = ObjectGuid::Create<HighGuid::Player>(fields[0].Get<uint32>());
345 auto flags = fields[1].Get<uint8>();
346 auto note = fields[2].Get<std::string>();
347
348 social->m_playerSocialMap[friendGuid] = FriendInfo(flags, note);
349 } while (result->NextRow());
350
351 return social;
352}
std::uint8_t uint8
Definition Define.h:109
Class used to access individual fields of database query result.
Definition Field.h:98
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112
Definition SocialMgr.h:101
void SetPlayerGUID(ObjectGuid const &guid)
Definition SocialMgr.h:116
Definition SocialMgr.h:48

References Field::Get(), PlayerSocial::m_playerSocialMap, m_socialMap, and PlayerSocial::SetPlayerGUID().

◆ MakeFriendStatusPacket()

void SocialMgr::MakeFriendStatusPacket ( FriendsResult  result,
ObjectGuid const &  friend_guid,
WorldPacket data 
)
257{
259 *data << uint8(result);
260 *data << guid;
261}
void Initialize(uint16 opcode, std::size_t newres=200)
Definition WorldPacket.h:68
@ SMSG_FRIEND_STATUS
Definition Opcodes.h:134

References WorldPacket::Initialize(), and SMSG_FRIEND_STATUS.

◆ RemovePlayerSocial()

void SocialMgr::RemovePlayerSocial ( ObjectGuid const &  guid)
inline
134{ m_socialMap.erase(guid); }

References m_socialMap.

◆ SendFriendStatus()

void SocialMgr::SendFriendStatus ( Player player,
FriendsResult  result,
ObjectGuid const &  friend_guid,
bool  broadcast 
)
264{
265 FriendInfo fi;
266 GetFriendInfo(player, friendGuid, fi);
267
269 data << uint8(result);
270 data << friendGuid;
271 switch (result)
272 {
275 data << fi.Note;
276 break;
277 default:
278 break;
279 }
280
281 switch (result)
282 {
284 case FRIEND_ONLINE:
285 data << uint8(fi.Status);
286 data << uint32(fi.Area);
287 data << uint32(fi.Level);
288 data << uint32(fi.Class);
289 break;
290 default:
291 break;
292 }
293
294 if (broadcast)
295 BroadcastToFriendListers(player, &data);
296 else
297 player->SendDirectMessage(&data);
298}
std::uint32_t uint32
Definition Define.h:107
@ FRIEND_ONLINE
Definition SocialMgr.h:68
@ FRIEND_ADDED_OFFLINE
Definition SocialMgr.h:73
@ FRIEND_ADDED_ONLINE
Definition SocialMgr.h:72
void BroadcastToFriendListers(Player *player, WorldPacket *packet)
Definition SocialMgr.cpp:300
static void GetFriendInfo(Player *player, ObjectGuid const &friendGUID, FriendInfo &friendInfo)
Definition SocialMgr.cpp:213
Definition WorldPacket.h:26

References FriendInfo::Area, BroadcastToFriendListers(), FriendInfo::Class, FRIEND_ADDED_OFFLINE, FRIEND_ADDED_ONLINE, FRIEND_ONLINE, GetFriendInfo(), FriendInfo::Level, FriendInfo::Note, Player::SendDirectMessage(), SMSG_FRIEND_STATUS, and FriendInfo::Status.

Member Data Documentation

◆ m_socialMap

SocialMap SocialMgr::m_socialMap
private

The documentation for this class was generated from the following files: