Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
GuildFinderHandler.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "GuildFinderMgr.h"
7#include "GuildMgr.h"
8#include "Object.h"
9#include "SharedDefines.h"
10#include "WorldPacket.h"
11#include "WorldSession.h"
12
14{
15 SF_LOG_DEBUG("network", "WORLD: Received CMSG_LF_GUILD_ADD_APPLICATION");
16
17 if (sGuildFinderMgr->GetAllMembershipRequestsForPlayer(GetPlayer()->GetGUIDLow()).size() == 10)
18 return;
19
20 uint32 classRoles = 0;
21 uint32 availability = 0;
22 uint32 guildInterests = 0;
23
24 recvPacket >> classRoles >> availability >> guildInterests;
25
26 ObjectGuid guid;
27 recvPacket.ReadGuidMask(guid, 7, 5, 2, 6, 1, 0);
28 uint16 commentLength = recvPacket.ReadBits(10);
29 recvPacket.ReadGuidMask(guid, 3, 4);
30
31 recvPacket.ReadGuidBytes(guid, 4, 0, 2);
32 std::string comment = recvPacket.ReadString(commentLength);
33 recvPacket.ReadGuidBytes(guid, 6, 1, 5, 7, 3);
34
35 uint32 guildLowGuid = GUID_LOPART(uint64(guid));
36
37 if (!IS_GUILD_GUID(guid))
38 return;
39 if (!(classRoles & GUILDFINDER_ALL_ROLES) || classRoles > GUILDFINDER_ALL_ROLES)
40 return;
41 if (!(availability & AVAILABILITY_ALWAYS) || availability > AVAILABILITY_ALWAYS)
42 return;
43 if (!(guildInterests & ALL_INTERESTS) || guildInterests > ALL_INTERESTS)
44 return;
45
46 MembershipRequest request = MembershipRequest(GetPlayer()->GetGUIDLow(), guildLowGuid, availability, classRoles, guildInterests, comment, time(NULL));
47 sGuildFinderMgr->AddMembershipRequest(guildLowGuid, request);
48}
49
51{
52 SF_LOG_DEBUG("network", "WORLD: Received CMSG_LF_GUILD_BROWSE");
53 uint32 classRoles = 0;
54 uint32 availability = 0;
55 uint32 guildInterests = 0;
56 uint32 playerLevel = 0; // Raw player level (1-85), do they use MAX_FINDER_LEVEL when on level 85 ?
57
58 recvPacket >> playerLevel >> availability >> classRoles >> guildInterests;
59
60 if (!(classRoles & GUILDFINDER_ALL_ROLES) || classRoles > GUILDFINDER_ALL_ROLES)
61 return;
62 if (!(availability & AVAILABILITY_ALWAYS) || availability > AVAILABILITY_ALWAYS)
63 return;
64 if (!(guildInterests & ALL_INTERESTS) || guildInterests > ALL_INTERESTS)
65 return;
66 if (playerLevel > sWorld->getIntConfig(WorldIntConfigs::CONFIG_MAX_PLAYER_LEVEL) || playerLevel < 1)
67 return;
68
69 Player* player = GetPlayer();
70
71 LFGuildPlayer settings(player->GetGUIDLow(), classRoles, availability, guildInterests, ANY_FINDER_LEVEL);
72 LFGuildStore guildList = sGuildFinderMgr->GetGuildsMatchingSetting(settings, player->GetTeamId());
73 uint32 guildCount = guildList.size();
74
75 if (guildCount == 0)
76 {
78 player->SendDirectMessage(&packet);
79 return;
80 }
81
82 ByteBuffer bufferData(65 * guildCount);
83 WorldPacket data(SMSG_LF_GUILD_BROWSE_UPDATED, 3 + guildCount * 65); // Estimated size
84
85 data.WriteBits(guildCount, 18);
86
87 for (LFGuildStore::const_iterator itr = guildList.begin(); itr != guildList.end(); ++itr)
88 {
89 LFGuildSettings guildSettings = itr->second;
90 Guild* guild = sGuildMgr->GetGuildById(itr->first);
91
92 ObjectGuid guildGUID = ObjectGuid(guild->GetGUID());
93
94 data.WriteBit(guildGUID[6]);
95 data.WriteBit(guildGUID[5]);
96 data.WriteBit(guildGUID[4]);
97 data.WriteBit(guildGUID[0]);
98 data.WriteBit(guildGUID[1]);
99 data.WriteBits(guildSettings.GetComment().size(), 10);
100 data.WriteBit(guildGUID[3]);
101 data.WriteBits(guild->GetName().size(), 7);
102 data.WriteBit(guildGUID[7]);
103 data.WriteBit(guildGUID[2]);
104
105 bufferData.WriteByteSeq(guildGUID[3]);
106 bufferData << uint32(guild->GetEmblemInfo().GetStyle());
107 bufferData << uint8(sGuildFinderMgr->HasRequest(player->GetGUIDLow(), guild->GetGUID())); // Request pending
108 bufferData.WriteByteSeq(guildGUID[0]);
109 bufferData << uint32(guild->GetAchievementMgr().GetAchievementPoints());
110 bufferData.WriteByteSeq(guildGUID[2]);
111 bufferData << uint32(guildSettings.GetInterests());
112 bufferData << uint32(guild->GetEmblemInfo().GetBackgroundColor());
113 bufferData << uint32(guild->GetLevel());
114 bufferData << uint32(guildSettings.GetAvailability());
115 bufferData << uint32(guildSettings.GetClassRoles());
116 bufferData.WriteByteSeq(guildGUID[5]);
117 bufferData << uint8(0); // Unk
118 bufferData.WriteString(guild->GetName());
119 bufferData << uint32(0); // Unk
120 bufferData << uint32(guild->GetEmblemInfo().GetBorderStyle()); // Guessed
121 bufferData.WriteByteSeq(guildGUID[7]);
122 bufferData << uint32(guild->GetEmblemInfo().GetColor());
123 bufferData.WriteByteSeq(guildGUID[6]);
124 bufferData << uint32(0); // Unk
125 bufferData.WriteString(guildSettings.GetComment());
126 bufferData << uint32(guild->GetEmblemInfo().GetBorderColor());
127 bufferData << uint32(guild->GetMembersCount());
128 bufferData.WriteByteSeq(guildGUID[1]);
129 bufferData.WriteByteSeq(guildGUID[4]);
130 }
131
132 data.FlushBits();
133
134 player->SendDirectMessage(&data);
135}
136
138{
139 SF_LOG_DEBUG("network", "WORLD: Received CMSG_LF_GUILD_DECLINE_RECRUIT");
140
141 ObjectGuid RecruitGUID;
142
143 recvPacket.ReadGuidMask(RecruitGUID, 6, 7, 3, 1, 2, 0, 4, 5);
144 recvPacket.ReadGuidBytes(RecruitGUID, 0, 7, 1, 6, 4, 3, 5, 2);
145
146 if (!IS_PLAYER_GUID(RecruitGUID))
147 return;
148
149 sGuildFinderMgr->RemoveMembershipRequest(GUID_LOPART(RecruitGUID), GetPlayer()->GetGuildId());
150}
151
153{
154 SF_LOG_DEBUG("network", "WORLD: Received CMSG_LF_GUILD_GET_APPLICATIONS"); // Empty opcode
155
156 std::list<MembershipRequest> applicatedGuilds = sGuildFinderMgr->GetAllMembershipRequestsForPlayer(GetPlayer()->GetGUIDLow());
157 uint32 applicationsCount = applicatedGuilds.size();
158 WorldPacket data(SMSG_LF_GUILD_MEMBERSHIP_LIST_UPDATED, 7 + 54 * applicationsCount);
159 data.WriteBits(applicationsCount, 20);
160
161 if (applicationsCount > 0)
162 {
163 ByteBuffer bufferData(54 * applicationsCount);
164 for (std::list<MembershipRequest>::const_iterator itr = applicatedGuilds.begin(); itr != applicatedGuilds.end(); ++itr)
165 {
166 Guild* guild = sGuildMgr->GetGuildById(itr->GetGuildId());
167 LFGuildSettings guildSettings = sGuildFinderMgr->GetGuildSettings(itr->GetGuildId());
168 MembershipRequest request = *itr;
169
170 ObjectGuid guildGuid = ObjectGuid(guild->GetGUID());
171
172 data.WriteBit(guildGuid[0]);
173 data.WriteBit(guildGuid[4]);
174 data.WriteBit(guildGuid[2]);
175 data.WriteBit(guildGuid[7]);
176 data.WriteBits(guild->GetName().size(), 7);
177 data.WriteBit(guildGuid[2]);
178 data.WriteBit(guildGuid[3]);
179 data.WriteBits(request.GetComment().size(), 10);
180 data.WriteBit(guildGuid[6]);
181 data.WriteBit(guildGuid[5]);
182
183 bufferData << uint32(guildSettings.GetInterests());
184 bufferData << uint32(0); // unk
185 bufferData.WriteString(guild->GetName());
186 bufferData.WriteByteSeq(guildGuid[4]);
187 bufferData << uint32(guildSettings.GetClassRoles());
188 bufferData.WriteByteSeq(guildGuid[6]);
189 bufferData.WriteByteSeq(guildGuid[5]);
190 bufferData << uint32(time(NULL) - request.GetSubmitTime()); // Time since application (seconds)
191 bufferData.WriteByteSeq(guildGuid[1]);
192 bufferData.WriteByteSeq(guildGuid[3]);
193 bufferData.WriteByteSeq(guildGuid[0]);
194 bufferData.WriteByteSeq(guildGuid[7]);
195 bufferData.WriteByteSeq(guildGuid[2]);
196 bufferData << uint32(request.GetExpiryTime() - time(NULL)); // Time left to application expiry (seconds)
197 bufferData << uint32(guildSettings.GetAvailability());
198 bufferData.WriteString(request.GetComment());
199 }
200 }
201 data << uint32(10 - sGuildFinderMgr->CountRequestsFromPlayer(GetPlayer()->GetGUIDLow())); // Applications count left
202
204}
205
206// Lists all recruits for a guild - Misses times
208{
209 SF_LOG_DEBUG("network", "WORLD: Received CMSG_LF_GUILD_GET_RECRUITS");
210
211 uint32 unkTime = 0;
212 recvPacket >> unkTime;
213
214 Player* player = GetPlayer();
215 if (!player->GetGuildId())
216 return;
217
218 std::vector<MembershipRequest> recruitsList = sGuildFinderMgr->GetAllMembershipRequestsForGuild(player->GetGuildId());
219 uint32 recruitCount = recruitsList.size();
220
221 ByteBuffer dataBuffer(53 * recruitCount);
222 WorldPacket data(SMSG_LF_GUILD_RECRUIT_LIST_UPDATED, 7 + 26 * recruitCount + 53 * recruitCount);
223 data.WriteBits(recruitCount, 20);
224
225 for (std::vector<MembershipRequest>::const_iterator itr = recruitsList.begin(); itr != recruitsList.end(); ++itr)
226 {
227 MembershipRequest request = *itr;
228 ObjectGuid playerGuid(MAKE_NEW_GUID(request.GetPlayerGUID(), 0, HIGHGUID_PLAYER));
229
230 data.WriteBits(request.GetComment().size(), 11);
231 data.WriteBit(playerGuid[2]);
232 data.WriteBit(playerGuid[4]);
233 data.WriteBit(playerGuid[3]);
234 data.WriteBit(playerGuid[7]);
235 data.WriteBit(playerGuid[0]);
236 data.WriteBits(request.GetName().size(), 7);
237 data.WriteBit(playerGuid[5]);
238 data.WriteBit(playerGuid[1]);
239 data.WriteBit(playerGuid[6]);
240
241 dataBuffer.WriteByteSeq(playerGuid[4]);
242
243 dataBuffer << int32(time(NULL) <= request.GetExpiryTime());
244
245 dataBuffer.WriteByteSeq(playerGuid[3]);
246 dataBuffer.WriteByteSeq(playerGuid[0]);
247 dataBuffer.WriteByteSeq(playerGuid[1]);
248
249 dataBuffer << int32(request.GetLevel());
250
251 dataBuffer.WriteByteSeq(playerGuid[6]);
252 dataBuffer.WriteByteSeq(playerGuid[7]);
253 dataBuffer.WriteByteSeq(playerGuid[2]);
254
255 dataBuffer << int32(time(NULL) - request.GetSubmitTime()); // Time in seconds since application submitted.
256 dataBuffer << int32(request.GetAvailability());
257 dataBuffer << int32(request.GetClassRoles());
258 dataBuffer << int32(request.GetInterests());
259 dataBuffer << int32(request.GetExpiryTime() - time(NULL)); // TIme in seconds until application expires.
260
261 dataBuffer.WriteString(request.GetName());
262 dataBuffer.WriteString(request.GetComment());
263
264 dataBuffer << int32(request.GetClass());
265
266 dataBuffer.WriteByteSeq(playerGuid[5]);
267 }
268
269 data.FlushBits();
270 data.append(dataBuffer);
271 data << uint32(time(NULL)); // Unk time
272
273 player->SendDirectMessage(&data);
274}
275
277{
278 SF_LOG_DEBUG("network", "WORLD: Received CMSG_LF_GUILD_POST_REQUEST"); // Empty opcode
279
280 Player* player = GetPlayer();
281
282 if (!player->GetGuildId()) // Player must be in guild
283 return;
284
285 bool isGuildMaster = true;
286 if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId()))
287 if (guild->GetLeaderGUID() != player->GetGUID())
288 isGuildMaster = false;
289
290 LFGuildSettings settings = sGuildFinderMgr->GetGuildSettings(player->GetGuildId());
291
293 data.WriteBit(isGuildMaster); // Guessed
294
295 if (isGuildMaster)
296 {
297 data.WriteString(settings.GetComment());
298 data.WriteBit(settings.IsListed());
299 data.WriteBits(settings.GetComment().size(), 11);
300 data << uint32(settings.GetLevel());
301 data << uint32(0); // Unk Int32
302 data << uint32(settings.GetAvailability());
303 data << uint32(settings.GetClassRoles());
304 data << uint32(settings.GetInterests());
305 }
306 else
307 data.FlushBits();
308
309 player->SendDirectMessage(&data);
310}
311
313{
314 SF_LOG_DEBUG("network", "WORLD: Received CMSG_LF_GUILD_REMOVE_APPLICATION");
315
316 ObjectGuid guildGuid;
317
318 recvPacket.ReadGuidMask(guildGuid, 7, 5, 4, 1, 6, 3, 2, 0);
319 recvPacket.ReadGuidBytes(guildGuid, 6, 3, 7, 1, 2, 0, 5, 4);
320
321 if (!IS_GUILD_GUID(guildGuid))
322 return;
323
324 sGuildFinderMgr->RemoveMembershipRequest(GetPlayer()->GetGUIDLow(), GUID_LOPART(guildGuid));
325}
326
327// Sent any time a guild master sets an option in the interface and when listing / unlisting his guild
329{
330 SF_LOG_DEBUG("network", "WORLD: Received CMSG_LF_GUILD_SET_GUILD_POST");
331
332 uint32 classRoles = 0;
333 uint32 availability = 0;
334 uint32 guildInterests = 0;
335 uint32 level = 0;
336
337 recvPacket >> level >> availability >> classRoles >> guildInterests;
338 // Level sent is zero if untouched, force to any (from interface). Idk why
339 if (!level)
340 level = ANY_FINDER_LEVEL;
341
342 uint16 length = recvPacket.ReadBits(10);
343 bool listed = recvPacket.ReadBit();
344 std::string comment = recvPacket.ReadString(length);
345
346 if (!(classRoles & GUILDFINDER_ALL_ROLES) || classRoles > GUILDFINDER_ALL_ROLES)
347 return;
348 if (!(availability & AVAILABILITY_ALWAYS) || availability > AVAILABILITY_ALWAYS)
349 return;
350 if (!(guildInterests & ALL_INTERESTS) || guildInterests > ALL_INTERESTS)
351 return;
352 if (!(level & ALL_GUILDFINDER_LEVELS) || level > ALL_GUILDFINDER_LEVELS)
353 return;
354
355 Player* player = GetPlayer();
356
357 if (!player->GetGuildId()) // Player must be in guild
358 return;
359
360 if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId())) // Player must be guild master
361 if (guild->GetLeaderGUID() != player->GetGUID())
362 return;
363
364 LFGuildSettings settings(listed, player->GetTeamId(), player->GetGuildId(), classRoles, availability, guildInterests, level, comment);
365 sGuildFinderMgr->SetGuildSettings(player->GetGuildId(), settings);
366}
std::int32_t int32
Definition Define.h:73
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
std::uint64_t uint64
Definition Define.h:76
std::uint16_t uint16
Definition Define.h:78
@ ALL_INTERESTS
@ ALL_GUILDFINDER_LEVELS
@ ANY_FINDER_LEVEL
#define sGuildFinderMgr
std::map< uint32, LFGuildSettings > LFGuildStore
@ GUILDFINDER_ALL_ROLES
@ AVAILABILITY_ALWAYS
#define sGuildMgr
Definition GuildMgr.h:53
#define SF_LOG_DEBUG(filterType__,...)
Definition Log.h:134
uint32 GUID_LOPART(uint64 x)
@ HIGHGUID_PLAYER
uint64 MAKE_NEW_GUID(uint32 l, uint32 e, uint32 h)
bool IS_PLAYER_GUID(uint64 guid)
bool IS_GUILD_GUID(uint64 guid)
uint32 GetAchievementPoints() const
bool WriteBit(uint32 bit)
Definition ByteBuffer.h:164
void WriteString(std::string const &str)
Definition ByteBuffer.h:578
uint32 ReadBits(size_t bits)
Definition ByteBuffer.h:198
void ReadGuidBytes(ObjectGuid &guid, Offsets... offsets)
Definition ByteBuffer.h:256
void append(T value)
Definition ByteBuffer.h:147
std::string ReadString(size_t length)
Definition ByteBuffer.h:565
void ReadGuidMask(ObjectGuid &guid, Offsets... offsets)
Definition ByteBuffer.h:240
void WriteBits(T value, size_t bits)
Definition ByteBuffer.h:192
void WriteByteSeq(uint8 b)
Definition ByteBuffer.h:227
void FlushBits()
Definition ByteBuffer.h:154
bool ReadBit()
Definition ByteBuffer.h:180
uint32 GetStyle() const
Definition Guild.h:277
uint32 GetColor() const
Definition Guild.h:278
uint32 GetBackgroundColor() const
Definition Guild.h:281
uint32 GetBorderStyle() const
Definition Guild.h:279
uint32 GetBorderColor() const
Definition Guild.h:280
Definition Guild.h:324
uint32 GetMembersCount()
Definition Guild.h:844
uint8 GetLevel() const
Definition Guild.h:857
std::string const & GetName() const
Definition Guild.h:760
EmblemInfo const & GetEmblemInfo() const
Definition Guild.h:864
AchievementMgr< Guild > & GetAchievementMgr()
Definition Guild.h:853
uint64 GetGUID() const
Definition Guild.h:758
uint64 GetGUID() const
Definition Object.h:119
uint32 GetGUIDLow() const
Definition Object.h:120
uint32 GetGuildId() const
Definition Player.h:2291
void SendDirectMessage(WorldPacket *data)
Definition Player.cpp:6904
TeamId GetTeamId() const
Definition Player.h:2531
void HandleGuildFinderBrowse(WorldPacket &recvPacket)
void HandleGuildFinderDeclineRecruit(WorldPacket &recvPacket)
Player * GetPlayer() const
void HandleGuildFinderRemoveApplication(WorldPacket &recvPacket)
void HandleGuildFinderSetGuildPost(WorldPacket &recvPacket)
void HandleGuildFinderPostRequest(WorldPacket &recvPacket)
void HandleGuildFinderAddApplication(WorldPacket &recvPacket)
void HandleGuildFinderGetApplications(WorldPacket &recvPacket)
void HandleGuildFinderGetRecruits(WorldPacket &recvPacket)
@ SMSG_LF_GUILD_MEMBERSHIP_LIST_UPDATED
Definition Opcodes.h:754
@ SMSG_LF_GUILD_BROWSE_UPDATED
Definition Opcodes.h:753
@ SMSG_LF_GUILD_POST_UPDATED
Definition Opcodes.h:755
@ SMSG_LF_GUILD_RECRUIT_LIST_UPDATED
Definition Opcodes.h:756
#define sWorld
Definition World.h:910
@ CONFIG_MAX_PLAYER_LEVEL
Definition World.h:224
Holds all informations about a player's finder settings. NOT stored in database.
uint8 GetAvailability() const
std::string const & GetComment() const
uint8 GetClassRoles() const
uint8 GetLevel() const
uint8 GetInterests() const
Holds settings for a guild in the finder system. Saved to database.
bool IsListed() const
Holds all required informations about a membership request.
uint8 GetClassRoles() const
uint8 GetClass() const
time_t GetSubmitTime() const
uint8 GetInterests() const
uint32 GetPlayerGUID() const
std::string const & GetComment() const
time_t GetExpiryTime() const
uint8 GetAvailability() const
uint8 GetLevel() const
std::string const & GetName() const