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

#include "SocialMgr.h"

Public Member Functions

 PlayerSocial ()
 
bool AddToSocialList (ObjectGuid const &friend_guid, SocialFlag flag)
 
void RemoveFromSocialList (ObjectGuid const &friend_guid, SocialFlag flag)
 
void SetFriendNote (ObjectGuid const &friendGuid, std::string note)
 
void SendSocialList (Player *player, uint32 flags)
 
bool HasFriend (ObjectGuid const &friend_guid) const
 
bool HasIgnore (ObjectGuid const &ignore_guid) const
 
ObjectGuid const & GetPlayerGUID () const
 
void SetPlayerGUID (ObjectGuid const &guid)
 
uint32 GetNumberOfSocialsWithFlag (SocialFlag flag) const
 

Private Types

typedef std::map< ObjectGuid, FriendInfoPlayerSocialMap
 

Private Member Functions

bool _checkContact (ObjectGuid const &guid, SocialFlag flags) const
 

Private Attributes

PlayerSocialMap m_playerSocialMap
 
ObjectGuid m_playerGUID
 

Friends

class SocialMgr
 

Detailed Description

Member Typedef Documentation

◆ PlayerSocialMap

Constructor & Destructor Documentation

◆ PlayerSocial()

PlayerSocial::PlayerSocial ( )
28: m_playerGUID() { }
ObjectGuid m_playerGUID
Definition SocialMgr.h:122

Member Function Documentation

◆ _checkContact()

bool PlayerSocial::_checkContact ( ObjectGuid const &  guid,
SocialFlag  flags 
) const
private
181{
182 auto const& itr = m_playerSocialMap.find(guid);
183 if (itr != m_playerSocialMap.end())
184 return (itr->second.Flags & flags) != 0;
185
186 return false;
187}
PlayerSocialMap m_playerSocialMap
Definition SocialMgr.h:121

References m_playerSocialMap.

Referenced by HasFriend(), and HasIgnore().

◆ AddToSocialList()

bool PlayerSocial::AddToSocialList ( ObjectGuid const &  friend_guid,
SocialFlag  flag 
)
42{
43 // check client limits
45 return false;
46
47 auto itr = m_playerSocialMap.find(friendGuid);
48 if (itr != m_playerSocialMap.end())
49 {
50 itr->second.Flags |= flag;
51
53
54 stmt->SetData(0, itr->second.Flags);
55 stmt->SetData(1, GetPlayerGUID().GetCounter());
56 stmt->SetData(2, friendGuid.GetCounter());
57
58 CharacterDatabase.Execute(stmt);
59 }
60 else
61 {
62 m_playerSocialMap[friendGuid].Flags |= flag;
63
65
66 stmt->SetData(0, GetPlayerGUID().GetCounter());
67 stmt->SetData(1, friendGuid.GetCounter());
68 stmt->SetData(2, flag);
69
70 CharacterDatabase.Execute(stmt);
71 }
72 return true;
73}
@ CHAR_INS_CHARACTER_SOCIAL
Definition CharacterDatabase.h:322
@ CHAR_UPD_ADD_CHARACTER_SOCIAL_FLAGS
Definition CharacterDatabase.h:320
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
@ SOCIAL_FLAG_FRIEND
Definition SocialMgr.h:39
#define SOCIALMGR_IGNORE_LIMIT
Definition SocialMgr.h:98
#define SOCIALMGR_FRIEND_LIMIT
Definition SocialMgr.h:97
ObjectGuid const & GetPlayerGUID() const
Definition SocialMgr.h:115
uint32 GetNumberOfSocialsWithFlag(SocialFlag flag) const
Definition SocialMgr.cpp:30
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157

References CHAR_INS_CHARACTER_SOCIAL, CHAR_UPD_ADD_CHARACTER_SOCIAL_FLAGS, CharacterDatabase, ObjectGuid::GetCounter(), GetNumberOfSocialsWithFlag(), GetPlayerGUID(), m_playerSocialMap, PreparedStatementBase::SetData(), SOCIAL_FLAG_FRIEND, SOCIALMGR_FRIEND_LIMIT, and SOCIALMGR_IGNORE_LIMIT.

◆ GetNumberOfSocialsWithFlag()

uint32 PlayerSocial::GetNumberOfSocialsWithFlag ( SocialFlag  flag) const
31{
32 uint32 counter = 0;
33 for (auto const& itr : m_playerSocialMap)
34 {
35 if ((itr.second.Flags & flag) != 0)
36 ++counter;
37 }
38 return counter;
39}
std::uint32_t uint32
Definition Define.h:107

References m_playerSocialMap.

Referenced by AddToSocialList().

◆ GetPlayerGUID()

ObjectGuid const & PlayerSocial::GetPlayerGUID ( ) const
inline
115{ return m_playerGUID; }

References m_playerGUID.

Referenced by AddToSocialList(), RemoveFromSocialList(), and SetFriendNote().

◆ HasFriend()

bool PlayerSocial::HasFriend ( ObjectGuid const &  friend_guid) const
190{
191 return _checkContact(friend_guid, SOCIAL_FLAG_FRIEND);
192}
bool _checkContact(ObjectGuid const &guid, SocialFlag flags) const
Definition SocialMgr.cpp:180

References _checkContact(), and SOCIAL_FLAG_FRIEND.

Referenced by WorldSession::HandleGroupInviteOpcode().

◆ HasIgnore()

bool PlayerSocial::HasIgnore ( ObjectGuid const &  ignore_guid) const

◆ RemoveFromSocialList()

void PlayerSocial::RemoveFromSocialList ( ObjectGuid const &  friend_guid,
SocialFlag  flag 
)
76{
77 auto itr = m_playerSocialMap.find(friendGuid);
78 if (itr == m_playerSocialMap.end()) // not exist
79 return;
80
81 itr->second.Flags &= ~flag;
82
83 if (itr->second.Flags == 0)
84 {
86
87 stmt->SetData(0, GetPlayerGUID().GetCounter());
88 stmt->SetData(1, friendGuid.GetCounter());
89
90 CharacterDatabase.Execute(stmt);
91
92 m_playerSocialMap.erase(itr);
93 }
94 else
95 {
97
98 stmt->SetData(0, flag);
99 stmt->SetData(1, GetPlayerGUID().GetCounter());
100 stmt->SetData(2, friendGuid.GetCounter());
101
102 CharacterDatabase.Execute(stmt);
103 }
104}
@ CHAR_UPD_REM_CHARACTER_SOCIAL_FLAGS
Definition CharacterDatabase.h:321
@ CHAR_DEL_CHARACTER_SOCIAL
Definition CharacterDatabase.h:323

References CHAR_DEL_CHARACTER_SOCIAL, CHAR_UPD_REM_CHARACTER_SOCIAL_FLAGS, CharacterDatabase, ObjectGuid::GetCounter(), GetPlayerGUID(), m_playerSocialMap, and PreparedStatementBase::SetData().

Referenced by WorldSession::HandleDelFriendOpcode(), and WorldSession::HandleDelIgnoreOpcode().

◆ SendSocialList()

void PlayerSocial::SendSocialList ( Player player,
uint32  flags 
)
126{
127 if (!player)
128 return;
129
130 uint32 friendsCount = 0;
131 uint32 ignoredCount = 0;
132 uint32 totalCount = 0;
133
134 WorldPacket data(SMSG_CONTACT_LIST, (4 + 4 + m_playerSocialMap.size() * 25)); // just can guess size
135 data << uint32(flags); // 0x1 = Friendlist update. 0x2 = Ignorelist update. 0x4 = Mutelist update.
136 std::size_t countPos = data.wpos();
137 data << uint32(0); // contacts count placeholder
138
139 for (auto& itr : m_playerSocialMap)
140 {
141 FriendInfo& friendInfo = itr.second;
142 uint8 contactFlags = friendInfo.Flags;
143 if (!(contactFlags & flags))
144 continue;
145
146 // Check client limit for friends list
147 if (contactFlags & SOCIAL_FLAG_FRIEND)
148 if (++friendsCount > SOCIALMGR_FRIEND_LIMIT)
149 continue;
150
151 // Check client limit for ignore list
152 if (contactFlags & SOCIAL_FLAG_IGNORED)
153 if (++ignoredCount > SOCIALMGR_IGNORE_LIMIT)
154 continue;
155
156 ++totalCount;
157
158 sSocialMgr->GetFriendInfo(player, itr.first, friendInfo);
159
160 data << itr.first; // player guid
161 data << uint32(contactFlags); // player flag (0x1 = Friend, 0x2 = Ignored, 0x4 = Muted)
162 data << friendInfo.Note; // string note
163 if (contactFlags & SOCIAL_FLAG_FRIEND) // if IsFriend()
164 {
165 data << uint8(friendInfo.Status); // online/offline/etc?
166 if (friendInfo.Status) // if online
167 {
168 data << uint32(friendInfo.Area); // player area
169 data << uint32(friendInfo.Level); // player level
170 data << uint32(friendInfo.Class); // player class
171 }
172 }
173 }
174
175 data.put<uint32>(countPos, totalCount);
176 player->SendDirectMessage(&data);
177 LOG_DEBUG("network", "WORLD: Sent SMSG_CONTACT_LIST");
178}
std::uint8_t uint8
Definition Define.h:109
#define LOG_DEBUG(filterType__,...)
Definition Log.h:157
#define sSocialMgr
Definition SocialMgr.h:147
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5692
Definition WorldPacket.h:26
@ SMSG_CONTACT_LIST
Definition Opcodes.h:133
Definition SocialMgr.h:48
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
uint8 Flags
Definition SocialMgr.h:50
uint32 Area
Definition SocialMgr.h:51

References FriendInfo::Area, FriendInfo::Class, FriendInfo::Flags, FriendInfo::Level, LOG_DEBUG, m_playerSocialMap, FriendInfo::Note, ByteBuffer::put(), Player::SendDirectMessage(), SMSG_CONTACT_LIST, SOCIAL_FLAG_FRIEND, SOCIAL_FLAG_IGNORED, SOCIALMGR_FRIEND_LIMIT, SOCIALMGR_IGNORE_LIMIT, sSocialMgr, FriendInfo::Status, and ByteBuffer::wpos().

Referenced by WorldSession::HandleContactListOpcode(), and Player::SendInitialPacketsBeforeAddToMap().

◆ SetFriendNote()

void PlayerSocial::SetFriendNote ( ObjectGuid const &  friendGuid,
std::string  note 
)
107{
108 auto itr = m_playerSocialMap.find(friendGuid);
109 if (itr == m_playerSocialMap.end()) // not exist
110 return;
111
112 utf8truncate(note, 48); // DB and client size limitation
113
115
116 stmt->SetData(0, note);
117 stmt->SetData(1, GetPlayerGUID().GetCounter());
118 stmt->SetData(2, friendGuid.GetCounter());
119
120 CharacterDatabase.Execute(stmt);
121
122 m_playerSocialMap[friendGuid].Note = note;
123}
@ CHAR_UPD_CHARACTER_SOCIAL_NOTE
Definition CharacterDatabase.h:324
void utf8truncate(std::string &utf8str, std::size_t len)
Definition Util.cpp:258

References CHAR_UPD_CHARACTER_SOCIAL_NOTE, CharacterDatabase, ObjectGuid::GetCounter(), GetPlayerGUID(), m_playerSocialMap, PreparedStatementBase::SetData(), and utf8truncate().

Referenced by WorldSession::HandleAddFriendOpcode(), and WorldSession::HandleSetContactNotesOpcode().

◆ SetPlayerGUID()

void PlayerSocial::SetPlayerGUID ( ObjectGuid const &  guid)
inline
116{ m_playerGUID = guid; }

References m_playerGUID.

Referenced by SocialMgr::LoadFromDB().

Friends And Related Symbol Documentation

◆ SocialMgr

friend class SocialMgr
friend

Member Data Documentation

◆ m_playerGUID

ObjectGuid PlayerSocial::m_playerGUID
private

Referenced by GetPlayerGUID(), and SetPlayerGUID().

◆ m_playerSocialMap


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