Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
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
11
void
WorldSession::HandleJoinChannel
(
WorldPacket
& recvPacket)
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
52
void
WorldSession::HandleLeaveChannel
(
WorldPacket
& recvPacket)
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
74
void
WorldSession::HandleChannelList
(
WorldPacket
& recvPacket)
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
88
void
WorldSession::HandleChannelPassword
(
WorldPacket
& recvPacket)
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
104
void
WorldSession::HandleChannelSetOwner
(
WorldPacket
& recvPacket)
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
124
void
WorldSession::HandleChannelOwner
(
WorldPacket
& recvPacket)
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
137
void
WorldSession::HandleChannelModerator
(
WorldPacket
& recvPacket)
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
156
void
WorldSession::HandleChannelUnmoderator
(
WorldPacket
& recvPacket)
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
175
void
WorldSession::HandleChannelMute
(
WorldPacket
& recvPacket)
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
194
void
WorldSession::HandleChannelUnmute
(
WorldPacket
& recvPacket)
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
213
void
WorldSession::HandleChannelInvite
(
WorldPacket
& recvPacket)
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
232
void
WorldSession::HandleChannelKick
(
WorldPacket
& recvPacket)
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
251
void
WorldSession::HandleChannelBan
(
WorldPacket
& recvPacket)
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
273
void
WorldSession::HandleChannelUnban
(
WorldPacket
& recvPacket)
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
292
void
WorldSession::HandleChannelAnnouncements
(
WorldPacket
& recvPacket)
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
305
void
WorldSession::HandleChannelDisplayListQuery
(
WorldPacket
& recvPacket)
306
{
307
// this should be OK because the 2 function _were_ the same
308
HandleChannelList
(recvPacket);
309
}
310
311
void
WorldSession::HandleGetChannelMemberCount
(
WorldPacket
& recvPacket)
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
/*
336
void 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
*/
ChannelMgr.h
sChatChannelsStore
DBCStorage< ChatChannelsEntry > sChatChannelsStore(ChatChannelsEntryfmt)
GetAreaEntryByAreaID
AreaTableEntry const * GetAreaEntryByAreaID(uint32 area_id)
Definition
DBCStores.cpp:993
uint8
std::uint8_t uint8
Definition
Define.h:79
uint32
std::uint32_t uint32
Definition
Define.h:77
SF_LOG_DEBUG
#define SF_LOG_DEBUG(filterType__,...)
Definition
Log.h:134
normalizePlayerName
bool normalizePlayerName(std::string &name)
Definition
ObjectMgr.cpp:165
ObjectMgr.h
Player.h
WorldSession.h
ByteBuffer::ReadBits
uint32 ReadBits(size_t bits)
Definition
ByteBuffer.h:198
ByteBuffer::ReadString
std::string ReadString(size_t length)
Definition
ByteBuffer.h:565
ByteBuffer::ReadBit
bool ReadBit()
Definition
ByteBuffer.h:180
Channel
Definition
Channel.h:107
ChannelMgr
Definition
ChannelMgr.h:19
ChannelMgr::forTeam
static ChannelMgr * forTeam(uint32 team)
Definition
ChannelMgr.cpp:17
WorldPacket
Definition
WorldPacket.h:16
WorldPacket::GetOpcode
Opcodes GetOpcode() const
Definition
WorldPacket.h:38
WorldSession::HandleGetChannelMemberCount
void HandleGetChannelMemberCount(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:311
WorldSession::HandleChannelInvite
void HandleChannelInvite(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:213
WorldSession::HandleChannelList
void HandleChannelList(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:74
WorldSession::HandleChannelPassword
void HandleChannelPassword(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:88
WorldSession::GetPlayerInfo
std::string GetPlayerInfo() const
Definition
WorldSession.cpp:178
WorldSession::GetPlayer
Player * GetPlayer() const
Definition
WorldSession.h:295
WorldSession::HandleJoinChannel
void HandleJoinChannel(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:11
WorldSession::HandleChannelUnban
void HandleChannelUnban(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:273
WorldSession::HandleChannelMute
void HandleChannelMute(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:175
WorldSession::HandleChannelUnmute
void HandleChannelUnmute(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:194
WorldSession::SendPacket
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
Definition
WorldSession.cpp:196
WorldSession::HandleChannelBan
void HandleChannelBan(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:251
WorldSession::HandleChannelUnmoderator
void HandleChannelUnmoderator(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:156
WorldSession::HandleChannelModerator
void HandleChannelModerator(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:137
WorldSession::HandleLeaveChannel
void HandleLeaveChannel(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:52
WorldSession::HandleChannelSetOwner
void HandleChannelSetOwner(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:104
WorldSession::HandleChannelOwner
void HandleChannelOwner(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:124
WorldSession::HandleChannelAnnouncements
void HandleChannelAnnouncements(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:292
WorldSession::HandleChannelKick
void HandleChannelKick(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:232
WorldSession::HandleChannelDisplayListQuery
void HandleChannelDisplayListQuery(WorldPacket &recvPacket)
Definition
ChannelHandler.cpp:305
CMSG_CHANNEL_DISPLAY_LIST
@ CMSG_CHANNEL_DISPLAY_LIST
Definition
Opcodes.h:113
SMSG_CHANNEL_MEMBER_COUNT
@ SMSG_CHANNEL_MEMBER_COUNT
Definition
Opcodes.h:601
AreaTableEntry
Definition
DBCStructure.h:650
ChatChannelsEntry
Definition
DBCStructure.h:823
src
server
game
Handlers
ChannelHandler.cpp
Generated on
for Project SkyFire Core by
1.17.0