Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
Channel.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 "AccountMgr.h"
7#include "Channel.h"
8#include "Chat.h"
9#include "DatabaseEnv.h"
10#include "ObjectMgr.h"
11#include "Player.h"
12#include "SocialMgr.h"
13#include "World.h"
14
15Channel::Channel(std::string const& name, uint32 channelId, uint32 team) :
16 _announce(true),
17 _ownership(true),
18 _IsSaved(false),
19 _flags(0),
20 _channelId(channelId),
21 _Team(team),
22 _ownerGUID(0),
23 _name(name),
24 _password("")
25{
26 // set special flags if built-in channel
27 if (ChatChannelsEntry const* ch = sChatChannelsStore.LookupEntry(channelId)) // check whether it's a built-in channel
28 {
29 _announce = false; // no join/leave announces
30 _ownership = false; // no ownership handout
31
32 _flags |= CHANNEL_FLAG_GENERAL; // for all built-in channels
33
34 if (ch->flags & CHANNEL_DBC_FLAG_TRADE) // for trade channel
35 _flags |= CHANNEL_FLAG_TRADE;
36
37 if (ch->flags & CHANNEL_DBC_FLAG_CITY_ONLY2) // for city only channels
38 _flags |= CHANNEL_FLAG_CITY;
39
40 if (ch->flags & CHANNEL_DBC_FLAG_LFG) // for LFG channel
41 _flags |= CHANNEL_FLAG_LFG;
42 else // for all other channels
43 _flags |= CHANNEL_FLAG_NOT_LFG;
44 }
45 else // it's custom channel
46 {
47 _flags |= CHANNEL_FLAG_CUSTOM;
48
49 // If storing custom channels in the db is enabled either load or save the channel
50 if (sWorld->GetBoolConfig(WorldBoolConfigs::CONFIG_PRESERVE_CUSTOM_CHANNELS))
51 {
52 PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHANNEL);
53 stmt->setString(0, name);
54 stmt->setUInt32(1, _Team);
55 PreparedQueryResult result = CharacterDatabase.Query(stmt);
56
57 if (result) //load
58 {
59 Field* fields = result->Fetch();
60 _announce = fields[0].GetBool();
61 _ownership = fields[1].GetBool();
62 _password = fields[2].GetString();
63 const char* db_BannedList = fields[3].GetCString();
64
65 if (db_BannedList)
66 {
67 Tokenizer tokens(db_BannedList, ' ');
68 for (Tokenizer::const_iterator i = tokens.begin(); i != tokens.end(); ++i)
69 {
70 uint64 banned_guid = atol(*i);
71 if (banned_guid)
72 {
73 SF_LOG_DEBUG("chat.system", "Channel(%s) loaded bannedStore guid:" UI64FMTD "", name.c_str(), banned_guid);
74 bannedStore.insert(banned_guid);
75 }
76 }
77 }
78 }
79 else // save
80 {
81 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHANNEL);
82 stmt->setString(0, name);
83 stmt->setUInt32(1, _Team);
84 CharacterDatabase.Execute(stmt);
85 SF_LOG_DEBUG("chat.system", "Channel(%s) saved in database", name.c_str());
86 }
87
88 _IsSaved = true;
89 }
90 }
91}
92
94{
95 if (_IsSaved)
96 {
97 std::ostringstream banlist;
98 BannedContainer::const_iterator iter;
99 for (iter = bannedStore.begin(); iter != bannedStore.end(); ++iter)
100 banlist << (*iter) << ' ';
101
102 std::string banListStr = banlist.str();
103
104 PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHANNEL);
105 stmt->setBool(0, _announce);
106 stmt->setBool(1, _ownership);
107 stmt->setString(2, _password);
108 stmt->setString(3, banListStr);
109 stmt->setString(4, _name);
110 stmt->setUInt32(5, _Team);
111 CharacterDatabase.Execute(stmt);
112
113 SF_LOG_DEBUG("chat.system", "Channel(%s) updated in database", _name.c_str());
114 }
115}
116
118{
119 PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHANNEL_USAGE);
120 stmt->setString(0, _name);
121 stmt->setUInt32(1, _Team);
122 CharacterDatabase.Execute(stmt);
123}
124
126{
128 {
129 PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_OLD_CHANNELS);
131 CharacterDatabase.Execute(stmt);
132
133 SF_LOG_DEBUG("chat.system", "Cleaned out unused custom chat channels.");
134 }
135}
136
137void Channel::JoinChannel(Player* player, std::string const& pass)
138{
139 uint64 guid = player->GetGUID();
140 if (IsOn(guid))
141 {
142 // Do not send error message for built-in channels
143 if (!IsConstant())
144 {
145 WorldPacket data;
146 MakePlayerAlreadyMember(&data, guid);
147 SendToOne(&data, guid);
148 }
149 return;
150 }
151
152 if (IsBanned(guid))
153 {
154 WorldPacket data;
155 MakeBanned(&data);
156 SendToOne(&data, guid);
157 return;
158 }
159
160 if (!_password.empty() && pass != _password)
161 {
162 WorldPacket data;
163 MakeWrongPassword(&data);
164 SendToOne(&data, guid);
165 return;
166 }
167
170 AccountMgr::IsPlayerAccount(player->GetSession()->GetSecurity()) && //FIXME: Move to RBAC
171 player->GetGroup())
172 {
173 WorldPacket data;
174 MakeNotInLfg(&data);
175 SendToOne(&data, guid);
176 return;
177 }
178
179 player->JoinedChannel(this);
180
182 {
183 WorldPacket data;
184 MakeJoined(&data, guid);
185 SendToAll(&data);
186 }
187
188 PlayerInfo pinfo;
189 pinfo.player = guid;
190 pinfo.flags = MEMBER_FLAG_NONE;
191 playersStore[guid] = pinfo;
192
193 WorldPacket data;
194 MakeYouJoined(&data);
195 SendToOne(&data, guid);
196
198
199 // Custom channel handling
200 if (!IsConstant())
201 {
202 // Update last_used timestamp in db
203 if (!playersStore.empty())
205
206 // If the channel has no owner yet and ownership is allowed, set the new owner.
207 if (!_ownerGUID && _ownership)
208 {
209 SetOwner(guid, playersStore.size() > 1);
210 playersStore[guid].SetModerator(true);
211 }
212 }
213}
214
215void Channel::LeaveChannel(Player* player, bool send)
216{
217 uint64 guid = player->GetGUID();
218 if (!IsOn(guid))
219 {
220 if (send)
221 {
222 WorldPacket data;
223 MakeNotMember(&data);
224 SendToOne(&data, guid);
225 }
226 return;
227 }
228
229 if (send)
230 {
231 WorldPacket data;
232 MakeYouLeft(&data);
233 SendToOne(&data, guid);
234 player->LeftChannel(this);
235 data.clear();
236 }
237
238 bool changeowner = playersStore[guid].IsOwner();
239
240 playersStore.erase(guid);
241
243 {
244 WorldPacket data;
245 MakeLeft(&data, guid);
246 SendToAll(&data);
247 }
248
250
251 if (!IsConstant())
252 {
253 // Update last_used timestamp in db
255
256 // If the channel owner left and there are still playersStore inside, pick a new owner
257 if (changeowner && _ownership && !playersStore.empty())
258 {
259 uint64 newowner = playersStore.begin()->second.player;
260 playersStore[newowner].SetModerator(true);
261 SetOwner(newowner);
262 }
263 }
264}
265
266void Channel::KickOrBan(Player const* player, std::string const& badname, bool ban)
267{
268 uint64 good = player->GetGUID();
269
270 if (!IsOn(good))
271 {
272 WorldPacket data;
273 MakeNotMember(&data);
274 SendToOne(&data, good);
275 return;
276 }
277
279 {
280 WorldPacket data;
281 MakeNotModerator(&data);
282 SendToOne(&data, good);
283 return;
284 }
285
286 Player* bad = sObjectAccessor->FindPlayerByName(badname);
287 uint64 victim = bad ? bad->GetGUID() : 0;
288 if (!victim || !IsOn(victim))
289 {
290 WorldPacket data;
291 MakePlayerNotFound(&data, badname);
292 SendToOne(&data, good);
293 return;
294 }
295
296 bool changeowner = _ownerGUID == victim;
297
298 if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR) && changeowner && good != _ownerGUID)
299 {
300 WorldPacket data;
301 MakeNotOwner(&data);
302 SendToOne(&data, good);
303 return;
304 }
305
306 if (ban && !IsBanned(victim))
307 {
308 bannedStore.insert(victim);
310
312 {
313 WorldPacket data;
314 MakePlayerBanned(&data, victim, good);
315 SendToAll(&data);
316 }
317 }
319 {
320 WorldPacket data;
321 MakePlayerKicked(&data, victim, good);
322 SendToAll(&data);
323 }
324
325 playersStore.erase(victim);
326 bad->LeftChannel(this);
327
328 if (changeowner && _ownership && !playersStore.empty())
329 {
330 uint64 newowner = good;
331 playersStore[newowner].SetModerator(true);
332 SetOwner(newowner);
333 }
334}
335
336void Channel::UnBan(Player const* player, std::string const& badname)
337{
338 uint64 good = player->GetGUID();
339
340 if (!IsOn(good))
341 {
342 WorldPacket data;
343 MakeNotMember(&data);
344 SendToOne(&data, good);
345 return;
346 }
347
349 {
350 WorldPacket data;
351 MakeNotModerator(&data);
352 SendToOne(&data, good);
353 return;
354 }
355
356 Player* bad = sObjectAccessor->FindPlayerByName(badname);
357 uint64 victim = bad ? bad->GetGUID() : 0;
358
359 if (!victim || !IsBanned(victim))
360 {
361 WorldPacket data;
362 MakePlayerNotFound(&data, badname);
363 SendToOne(&data, good);
364 return;
365 }
366
367 bannedStore.erase(victim);
368
369 WorldPacket data;
370 MakePlayerUnbanned(&data, victim, good);
371 SendToAll(&data);
372
374}
375
376void Channel::Password(Player const* player, std::string const& pass)
377{
378 uint64 guid = player->GetGUID();
379
380 ChatHandler chat(player->GetSession());
381 if (!IsOn(guid))
382 {
383 WorldPacket data;
384 MakeNotMember(&data);
385 SendToOne(&data, guid);
386 return;
387 }
388
390 {
391 WorldPacket data;
392 MakeNotModerator(&data);
393 SendToOne(&data, guid);
394 return;
395 }
396
397 _password = pass;
398
399 WorldPacket data;
400 MakePasswordChanged(&data, guid);
401 SendToAll(&data);
402
404}
405
406void Channel::SetMode(Player const* player, std::string const& p2n, bool mod, bool set)
407{
408 uint64 guid = player->GetGUID();
409
410 if (!IsOn(guid))
411 {
412 WorldPacket data;
413 MakeNotMember(&data);
414 SendToOne(&data, guid);
415 return;
416 }
417
419 {
420 WorldPacket data;
421 MakeNotModerator(&data);
422 SendToOne(&data, guid);
423 return;
424 }
425
426 if (guid == _ownerGUID && std::string(p2n) == player->GetName() && mod)
427 return;
428
429 Player* newp = sObjectAccessor->FindPlayerByName(p2n);
430 uint64 victim = newp ? newp->GetGUID() : 0;
431
432 if (!victim || !IsOn(victim) ||
433 (player->GetTeam() != newp->GetTeam() &&
436 {
437 WorldPacket data;
438 MakePlayerNotFound(&data, p2n);
439 SendToOne(&data, guid);
440 return;
441 }
442
443 if (_ownerGUID == victim && _ownerGUID != guid)
444 {
445 WorldPacket data;
446 MakeNotOwner(&data);
447 SendToOne(&data, guid);
448 return;
449 }
450
451 if (mod)
452 SetModerator(newp->GetGUID(), set);
453 else
454 SetMute(newp->GetGUID(), set);
455}
456
457void Channel::SetOwner(Player const* player, std::string const& newname)
458{
459 uint64 guid = player->GetGUID();
460
461 if (!IsOn(guid))
462 {
463 WorldPacket data;
464 MakeNotMember(&data);
465 SendToOne(&data, guid);
466 return;
467 }
468
470 {
471 WorldPacket data;
472 MakeNotOwner(&data);
473 SendToOne(&data, guid);
474 return;
475 }
476
477 Player* newp = sObjectAccessor->FindPlayerByName(newname);
478 uint64 victim = newp ? newp->GetGUID() : 0;
479
480 if (!victim || !IsOn(victim) ||
481 (player->GetTeam() != newp->GetTeam() &&
484 {
485 WorldPacket data;
486 MakePlayerNotFound(&data, newname);
487 SendToOne(&data, guid);
488 return;
489 }
490
491 playersStore[victim].SetModerator(true);
492 SetOwner(victim);
493}
494
496{
497 WorldPacket data;
498 if (IsOn(guid))
499 MakeChannelOwner(&data);
500 else
501 MakeNotMember(&data);
502 SendToOne(&data, guid);
503}
504
505void Channel::List(Player const* player)
506{
507 uint64 guid = player->GetGUID();
508
509 if (!IsOn(guid))
510 {
511 WorldPacket data;
512 MakeNotMember(&data);
513 SendToOne(&data, guid);
514 return;
515 }
516
517 SF_LOG_DEBUG("chat.system", "SMSG_CHANNEL_LIST %s Channel: %s",
518 player->GetSession()->GetPlayerInfo().c_str(), GetName().c_str());
519
520 WorldPacket data(SMSG_CHANNEL_LIST, 1 + (GetName().size() + 1) + 1 + 4 + playersStore.size() * (8 + 1));
521 data << uint8(1); // channel type?
522 data << GetName(); // channel name
523 data << uint8(GetFlags()); // channel flags?
524
525 size_t pos = data.wpos();
526 data << uint32(0); // size of list, placeholder
527
528 uint32 gmLevelInWhoList = sWorld->getIntConfig(WorldIntConfigs::CONFIG_GM_LEVEL_IN_WHO_LIST);
529
530 uint32 count = 0;
531 for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i)
532 {
533 Player* member = ObjectAccessor::FindPlayer(i->first);
534
535 // PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters
536 // MODERATOR, GAME MASTER, ADMINISTRATOR can see all
537 if (member &&
539 member->GetSession()->GetSecurity() <= AccountTypes(gmLevelInWhoList)) &&
540 member->IsVisibleGloballyFor(player))
541 {
542 data << uint64(i->first);
543 data << uint8(i->second.flags); // flags seems to be changed...
544 ++count;
545 }
546 }
547
548 data.put<uint32>(pos, count);
549
550 SendToOne(&data, guid);
551}
552
553void Channel::Announce(Player const* player)
554{
555 uint64 guid = player->GetGUID();
556
557 if (!IsOn(guid))
558 {
559 WorldPacket data;
560 MakeNotMember(&data);
561 SendToOne(&data, guid);
562 return;
563 }
564
566 {
567 WorldPacket data;
568 MakeNotModerator(&data);
569 SendToOne(&data, guid);
570 return;
571 }
572
574
575 WorldPacket data;
576 if (_announce)
577 MakeAnnouncementsOn(&data, guid);
578 else
579 MakeAnnouncementsOff(&data, guid);
580 SendToAll(&data);
581
583}
584
585void Channel::Say(uint64 guid, std::string const& what, Language lang)
586{
587 if (what.empty())
588 return;
589
590 uint8 chatTag = 0;
591 bool isGM = false;
592
593 if (Player* player = ObjectAccessor::FindPlayer(guid))
594 {
595 chatTag = player->GetChatTag();
596 isGM = player->GetSession()->HasPermission(rbac::RBAC_PERM_COMMAND_GM_CHAT);
597 }
598
599 // TODO: Add proper RBAC check
602
603 if (!IsOn(guid))
604 {
605 WorldPacket data;
606 MakeNotMember(&data);
607 SendToOne(&data, guid);
608 return;
609 }
610
611 if (playersStore[guid].IsMuted())
612 {
613 WorldPacket data;
614 MakeMuted(&data);
615 SendToOne(&data, guid);
616 return;
617 }
618
619 WorldPacket data;
620 ChatHandler::BuildChatPacket(data, ChatMsg::CHAT_MSG_CHANNEL, lang, guid, guid, what, chatTag, "", "", 0, isGM, _name);
621
622 SendToAll(&data, !playersStore[guid].IsModerator() ? guid : false);
623}
624
625void Channel::Invite(Player const* player, std::string const& newname)
626{
627 uint64 guid = player->GetGUID();
628
629 if (!IsOn(guid))
630 {
631 WorldPacket data;
632 MakeNotMember(&data);
633 SendToOne(&data, guid);
634 return;
635 }
636
637 Player* newp = sObjectAccessor->FindPlayerByName(newname);
638 if (!newp || !newp->isGMVisible())
639 {
640 WorldPacket data;
641 MakePlayerNotFound(&data, newname);
642 SendToOne(&data, guid);
643 return;
644 }
645
646 if (IsBanned(newp->GetGUID()))
647 {
648 WorldPacket data;
649 MakePlayerInviteBanned(&data, newname);
650 SendToOne(&data, guid);
651 return;
652 }
653
654 if (newp->GetTeam() != player->GetTeam() &&
657 {
658 WorldPacket data;
660 SendToOne(&data, guid);
661 return;
662 }
663
664 if (IsOn(newp->GetGUID()))
665 {
666 WorldPacket data;
667 MakePlayerAlreadyMember(&data, newp->GetGUID());
668 SendToOne(&data, guid);
669 return;
670 }
671
672 if (!newp->GetSocial()->HasIgnore(GUID_LOPART(guid)))
673 {
674 WorldPacket data;
675 MakeInvite(&data, guid);
676 SendToOne(&data, newp->GetGUID());
677 data.clear();
678 }
679
680 WorldPacket data;
681 MakePlayerInvited(&data, newp->GetName());
682 SendToOne(&data, guid);
683}
684
685void Channel::SetOwner(uint64 guid, bool exclaim)
686{
687 if (_ownerGUID)
688 {
689 // [] will re-add player after it possible removed
690 PlayerContainer::iterator p_itr = playersStore.find(_ownerGUID);
691 if (p_itr != playersStore.end())
692 p_itr->second.SetOwner(false);
693 }
694
695 _ownerGUID = guid;
696 if (_ownerGUID)
697 {
699 playersStore[_ownerGUID].SetModerator(true);
700 playersStore[_ownerGUID].SetOwner(true);
701 if (exclaim)
702 {
703 WorldPacket data;
704 MakeModeChange(&data, _ownerGUID, oldFlag);
705 SendToAll(&data);
706
708 SendToAll(&data);
709 }
710
712 }
713}
714
716{
717 for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i)
718 if (Player* player = ObjectAccessor::FindPlayer(i->first))
719 if (!guid || !player->GetSocial()->HasIgnore(GUID_LOPART(guid)))
720 player->GetSession()->SendPacket(data);
721}
722
724{
725 for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i)
726 if (i->first != who)
727 if (Player* player = ObjectAccessor::FindPlayer(i->first))
728 player->GetSession()->SendPacket(data);
729}
730
732{
733 if (Player* player = ObjectAccessor::FindPlayer(who))
734 player->GetSession()->SendPacket(data);
735}
736
737void Channel::Voice(uint64 /*guid1*/, uint64 /*guid2*/) { }
738
739void Channel::DeVoice(uint64 /*guid1*/, uint64 /*guid2*/) { }
740
742{
743 data->Initialize(SMSG_CHANNEL_NOTIFY, 1 + _name.size());
744 *data << uint8(notify_type);
745 *data << _name;
746}
747
749{
751 *data << uint64(guid);
752}
753
755{
757 *data << uint64(guid);
758}
759
761{
763 *data << uint8(GetFlags());
764 *data << uint32(GetChannelId());
765 *data << uint32(0);
766}
767
769{
771 *data << uint32(GetChannelId());
772 *data << uint8(IsConstant());
773}
774
779
784
789
791{
793 *data << uint64(guid);
794}
795
797{
799 *data << uint64(guid);
800}
801
802void Channel::MakePlayerNotFound(WorldPacket* data, std::string const& name)
803{
805 *data << name;
806}
807
812
814{
815 std::string name = "";
816
817 if (!sObjectMgr->GetPlayerNameByGUID(_ownerGUID, name) || name.empty())
818 name = "PLAYER_NOT_FOUND";
819
821 *data << ((IsConstant() || !_ownerGUID) ? "Nobody" : name);
822}
823
825{
827 *data << uint64(guid);
828 *data << uint8(oldflags);
829 *data << uint8(GetPlayerFlags(guid));
830}
831
833{
835 *data << uint64(guid);
836}
837
843
848
850{
852 *data << uint64(bad);
853 *data << uint64(good);
854}
855
860
862{
864 *data << uint64(bad);
865 *data << uint64(good);
866}
867
869{
871 *data << uint64(bad);
872 *data << uint64(good);
873}
874
875void Channel::MakePlayerNotBanned(WorldPacket* data, const std::string& name)
876{
878 *data << name;
879}
880
886
888{
890 *data << uint64(guid);
891}
892
897
902
907
912
913void Channel::MakePlayerInvited(WorldPacket* data, const std::string& name)
914{
916 *data << name;
917}
918
919void Channel::MakePlayerInviteBanned(WorldPacket* data, const std::string& name)
920{
922 *data << name;
923}
924
929
934
939
941{
943 *data << uint64(guid);
944}
945
947{
949 *data << uint64(guid);
950}
951
952void Channel::JoinNotify(ObjectGuid UserGUID, uint32 ChannelID, uint8 ChannelFlags, uint8 UserFlags, std::string const& ChannelName)
953{
954 WorldPacket data(IsConstant() ? SMSG_USERLIST_ADD : SMSG_USERLIST_UPDATE, 8 + 1 + 1 + 4 + ChannelName.size());
955 if (IsConstant())
956 {
957 data << uint32(ChannelID);
958 data << uint8(ChannelFlags);
959 data << uint8(UserFlags);
960 data.WriteGuidMask(UserGUID, 7);
961 data.WriteBits(ChannelName.size(), 7);
962 data.WriteGuidMask(UserGUID, 0, 5, 4, 6, 1, 3, 2);
963 data.FlushBits();
964 data.WriteGuidBytes(UserGUID, 4, 5, 7, 1, 2, 3, 6, 0);
965 data << ChannelName;
966 SendToAllButOne(&data, UserGUID);
967 }
968 else
969 {
970 data.WriteGuidMask(UserGUID, 2, 6, 3, 7, 5, 1, 0);
971 data.WriteBits(ChannelName.size(), 7);
972 data.WriteGuidMask(UserGUID, 4);
973 data.FlushBits();
974 data.WriteGuidBytes(UserGUID, 0, 2, 6, 5);
975 data << uint8(ChannelFlags);
976 data.WriteGuidBytes(UserGUID, 7, 3);
977 data << uint32(ChannelID);
978 data << GetName();
979 data.WriteGuidBytes(UserGUID, 1, 4);
980 data << uint8(UserFlags);
981 SendToAll(&data);
982 }
983}
984
985void Channel::LeaveNotify(ObjectGuid UserGUID, uint32 ChannelID, uint8 ChannelFlags, std::string const& ChannelName)
986{
987 WorldPacket data(SMSG_USERLIST_REMOVE, 8 + 1 + 4 + ChannelName.size());
988
989 data.WriteBits(ChannelName.size(), 7);
990 data.WriteGuidMask(UserGUID, 6, 0, 5, 4, 3, 1, 7, 2);
991 data.FlushBits();
992 data.WriteGuidBytes(UserGUID, 1, 4);
993 data << uint8(ChannelFlags);
994 data.WriteGuidBytes(UserGUID, 6, 5);
995 data << uint32(ChannelID);
996 data.WriteGuidBytes(UserGUID, 2, 7, 0);
997 data << ChannelName;
998 data.WriteGuidBytes(UserGUID, 3);
999
1000 if (IsConstant())
1001 SendToAllButOne(&data, UserGUID);
1002 else
1003 SendToAll(&data);
1004}
@ CHAT_YOU_JOINED_NOTICE
Definition Channel.h:23
@ CHAT_WRONG_FACTION_NOTICE
Definition Channel.h:48
@ CHAT_NOT_MODERATOR_NOTICE
Definition Channel.h:28
@ CHAT_PLAYER_UNBANNED_NOTICE
Definition Channel.h:43
@ CHAT_PLAYER_NOT_FOUND_NOTICE
Definition Channel.h:31
@ CHAT_MUTED_NOTICE
Definition Channel.h:39
@ CHAT_PLAYER_NOT_BANNED_NOTICE
Definition Channel.h:44
@ CHAT_PLAYER_INVITED_NOTICE
Definition Channel.h:51
@ CHAT_PLAYER_KICKED_NOTICE
Definition Channel.h:40
@ CHAT_VOICE_OFF_NOTICE
Definition Channel.h:57
@ CHAT_MODE_CHANGE_NOTICE
Definition Channel.h:34
@ CHAT_NOT_MEMBER_NOTICE
Definition Channel.h:27
@ CHAT_ANNOUNCEMENTS_ON_NOTICE
Definition Channel.h:35
@ CHAT_JOINED_NOTICE
Definition Channel.h:20
@ CHAT_LEFT_NOTICE
Definition Channel.h:21
@ CHAT_INVITE_WRONG_FACTION_NOTICE
Definition Channel.h:47
@ CHAT_BANNED_NOTICE
Definition Channel.h:41
@ CHAT_PLAYER_BANNED_NOTICE
Definition Channel.h:42
@ CHAT_PLAYER_ALREADY_MEMBER_NOTICE
Definition Channel.h:45
@ CHAT_OWNER_CHANGED_NOTICE
Definition Channel.h:30
@ CHAT_ANNOUNCEMENTS_OFF_NOTICE
Definition Channel.h:36
@ CHAT_VOICE_ON_NOTICE
Definition Channel.h:56
@ CHAT_NOT_IN_LFG_NOTICE
Definition Channel.h:55
@ CHAT_NOT_IN_AREA_NOTICE
Definition Channel.h:54
@ CHAT_NOT_MODERATED_NOTICE
Definition Channel.h:50
@ CHAT_YOU_LEFT_NOTICE
Definition Channel.h:25
@ CHAT_CHANNEL_OWNER_NOTICE
Definition Channel.h:33
@ CHAT_WRONG_PASSWORD_NOTICE
Definition Channel.h:26
@ CHAT_THROTTLED_NOTICE
Definition Channel.h:53
@ CHAT_PLAYER_INVITE_BANNED_NOTICE
Definition Channel.h:52
@ CHAT_INVITE_NOTICE
Definition Channel.h:46
@ CHAT_NOT_OWNER_NOTICE
Definition Channel.h:32
@ CHAT_PASSWORD_CHANGED_NOTICE
Definition Channel.h:29
@ CHAT_INVALID_NAME_NOTICE
Definition Channel.h:49
ChannelFlags
Definition Channel.h:61
@ CHANNEL_FLAG_LFG
Definition Channel.h:69
@ MEMBER_FLAG_NONE
Definition Channel.h:95
@ CHAR_UPD_CHANNEL
@ CHAR_UPD_CHANNEL_USAGE
@ CHAR_DEL_OLD_CHANNELS
@ DAY
Definition Common.h:121
AccountTypes
Definition Common.h:129
DBCStorage< ChatChannelsEntry > sChatChannelsStore(ChatChannelsEntryfmt)
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
std::uint64_t uint64
Definition Define.h:76
#define SF_LOG_DEBUG(filterType__,...)
Definition Log.h:134
#define sObjectAccessor
uint32 GUID_LOPART(uint64 x)
#define sObjectMgr
Definition ObjectMgr.h:1617
Language
static bool IsPlayerAccount(AccountTypes gmlevel)
void WriteGuidBytes(const ObjectGuid &guid, Offsets... offsets)
Definition ByteBuffer.h:264
void put(size_t pos, T value)
Definition ByteBuffer.h:233
void WriteGuidMask(const ObjectGuid &guid, Offsets... offsets)
Definition ByteBuffer.h:248
size_t wpos() const
Definition ByteBuffer.h:483
void WriteBits(T value, size_t bits)
Definition ByteBuffer.h:192
void clear()
Definition ByteBuffer.h:141
void FlushBits()
Definition ByteBuffer.h:154
void MakePlayerNotFound(WorldPacket *data, std::string const &name)
Definition Channel.cpp:802
void LeaveNotify(ObjectGuid UserGUID, uint32 ChannelID, uint8 ChannelFlags, std::string const &ChannelName)
Definition Channel.cpp:985
bool IsConstant() const
Definition Channel.h:140
void Password(Player const *player, std::string const &pass)
Definition Channel.cpp:376
void MakeNotifyPacket(WorldPacket *data, uint8 notify_type)
Definition Channel.cpp:741
void List(Player const *player)
Definition Channel.cpp:505
uint32 _Team
Definition Channel.h:265
uint32 _channelId
Definition Channel.h:264
void SetOwner(uint64 guid, bool exclaim=true)
Definition Channel.cpp:685
void MakeChannelOwner(WorldPacket *data)
Definition Channel.cpp:813
void MakePlayerBanned(WorldPacket *data, uint64 bad, uint64 good)
Definition Channel.cpp:861
void MakeNotMember(WorldPacket *data)
Definition Channel.cpp:780
void MakeVoiceOn(WorldPacket *data, uint64 guid)
Definition Channel.cpp:940
void MakePlayerInvited(WorldPacket *data, std::string const &name)
Definition Channel.cpp:913
void MakePlayerInviteBanned(WorldPacket *data, std::string const &name)
Definition Channel.cpp:919
void MakeNotModerated(WorldPacket *data)
Definition Channel.cpp:908
void SendToAll(WorldPacket *data, uint64 guid=0)
Definition Channel.cpp:715
bool HasFlag(uint8 flag) const
Definition Channel.h:148
void MakePasswordChanged(WorldPacket *data, uint64 guid)
Definition Channel.cpp:790
void JoinChannel(Player *player, std::string const &pass)
Definition Channel.cpp:137
void MakePlayerKicked(WorldPacket *data, uint64 bad, uint64 good)
Definition Channel.cpp:849
void UpdateChannelInDB() const
Definition Channel.cpp:93
void MakeInviteWrongFaction(WorldPacket *data)
Definition Channel.cpp:893
void MakeNotOwner(WorldPacket *data)
Definition Channel.cpp:808
void SetMute(Player const *player, std::string const &newname)
Definition Channel.h:163
void DeVoice(uint64 guid1, uint64 guid2)
Definition Channel.cpp:739
void SetModerator(Player const *player, std::string const &newname)
Definition Channel.h:161
Channel(std::string const &name, uint32 channel_id, uint32 Team=0)
Definition Channel.cpp:15
PlayerContainer playersStore
Definition Channel.h:269
void MakeNotModerator(WorldPacket *data)
Definition Channel.cpp:785
void SendToOne(WorldPacket *data, uint64 who)
Definition Channel.cpp:731
void MakeVoiceOff(WorldPacket *data, uint64 guid)
Definition Channel.cpp:946
uint64 _ownerGUID
Definition Channel.h:266
void KickOrBan(Player const *player, std::string const &badname, bool ban)
Definition Channel.cpp:266
void MakeMuted(WorldPacket *data)
Definition Channel.cpp:844
void MakeYouLeft(WorldPacket *data)
Definition Channel.cpp:768
bool IsOn(uint64 who) const
Definition Channel.h:219
uint32 GetChannelId() const
Definition Channel.h:139
void MakeInvalidName(WorldPacket *data)
Definition Channel.cpp:903
bool _announce
Definition Channel.h:260
bool IsBanned(uint64 guid) const
Definition Channel.h:220
void MakeYouJoined(WorldPacket *data)
Definition Channel.cpp:760
void LeaveChannel(Player *player, bool send=true)
Definition Channel.cpp:215
uint8 _flags
Definition Channel.h:263
void JoinNotify(ObjectGuid UserGUID, uint32 ChannelID, uint8 ChannelFlags, uint8 UserFlags, std::string const &ChannelName)
Definition Channel.cpp:952
void UnBan(Player const *player, std::string const &badname)
Definition Channel.cpp:336
bool _ownership
Definition Channel.h:261
static void CleanOldChannelsInDB()
Definition Channel.cpp:125
std::string _password
Definition Channel.h:268
void Say(uint64 guid, std::string const &what, Language lang)
Definition Channel.cpp:585
void SetMode(Player const *player, std::string const &p2n, bool mod, bool set)
Definition Channel.cpp:406
void MakeInvite(WorldPacket *data, uint64 guid)
Definition Channel.cpp:887
void MakeLeft(WorldPacket *data, uint64 guid)
Definition Channel.cpp:754
void MakeNotInArea(WorldPacket *data)
Definition Channel.cpp:930
void MakeModeChange(WorldPacket *data, uint64 guid, uint8 oldflags)
Definition Channel.cpp:824
void MakeNotInLfg(WorldPacket *data)
Definition Channel.cpp:935
void MakePlayerAlreadyMember(WorldPacket *data, uint64 guid)
Definition Channel.cpp:881
void MakePlayerNotBanned(WorldPacket *data, std::string const &name)
Definition Channel.cpp:875
void MakeAnnouncementsOn(WorldPacket *data, uint64 guid)
Definition Channel.cpp:832
void MakePlayerUnbanned(WorldPacket *data, uint64 bad, uint64 good)
Definition Channel.cpp:868
void SendToAllButOne(WorldPacket *data, uint64 who)
Definition Channel.cpp:723
void Voice(uint64 guid1, uint64 guid2)
Definition Channel.cpp:737
std::string const & GetName() const
Definition Channel.h:138
void Announce(Player const *player)
Definition Channel.cpp:553
void MakeBanned(WorldPacket *data)
Definition Channel.cpp:856
void MakeAnnouncementsOff(WorldPacket *data, uint64 guid)
Definition Channel.cpp:838
void MakeThrottled(WorldPacket *data)
Definition Channel.cpp:925
void Invite(Player const *player, std::string const &newp)
Definition Channel.cpp:625
void MakeOwnerChanged(WorldPacket *data, uint64 guid)
Definition Channel.cpp:796
void MakeWrongPassword(WorldPacket *data)
Definition Channel.cpp:775
void MakeWrongFaction(WorldPacket *data)
Definition Channel.cpp:898
void UpdateChannelUseageInDB() const
Definition Channel.cpp:117
void MakeJoined(WorldPacket *data, uint64 guid)
Definition Channel.cpp:748
uint8 GetFlags() const
Definition Channel.h:147
void SendWhoOwner(uint64 guid)
Definition Channel.cpp:495
uint8 GetPlayerFlags(uint64 guid) const
Definition Channel.h:225
BannedContainer bannedStore
Definition Channel.h:270
std::string _name
Definition Channel.h:267
bool _IsSaved
Definition Channel.h:262
static size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string const &message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="", std::string const &addonPrefix="")
Definition Chat.cpp:580
static Player * FindPlayer(uint64)
uint64 GetGUID() const
Definition Object.h:119
uint32 GetTeam() const
Definition Player.h:2527
bool isGMVisible() const
Definition Player.h:1390
WorldSession * GetSession() const
Definition Player.h:2417
Group * GetGroup()
Definition Player.h:2972
bool IsVisibleGloballyFor(Player const *player) const
Definition Player.cpp:18107
PlayerSocial * GetSocial()
Definition Player.h:1346
void LeftChannel(Channel *c)
Definition Player.cpp:5654
void JoinedChannel(Channel *c)
Definition Player.cpp:5649
bool HasIgnore(uint32 ignore_guid)
void setBool(const uint8 index, const bool value)
void setString(const uint8 index, const std::string &value)
void setUInt32(const uint8 index, const uint32 value)
std::string const & GetName() const
Definition Object.h:664
void Initialize(Opcodes opcode, size_t newres=200)
Definition WorldPacket.h:31
AccountTypes GetSecurity() const
std::string GetPlayerInfo() const
bool HasPermission(uint32 permissionId)
CharacterDatabaseWorkerPool CharacterDatabase
Accessor to the character database.
Definition Main.cpp:41
@ SMSG_CHANNEL_LIST
Definition Opcodes.h:600
@ SMSG_USERLIST_REMOVE
Definition Opcodes.h:1057
@ SMSG_CHANNEL_NOTIFY
Definition Opcodes.h:602
@ SMSG_USERLIST_UPDATE
Definition Opcodes.h:1058
@ SMSG_USERLIST_ADD
Definition Opcodes.h:1056
#define sWorld
Definition World.h:910
@ CONFIG_PRESERVE_CUSTOM_CHANNEL_DURATION
Definition World.h:329
@ CONFIG_GM_LEVEL_IN_WHO_LIST
Definition World.h:252
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL
Definition World.h:97
@ CONFIG_RESTRICTED_LFG_CHANNEL
Definition World.h:115
@ RBAC_PERM_COMMAND_GM_CHAT
Definition RBAC.h:260
@ RBAC_PERM_SILENTLY_JOIN_CHANNEL
Definition RBAC.h:85
@ RBAC_PERM_WHO_SEE_ALL_SEC_LEVELS
Definition RBAC.h:75
@ RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR
Definition RBAC.h:86
@ RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL
Definition RBAC.h:66