Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
ChannelHandler.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 "ChannelMgr.h"
7#include "ObjectMgr.h" // for normalizePlayerName
8#include "Player.h"
9#include "WorldSession.h"
10
12{
13 uint32 channelId;
14 uint32 channelLength, passLength;
15 std::string channelName, password;
16
17 recvPacket >> channelId;
18
19 uint8 unknown1 = recvPacket.ReadBit(); // unknown bit
20 channelLength = recvPacket.ReadBits(7);
21 passLength = recvPacket.ReadBits(7);
22 uint8 unknown2 = recvPacket.ReadBit(); // unknown bit
23
24 password = recvPacket.ReadString(passLength);
25 channelName = recvPacket.ReadString(channelLength);
26
27 SF_LOG_DEBUG("chat.system", "CMSG_CHAT_JOIN_CHANNEL %s Channel: %u, unk1: %u, unk2: %u, channel: %s, password: %s",
28 GetPlayerInfo().c_str(), channelId, unknown1, unknown2, channelName.c_str(), password.c_str());
29
30 if (channelId)
31 {
32 ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(channelId);
33 if (!channel)
34 return;
35
36 AreaTableEntry const* zone = GetAreaEntryByAreaID(GetPlayer()->GetZoneId());
37 if (!zone || !GetPlayer()->CanJoinConstantChannelInZone(channel, zone))
38 return;
39 }
40
41 if (channelName.empty())
42 return;
43
44 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
45 {
46 cMgr->setTeam(GetPlayer()->GetTeam());
47 if (Channel* channel = cMgr->GetJoinChannel(channelName, channelId))
48 channel->JoinChannel(GetPlayer(), password);
49 }
50}
51
53{
54 uint32 unk;
55 std::string channelName;
56 recvPacket >> unk; // channel id?
57 uint32 length = recvPacket.ReadBits(7);
58 channelName = recvPacket.ReadString(length);
59
60 SF_LOG_DEBUG("chat.system", "CMSG_LEAVE_CHANNEL %s Channel: %s, unk1: %u",
61 GetPlayerInfo().c_str(), channelName.c_str(), unk);
62
63 if (channelName.empty())
64 return;
65
66 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
67 {
68 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
69 channel->LeaveChannel(GetPlayer(), true);
70 cMgr->LeftChannel(channelName);
71 }
72}
73
75{
76 uint32 length = recvPacket.ReadBits(7);
77 std::string channelName = recvPacket.ReadString(length);
78
79 SF_LOG_DEBUG("chat.system", "%s %s Channel: %s",
80 recvPacket.GetOpcode() == CMSG_CHANNEL_DISPLAY_LIST ? "CMSG_CHANNEL_DISPLAY_LIST" : "CMSG_CHANNEL_LIST",
81 GetPlayerInfo().c_str(), channelName.c_str());
82
83 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
84 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
85 channel->List(GetPlayer());
86}
87
89{
90 uint32 nameLength = recvPacket.ReadBits(8);
91 uint32 passLength = recvPacket.ReadBits(7);
92
93 std::string channelName = recvPacket.ReadString(nameLength);
94 std::string password = recvPacket.ReadString(passLength);
95
96 SF_LOG_DEBUG("chat.system", "CMSG_CHANNEL_PASSWORD %s Channel: %s, Password: %s",
97 GetPlayerInfo().c_str(), channelName.c_str(), password.c_str());
98
99 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
100 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
101 channel->Password(GetPlayer(), password);
102}
103
105{
106 uint32 nameLength = recvPacket.ReadBits(8) << 1;
107 nameLength += recvPacket.ReadBit();
108 uint32 channelLength = recvPacket.ReadBits(7);
109
110 std::string channelName = recvPacket.ReadString(channelLength);
111 std::string targetName = recvPacket.ReadString(nameLength);
112
113 SF_LOG_DEBUG("chat.system", "CMSG_CHANNEL_SET_OWNER %s Channel: %s, Target: %s",
114 GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str());
115
116 if (!normalizePlayerName(targetName))
117 return;
118
119 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
120 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
121 channel->SetOwner(GetPlayer(), targetName);
122}
123
125{
126 uint32 length = recvPacket.ReadBits(8);
127 std::string channelName = recvPacket.ReadString(length);
128
129 SF_LOG_DEBUG("chat.system", "CMSG_CHANNEL_OWNER %s Channel: %s",
130 GetPlayerInfo().c_str(), channelName.c_str());
131
132 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
133 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
134 channel->SendWhoOwner(GetPlayer()->GetGUID());
135}
136
138{
139 uint32 channelLength = recvPacket.ReadBits(8);
140 uint32 nameLength = recvPacket.ReadBits(7);
141
142 std::string targetName = recvPacket.ReadString(nameLength);
143 std::string channelName = recvPacket.ReadString(channelLength);
144
145 SF_LOG_DEBUG("chat.system", "CMSG_CHANNEL_MODERATOR %s Channel: %s, Target: %s",
146 GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str());
147
148 if (!normalizePlayerName(targetName))
149 return;
150
151 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
152 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
153 channel->SetModerator(GetPlayer(), targetName);
154}
155
157{
158 uint32 nameLength = recvPacket.ReadBits(7);
159 uint32 channelLength = recvPacket.ReadBits(8);
160
161 std::string channelName = recvPacket.ReadString(channelLength);
162 std::string targetName = recvPacket.ReadString(nameLength);
163
164 SF_LOG_DEBUG("chat.system", "CMSG_CHANNEL_UNMODERATOR %s Channel: %s, Target: %s",
165 GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str());
166
167 if (!normalizePlayerName(targetName))
168 return;
169
170 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
171 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
172 channel->UnsetModerator(GetPlayer(), targetName);
173}
174
176{
177 uint32 channelLength = recvPacket.ReadBits(8);
178 uint32 nameLength = recvPacket.ReadBits(7);
179
180 std::string channelName = recvPacket.ReadString(channelLength);
181 std::string targetName = recvPacket.ReadString(nameLength);
182
183 SF_LOG_DEBUG("chat.system", "CMSG_CHANNEL_MUTE %s Channel: %s, Target: %s",
184 GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str());
185
186 if (!normalizePlayerName(targetName))
187 return;
188
189 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
190 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
191 channel->SetMute(GetPlayer(), targetName);
192}
193
195{
196 uint32 nameLength = recvPacket.ReadBits(8);
197 uint32 channelLength = recvPacket.ReadBits(7);
198
199 std::string targetName = recvPacket.ReadString(nameLength);
200 std::string channelName = recvPacket.ReadString(channelLength);
201
202 SF_LOG_DEBUG("chat.system", "CMSG_CHANNEL_UNMUTE %s Channel: %s, Target: %s",
203 GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str());
204
205 if (!normalizePlayerName(targetName))
206 return;
207
208 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
209 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
210 channel->UnsetMute(GetPlayer(), targetName);
211}
212
214{
215 uint32 nameLength = recvPacket.ReadBits(7);
216 uint32 channelLength = recvPacket.ReadBits(8);
217
218 std::string targetName = recvPacket.ReadString(nameLength);
219 std::string channelName = recvPacket.ReadString(channelLength);
220
221 SF_LOG_DEBUG("chat.system", "CMSG_CHANNEL_INVITE %s Channel: %s, Target: %s",
222 GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str());
223
224 if (!normalizePlayerName(targetName))
225 return;
226
227 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
228 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
229 channel->Invite(GetPlayer(), targetName);
230}
231
233{
234 uint32 channelLength = recvPacket.ReadBits(8);
235 uint32 nameLength = recvPacket.ReadBits(7);
236
237 std::string channelName = recvPacket.ReadString(channelLength);
238 std::string targetName = recvPacket.ReadString(nameLength);
239
240 SF_LOG_DEBUG("chat.system", "CMSG_CHANNEL_KICK %s Channel: %s, Target: %s",
241 GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str());
242
243 if (!normalizePlayerName(targetName))
244 return;
245
246 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
247 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
248 channel->Kick(GetPlayer(), targetName);
249}
250
252{
253 uint32 channelLength, nameLength;
254 std::string channelName, targetName;
255
256 channelLength = recvPacket.ReadBits(8);
257 nameLength = recvPacket.ReadBits(7);
258
259 targetName = recvPacket.ReadString(nameLength);
260 channelName = recvPacket.ReadString(channelLength);
261
262 SF_LOG_DEBUG("chat.system", "CMSG_CHANNEL_BAN %s Channel: %s, Target: %s",
263 GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str());
264
265 if (!normalizePlayerName(targetName))
266 return;
267
268 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
269 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
270 channel->Ban(GetPlayer(), targetName);
271}
272
274{
275 uint32 channelLength = recvPacket.ReadBits(7);
276 uint32 nameLength = recvPacket.ReadBits(8);
277
278 std::string targetName = recvPacket.ReadString(nameLength);
279 std::string channelName = recvPacket.ReadString(channelLength);
280
281 SF_LOG_DEBUG("chat.system", "CMSG_CHANNEL_UNBAN %s Channel: %s, Target: %s",
282 GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str());
283
284 if (!normalizePlayerName(targetName))
285 return;
286
287 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
288 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
289 channel->UnBan(GetPlayer(), targetName);
290}
291
293{
294 uint32 length = recvPacket.ReadBits(8);
295 std::string channelName = recvPacket.ReadString(length);
296
297 SF_LOG_DEBUG("chat.system", "CMSG_CHANNEL_ANNOUNCEMENTS %s Channel: %s",
298 GetPlayerInfo().c_str(), channelName.c_str());
299
300 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
301 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
302 channel->Announce(GetPlayer());
303}
304
306{
307 // this should be OK because the 2 function _were_ the same
308 HandleChannelList(recvPacket);
309}
310
312{
313 std::string channelName;
314 recvPacket >> channelName;
315
316 SF_LOG_DEBUG("chat.system", "CMSG_GET_CHANNEL_MEMBER_COUNT %s Channel: %s",
317 GetPlayerInfo().c_str(), channelName.c_str());
318
319 if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
320 {
321 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
322 {
323 SF_LOG_DEBUG("chat.system", "SMSG_CHANNEL_MEMBER_COUNT %s Channel: %s Count: %u",
324 GetPlayerInfo().c_str(), channelName.c_str(), channel->GetNumPlayers());
325
326 WorldPacket data(SMSG_CHANNEL_MEMBER_COUNT, channel->GetName().size() + 1 + 4);
327 data << channel->GetName();
328 data << uint8(channel->GetFlags());
329 data << uint32(channel->GetNumPlayers());
330 SendPacket(&data);
331 }
332 }
333}
334
335/*
336void WorldSession::HandleSetChannelWatch(WorldPacket& recvPacket)
337{
338 std::string channelName;
339 recvPacket >> channelName;
340
341 SF_LOG_DEBUG("chat.system", "CMSG_SET_CHANNEL_WATCH %s Channel: %s",
342 GetPlayerInfo().c_str(), channelName.c_str());
343
344
345 if (ChannelMgr* cMgr = channelMgr(GetPlayer()->GetTeam()))
346 if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
347 channel->JoinNotify(GetPlayer());
348
349}
350*/
DBCStorage< ChatChannelsEntry > sChatChannelsStore(ChatChannelsEntryfmt)
AreaTableEntry const * GetAreaEntryByAreaID(uint32 area_id)
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define SF_LOG_DEBUG(filterType__,...)
Definition Log.h:134
bool normalizePlayerName(std::string &name)
uint32 ReadBits(size_t bits)
Definition ByteBuffer.h:198
std::string ReadString(size_t length)
Definition ByteBuffer.h:565
bool ReadBit()
Definition ByteBuffer.h:180
static ChannelMgr * forTeam(uint32 team)
Opcodes GetOpcode() const
Definition WorldPacket.h:38
void HandleGetChannelMemberCount(WorldPacket &recvPacket)
void HandleChannelInvite(WorldPacket &recvPacket)
void HandleChannelList(WorldPacket &recvPacket)
void HandleChannelPassword(WorldPacket &recvPacket)
std::string GetPlayerInfo() const
Player * GetPlayer() const
void HandleJoinChannel(WorldPacket &recvPacket)
void HandleChannelUnban(WorldPacket &recvPacket)
void HandleChannelMute(WorldPacket &recvPacket)
void HandleChannelUnmute(WorldPacket &recvPacket)
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
void HandleChannelBan(WorldPacket &recvPacket)
void HandleChannelUnmoderator(WorldPacket &recvPacket)
void HandleChannelModerator(WorldPacket &recvPacket)
void HandleLeaveChannel(WorldPacket &recvPacket)
void HandleChannelSetOwner(WorldPacket &recvPacket)
void HandleChannelOwner(WorldPacket &recvPacket)
void HandleChannelAnnouncements(WorldPacket &recvPacket)
void HandleChannelKick(WorldPacket &recvPacket)
void HandleChannelDisplayListQuery(WorldPacket &recvPacket)
@ CMSG_CHANNEL_DISPLAY_LIST
Definition Opcodes.h:113
@ SMSG_CHANNEL_MEMBER_COUNT
Definition Opcodes.h:601