TrinityCore
ChatHandler.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "WorldSession.h"
19#include "AccountMgr.h"
20#include "Channel.h"
21#include "ChannelMgr.h"
22#include "Chat.h"
23#include "ChatPackets.h"
24#include "Common.h"
25#include "CreatureAI.h"
26#include "DB2Stores.h"
27#include "GameTime.h"
28#include "GridNotifiersImpl.h"
29#include "Group.h"
30#include "Guild.h"
31#include "GuildMgr.h"
32#include "Language.h"
33#include "LanguageMgr.h"
34#include "Log.h"
35#include "ObjectAccessor.h"
36#include "ObjectMgr.h"
37#include "Opcodes.h"
38#include "Player.h"
39#include "ScriptMgr.h"
40#include "SpellAuraEffects.h"
41#include "Util.h"
42#include "Warden.h"
43#include "World.h"
44#include <algorithm>
45
47{
48 CanWhisper = 0,
50 Offline = 2,
51 WrongFaction = 3
52};
53
54inline bool isNasty(uint8 c)
55{
56 if (c == '\t')
57 return false;
58 if (c <= '\037') // ASCII control block
59 return true;
60 return false;
61}
62
63inline bool ValidateMessage(Player const* player, std::string& msg)
64{
65 // cut at the first newline or carriage return
66 std::string::size_type pos = msg.find_first_of("\n\r");
67 if (pos == 0)
68 return false;
69 else if (pos != std::string::npos)
70 msg.erase(pos);
71
72 // abort on any sort of nasty character
73 for (uint8 c : msg)
74 {
75 if (isNasty(c))
76 {
77 TC_LOG_ERROR("network", "Player {} {} sent a message containing invalid character {} - blocked", player->GetName(),
78 player->GetGUID().ToString(), uint32(c));
79 return false;
80 }
81 }
82
83 // collapse multiple spaces into one
85 {
86 auto end = std::unique(msg.begin(), msg.end(), [](char c1, char c2) { return (c1 == ' ') && (c2 == ' '); });
87 msg.erase(end, msg.end());
88 }
89
90 return true;
91}
92
94{
95 ChatMsg type;
96
97 switch (chatMessage.GetOpcode())
98 {
100 type = CHAT_MSG_SAY;
101 break;
103 type = CHAT_MSG_YELL;
104 break;
106 type = CHAT_MSG_GUILD;
107 break;
109 type = CHAT_MSG_OFFICER;
110 break;
112 type = CHAT_MSG_PARTY;
113 break;
115 type = CHAT_MSG_RAID;
116 break;
119 break;
122 break;
123 default:
124 TC_LOG_ERROR("network", "HandleMessagechatOpcode : Unknown chat opcode ({})", chatMessage.GetOpcode());
125 return;
126 }
127
128 HandleChatMessage(type, Language(chatMessage.Language), chatMessage.Text);
129}
130
132{
133 HandleChatMessage(CHAT_MSG_WHISPER, Language(chatMessageWhisper.Language), chatMessageWhisper.Text, chatMessageWhisper.Target);
134}
135
137{
138 HandleChatMessage(CHAT_MSG_CHANNEL, Language(chatMessageChannel.Language), chatMessageChannel.Text, chatMessageChannel.Target, chatMessageChannel.ChannelGUID);
139}
140
142{
144}
145
146ChatMessageResult WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string msg, std::string target /*= ""*/, Optional<ObjectGuid> channelGuid /*= {}*/)
147{
148 Player* sender = GetPlayer();
149
150 if (lang == LANG_UNIVERSAL && type != CHAT_MSG_EMOTE && type != CHAT_MSG_GUILD && type != CHAT_MSG_OFFICER)
151 {
152 TC_LOG_ERROR("entities.player.cheat", "CMSG_MESSAGECHAT: Possible hacking-attempt: {} tried to send a message in universal language", GetPlayerInfo());
155 }
156
157 // prevent talking at unknown language (cheating)
158 auto languageData = sLanguageMgr->GetLanguageDescById(lang);
159 if (languageData.begin() == languageData.end())
160 {
163 }
164
165 if (std::none_of(languageData.begin(), languageData.end(),
166 [sender](std::pair<uint32 const, LanguageDesc> const& langDesc) { return langDesc.second.SkillId == 0 || sender->HasSkill(langDesc.second.SkillId); }))
167 {
168 // also check SPELL_AURA_COMPREHEND_LANGUAGE (client offers option to speak in that language)
170 {
173 }
174 }
175
176 // send in universal language if player in .gm on mode (ignore spell effects)
177 if (sender->IsGameMaster())
178 lang = LANG_UNIVERSAL;
179 else
180 {
181 // send in universal language in two side iteration allowed mode
183 lang = LANG_UNIVERSAL;
184 else
185 {
186 switch (type)
187 {
188 case CHAT_MSG_PARTY:
189 case CHAT_MSG_RAID:
191 // allow two side chat at group channel if two side group allowed
193 lang = LANG_UNIVERSAL;
194 break;
195 case CHAT_MSG_GUILD:
196 case CHAT_MSG_OFFICER:
197 // allow two side chat at guild channel if two side guild allowed
199 lang = LANG_UNIVERSAL;
200 break;
201 default:
202 break;
203 }
204 }
205
206 // but overwrite it by SPELL_AURA_MOD_LANGUAGE auras (only single case used)
208 if (!ModLangAuras.empty())
209 lang = Language(ModLangAuras.front()->GetMiscValue());
210 }
211
212 if (!CanSpeak())
213 {
214 std::string timeStr = secsToTimeString(m_muteTime - GameTime::GetGameTime());
217 }
218
219 if (type != CHAT_MSG_AFK && type != CHAT_MSG_DND)
221
222 if (sender->HasAura(GM_SILENCE_AURA) && type != CHAT_MSG_WHISPER)
223 {
226 }
227
228 if (msg.size() > 511)
230
231 if (msg.empty())
233
234 if (ChatHandler(this).ParseCommands(msg.c_str()))
236
237 // do message validity checks
238 if (!ValidateMessage(GetPlayer(), msg))
240
241 // validate hyperlinks
244
245 switch (type)
246 {
247 case CHAT_MSG_SAY:
248 {
249 // Prevent cheating
250 if (!sender->IsAlive())
252
253 if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ))
254 {
257 }
258
259 sender->Say(msg, lang);
260 break;
261 }
262 case CHAT_MSG_EMOTE:
263 {
264 // Prevent cheating
265 if (!sender->IsAlive())
267
268 if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_EMOTE_LEVEL_REQ))
269 {
272 }
273
274 sender->TextEmote(msg);
275 break;
276 }
277 case CHAT_MSG_YELL:
278 {
279 // Prevent cheating
280 if (!sender->IsAlive())
282
283 if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_YELL_LEVEL_REQ))
284 {
287 }
288
289 sender->Yell(msg, lang);
290 break;
291 }
292 case CHAT_MSG_WHISPER:
293 {
296
297 if (!normalizePlayerName(extName.Name))
298 {
300 break;
301 }
302
304 if (!receiver || (lang != LANG_ADDON && !receiver->isAcceptWhispers() && receiver->GetSession()->HasPermission(rbac::RBAC_PERM_CAN_FILTER_WHISPERS) && !receiver->IsInWhisperWhiteList(sender->GetGUID())))
305 {
308 }
309
310 // Apply checks only if receiver is not already in whitelist and if receiver is not a GM with ".whisper on"
311 if (!receiver->IsInWhisperWhiteList(sender->GetGUID()) && !receiver->IsGameMasterAcceptingWhispers())
312 {
313 if (!sender->IsGameMaster() && sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ))
314 {
317 }
318
319 if (GetPlayer()->GetEffectiveTeam() != receiver->GetEffectiveTeam() && !HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT))
320 {
323 }
324 }
325
326 if (GetPlayer()->HasAura(1852) && !receiver->IsGameMaster())
327 {
330 }
331
332 // If player is a Gamemaster and doesn't accept whisper, we auto-whitelist every player that the Gamemaster is talking to
333 // We also do that if a player is under the required level for whispers.
334 if (receiver->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ) ||
336 sender->AddWhisperWhiteList(receiver->GetGUID());
337
338 GetPlayer()->Whisper(msg, lang, receiver);
339 break;
340 }
341 case CHAT_MSG_PARTY:
342 {
343 // if player is in battleground, he cannot say to battleground members by /p
344 Group* group = GetPlayer()->GetOriginalGroup();
345 if (!group)
346 {
347 group = sender->GetGroup();
348 if (!group || group->isBGGroup())
350 }
351
352 if (group->IsLeader(GetPlayer()->GetGUID()))
354
355 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
356
358 packet.Initialize(ChatMsg(type), lang, sender, nullptr, msg);
359 group->BroadcastPacket(packet.Write(), false, group->GetMemberGroup(GetPlayer()->GetGUID()));
360 break;
361 }
362 case CHAT_MSG_GUILD:
363 {
364 if (GetPlayer()->GetGuildId())
365 {
366 if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId()))
367 {
368 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, guild);
369
370 guild->BroadcastToGuild(this, false, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL);
371 }
372 }
373 break;
374 }
375 case CHAT_MSG_OFFICER:
376 {
377 if (GetPlayer()->GetGuildId())
378 {
379 if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId()))
380 {
381 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, guild);
382
383 guild->BroadcastToGuild(this, true, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL);
384 }
385 }
386 break;
387 }
388 case CHAT_MSG_RAID:
389 {
390 Group* group = GetPlayer()->GetGroup();
391 if (!group || !group->isRaidGroup() || group->isBGGroup())
393
394 if (group->IsLeader(GetPlayer()->GetGUID()))
396
397 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
398
400 packet.Initialize(ChatMsg(type), lang, sender, nullptr, msg);
401 group->BroadcastPacket(packet.Write(), false);
402 break;
403 }
405 {
406 Group* group = GetPlayer()->GetGroup();
407 if (!group)
409
410 if (group->isRaidGroup())
411 {
412 if (!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID()))
414 }
415 else if (!sWorld->getBoolConfig(CONFIG_CHAT_PARTY_RAID_WARNINGS))
417
418 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
419
421 //in battleground, raid warning is sent only to players in battleground - code is ok
422 packet.Initialize(CHAT_MSG_RAID_WARNING, lang, sender, nullptr, msg);
423 group->BroadcastPacket(packet.Write(), false);
424 break;
425 }
426 case CHAT_MSG_CHANNEL:
427 {
429 {
430 if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_CHANNEL_LEVEL_REQ))
431 {
434 }
435 }
436
437 Channel* chn = channelGuid
438 ? ChannelMgr::GetChannelForPlayerByGuid(*channelGuid, sender)
440 if (chn)
441 {
442 if (ChatChannelsEntry const* chatChannel = sChatChannelsStore.LookupEntry(chn->GetChannelId()))
443 if (chatChannel->GetFlags().HasFlag(ChatChannelFlags::ReadOnly))
445
446 sScriptMgr->OnPlayerChat(sender, type, lang, msg, chn);
447 chn->Say(sender->GetGUID(), msg, lang);
448 }
449 break;
450 }
452 {
453 Group* group = GetPlayer()->GetGroup();
454 if (!group)
456
457 if (group->IsLeader(GetPlayer()->GetGUID()))
459
460 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
461
463 packet.Initialize(ChatMsg(type), lang, sender, nullptr, msg);
464 group->BroadcastPacket(packet.Write(), false);
465 break;
466 }
467 default:
468 TC_LOG_ERROR("network", "CHAT: unknown message type {}, lang: {}", type, lang);
469 break;
470 }
471
473}
474
476{
477 HandleChatAddonMessage(chatAddonMessage.Params.Type, chatAddonMessage.Params.Prefix, chatAddonMessage.Params.Text, chatAddonMessage.Params.IsLogged);
478}
479
481{
482 HandleChatAddonMessage(chatAddonMessageTargeted.Params.Type, chatAddonMessageTargeted.Params.Prefix, chatAddonMessageTargeted.Params.Text,
483 chatAddonMessageTargeted.Params.IsLogged, chatAddonMessageTargeted.Target, chatAddonMessageTargeted.ChannelGUID);
484}
485
486void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std::string text, bool isLogged, std::string target /*= ""*/, Optional<ObjectGuid> channelGuid /*= {}*/)
487{
488 Player* sender = GetPlayer();
489
490 if (prefix.empty() || prefix.length() > 16)
491 return;
492
493 // Our Warden module also uses SendAddonMessage as a way to communicate Lua check results to the server, see if this is that
494 if (type == CHAT_MSG_GUILD)
495 {
496 if (_warden && _warden->ProcessLuaCheckResponse(text))
497 return;
498 }
499
500 // Disabled addon channel?
501 if (!sWorld->getBoolConfig(CONFIG_ADDON_CHANNEL))
502 return;
503
504 if (!CanSpeak())
505 return;
506
508
509 if (prefix == AddonChannelCommandHandler::PREFIX && AddonChannelCommandHandler(this).ParseCommands(text.c_str()))
510 return;
511
512 if (text.length() > 255)
513 return;
514
515 switch (type)
516 {
517 case CHAT_MSG_GUILD:
518 case CHAT_MSG_OFFICER:
519 {
520 if (sender->GetGuildId())
521 if (Guild* guild = sGuildMgr->GetGuildById(sender->GetGuildId()))
522 guild->BroadcastAddonToGuild(this, type == CHAT_MSG_OFFICER, text, prefix, isLogged);
523 break;
524 }
525 case CHAT_MSG_WHISPER:
526 {
529
530 if (!normalizePlayerName(extName.Name))
531 break;
532
533 Player* receiver = ObjectAccessor::FindPlayerByName(extName.Name);
534 if (!receiver)
535 break;
536
537 sender->WhisperAddon(text, prefix, isLogged, receiver);
538 break;
539 }
540 // Messages sent to "RAID" while in a party will get delivered to "PARTY"
541 case CHAT_MSG_PARTY:
542 case CHAT_MSG_RAID:
544 {
545 Group* group = nullptr;
546 int32 subGroup = -1;
547 if (type != CHAT_MSG_INSTANCE_CHAT)
548 group = sender->GetOriginalGroup();
549
550 if (!group)
551 {
552 group = sender->GetGroup();
553 if (!group)
554 break;
555
556 if (type == CHAT_MSG_PARTY)
557 subGroup = sender->GetSubGroup();
558 }
559
561 packet.Initialize(type, isLogged ? LANG_ADDON_LOGGED : LANG_ADDON, sender, nullptr, text, 0, "", DEFAULT_LOCALE, prefix);
562 group->BroadcastAddonMessagePacket(packet.Write(), prefix, true, subGroup, sender->GetGUID());
563 break;
564 }
565 case CHAT_MSG_CHANNEL:
566 {
567 Channel* chn = channelGuid
568 ? ChannelMgr::GetChannelForPlayerByGuid(*channelGuid, sender)
570 if (chn)
571 chn->AddonSay(sender->GetGUID(), prefix, text.c_str(), isLogged);
572 break;
573 }
574 default:
575 {
576 TC_LOG_ERROR("misc", "HandleAddonMessagechatOpcode: unknown addon message type {}", type);
577 break;
578 }
579 }
580}
581
583{
584 Player* sender = GetPlayer();
585
586 if (sender->IsInCombat())
587 return;
588
589 if (chatMessageAFK.Text.length() > 511)
590 return;
591
592 // do message validity checks
593 if (!ValidateMessage(sender, chatMessageAFK.Text))
594 return;
595
596 if (!ValidateHyperlinksAndMaybeKick(chatMessageAFK.Text))
597 return;
598
599 if (sender->HasAura(GM_SILENCE_AURA))
600 {
602 return;
603 }
604
605 if (sender->isAFK()) // Already AFK
606 {
607 if (chatMessageAFK.Text.empty())
608 sender->ToggleAFK(); // Remove AFK
609 else
610 sender->autoReplyMsg = chatMessageAFK.Text; // Update message
611 }
612 else // New AFK mode
613 {
614 sender->autoReplyMsg = chatMessageAFK.Text.empty() ? GetTrinityString(LANG_PLAYER_AFK_DEFAULT) : chatMessageAFK.Text;
615
616 if (sender->isDND())
617 sender->ToggleDND();
618
619 sender->ToggleAFK();
620 }
621
622 if (Guild* guild = sender->GetGuild())
623 guild->SendEventAwayChanged(sender->GetGUID(), sender->isAFK(), sender->isDND());
624
625 sScriptMgr->OnPlayerChat(sender, CHAT_MSG_AFK, LANG_UNIVERSAL, chatMessageAFK.Text);
626}
627
629{
630 Player* sender = GetPlayer();
631
632 if (sender->IsInCombat())
633 return;
634
635 if (chatMessageDND.Text.length() > 511)
636 return;
637
638 // do message validity checks
639 if (!ValidateMessage(sender, chatMessageDND.Text))
640 return;
641
642 if (!ValidateHyperlinksAndMaybeKick(chatMessageDND.Text))
643 return;
644
645 if (sender->HasAura(GM_SILENCE_AURA))
646 {
648 return;
649 }
650
651 if (sender->isDND()) // Already DND
652 {
653 if (chatMessageDND.Text.empty())
654 sender->ToggleDND(); // Remove DND
655 else
656 sender->autoReplyMsg = chatMessageDND.Text; // Update message
657 }
658 else // New DND mode
659 {
660 sender->autoReplyMsg = chatMessageDND.Text.empty() ? GetTrinityString(LANG_PLAYER_DND_DEFAULT) : chatMessageDND.Text;
661
662 if (sender->isAFK())
663 sender->ToggleAFK();
664
665 sender->ToggleDND();
666 }
667
668 if (Guild* guild = sender->GetGuild())
669 guild->SendEventAwayChanged(sender->GetGUID(), sender->isAFK(), sender->isDND());
670
671 sScriptMgr->OnPlayerChat(sender, CHAT_MSG_DND, LANG_UNIVERSAL, chatMessageDND.Text);
672}
673
675{
676 if (!GetPlayer()->IsAlive() || GetPlayer()->HasUnitState(UNIT_STATE_DIED))
677 return;
678
679 sScriptMgr->OnPlayerClearEmote(GetPlayer());
680
682}
683
685{
686 if (!_player->IsAlive())
687 return;
688
689 if (!CanSpeak())
690 {
691 std::string timeStr = secsToTimeString(m_muteTime - GameTime::GetGameTime());
693 return;
694 }
695
696 sScriptMgr->OnPlayerTextEmote(_player, packet.SoundIndex, packet.EmoteID, packet.Target);
697
698 EmotesTextEntry const* em = sEmotesTextStore.LookupEntry(packet.EmoteID);
699 if (!em)
700 return;
701
702 Emote emote = static_cast<Emote>(em->EmoteID);
703
704 switch (emote)
705 {
707 case EMOTE_STATE_SIT:
710 break;
712 case EMOTE_STATE_READ:
713 _player->SetEmoteState(emote);
714 break;
715 default:
716 // Only allow text-emotes for "dead" entities (feign death included)
718 break;
719 _player->HandleEmoteCommand(emote, nullptr, { packet.SpellVisualKitIDs.data(), packet.SpellVisualKitIDs.data() + packet.SpellVisualKitIDs.size() }, packet.SequenceVariation);
720 break;
721 }
722
724 textEmote.SourceGUID = _player->GetGUID();
725 textEmote.SourceAccountGUID = GetAccountGUID();
726 textEmote.TargetGUID = packet.Target;
727 textEmote.EmoteID = packet.EmoteID;
728 textEmote.SoundIndex = packet.SoundIndex;
729 _player->SendMessageToSetInRange(textEmote.Write(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true);
730
731 Unit* unit = ObjectAccessor::GetUnit(*_player, packet.Target);
732
734
735 // Send scripted event call
736 if (unit)
737 if (Creature* creature = unit->ToCreature())
738 creature->AI()->ReceiveEmote(_player, packet.EmoteID);
739
740 if (emote != EMOTE_ONESHOT_NONE)
742}
743
745{
746 Player* player = ObjectAccessor::FindConnectedPlayer(chatReportIgnored.IgnoredGUID);
747 if (!player || !player->GetSession())
748 return;
749
752 player->SendDirectMessage(packet.Write());
753}
754
756{
758}
759
760void WorldSession::SendPlayerAmbiguousNotice(std::string const& name)
761{
763}
764
766{
768 packet.Reason = restriction;
769 SendPacket(packet.Write());
770}
771
773{
774 ChatWhisperTargetStatus status = [&]
775 {
776 Player* sender = GetPlayer();
777 Player* receiver = ObjectAccessor::FindConnectedPlayer(canLocalWhisperTargetRequest.WhisperTarget);
778 if (!receiver || (!receiver->isAcceptWhispers() && receiver->GetSession()->HasPermission(rbac::RBAC_PERM_CAN_FILTER_WHISPERS) && !receiver->IsInWhisperWhiteList(sender->GetGUID())))
780
781 if (!receiver->IsInWhisperWhiteList(sender->GetGUID()) && !receiver->IsGameMasterAcceptingWhispers())
782 if (GetPlayer()->GetEffectiveTeam() != receiver->GetEffectiveTeam() && !HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT))
784
786 }();
787
788 WorldPackets::Chat::CanLocalWhisperTargetResponse canLocalWhisperTargetResponse;
789 canLocalWhisperTargetResponse.WhisperTarget = canLocalWhisperTargetRequest.WhisperTarget;
790 canLocalWhisperTargetResponse.Status = status;
791 SendPacket(canLocalWhisperTargetResponse.Write());
792}
793
795{
796 // disabling chat not supported
797 // send Sueccess and force chat disabled to false instead of sending that change failed
798 // this makes client change the cvar back to false instead of just printing error message in console
800 response.Success = true;
801 response.ChatDisabled = false;
802 SendPacket(response.Write());
803}
ChatWhisperTargetStatus
Definition: ChatHandler.cpp:47
bool ValidateMessage(Player const *player, std::string &msg)
Definition: ChatHandler.cpp:63
bool isNasty(uint8 c)
Definition: ChatHandler.cpp:54
#define DEFAULT_LOCALE
Definition: Common.h:66
DB2Storage< EmotesTextEntry > sEmotesTextStore("EmotesText.db2", &EmotesTextLoadInfo::Instance)
DB2Storage< ChatChannelsEntry > sChatChannelsStore("ChatChannels.db2", &ChatChannelsLoadInfo::Instance)
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
#define sGuildMgr
Definition: GuildMgr.h:70
#define sLanguageMgr
Definition: LanguageMgr.h:97
@ LANG_SAY_REQ
Definition: Language.h:1158
@ LANG_GM_SILENCE
Definition: Language.h:1173
@ LANG_UNKNOWN_LANGUAGE
Definition: Language.h:757
@ LANG_NOT_LEARNED_LANGUAGE
Definition: Language.h:758
@ LANG_WHISPER_REQ
Definition: Language.h:1159
@ LANG_WAIT_BEFORE_SPEAKING
Definition: Language.h:694
@ LANG_PLAYER_AFK_DEFAULT
Definition: Language.h:699
@ LANG_PLAYER_DND_DEFAULT
Definition: Language.h:698
@ LANG_CHANNEL_REQ
Definition: Language.h:1160
#define TC_LOG_ERROR(filterType__,...)
Definition: Log.h:165
ExtendedPlayerName ExtractExtendedPlayerName(std::string const &name)
Definition: ObjectMgr.cpp:174
bool normalizePlayerName(std::string &name)
Definition: ObjectMgr.cpp:154
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
#define sScriptMgr
Definition: ScriptMgr.h:1418
Language
@ LANG_ADDON_LOGGED
@ LANG_UNIVERSAL
@ LANG_ADDON
ChatMessageResult
Emote
@ EMOTE_STATE_SLEEP
@ EMOTE_STATE_SIT
@ EMOTE_STATE_READ
@ EMOTE_STATE_KNEEL
@ EMOTE_STATE_DANCE
@ EMOTE_ONESHOT_NONE
#define GM_SILENCE_AURA
ChatMsg
@ CHAT_MSG_RAID_WARNING
@ CHAT_MSG_IGNORED
@ CHAT_MSG_RAID
@ CHAT_MSG_SAY
@ CHAT_MSG_INSTANCE_CHAT_LEADER
@ CHAT_MSG_PARTY_LEADER
@ CHAT_MSG_RAID_LEADER
@ CHAT_MSG_DND
@ CHAT_MSG_INSTANCE_CHAT
@ CHAT_MSG_YELL
@ CHAT_MSG_PARTY
@ CHAT_MSG_WHISPER
@ CHAT_MSG_EMOTE
@ CHAT_MSG_GUILD
@ CHAT_MSG_OFFICER
@ CHAT_MSG_AFK
@ CHAT_MSG_CHANNEL
@ SPELL_AURA_COMPREHEND_LANGUAGE
@ SPELL_AURA_MOD_LANGUAGE
@ UNIT_STATE_DIED
Definition: Unit.h:255
std::string secsToTimeString(uint64 timeInSecs, TimeFormat timeFormat, bool hoursOnly)
Definition: Util.cpp:115
static std::string const PREFIX
Definition: Chat.h:149
static Channel * GetChannelForPlayerByNamePart(std::string const &namePart, Player *playerSearcher)
Definition: ChannelMgr.cpp:131
static Channel * GetChannelForPlayerByGuid(ObjectGuid channelGuid, Player *playerSearcher)
Definition: ChannelMgr.cpp:160
uint32 GetChannelId() const
Definition: Channel.h:166
void AddonSay(ObjectGuid const &guid, std::string const &prefix, std::string const &what, bool isLogged) const
Definition: Channel.cpp:731
void Say(ObjectGuid const &guid, std::string const &what, uint32 lang) const
Definition: Channel.cpp:679
Definition: Group.h:197
uint8 GetMemberGroup(ObjectGuid guid) const
Definition: Group.cpp:1742
bool IsAssistant(ObjectGuid guid) const
Definition: Group.h:311
bool IsLeader(ObjectGuid guid) const
Definition: Group.cpp:1700
void BroadcastAddonMessagePacket(WorldPacket const *packet, const std::string &prefix, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty) const
Definition: Group.cpp:967
bool isBGGroup() const
Definition: Group.cpp:1643
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignoredPlayer=ObjectGuid::Empty) const
Definition: Group.cpp:980
bool isRaidGroup() const
Definition: Group.cpp:1638
Definition: Guild.h:329
std::string ToString() const
Definition: ObjectGuid.cpp:554
static Creature * ToCreature(Object *o)
Definition: Object.h:219
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
void SendMessageToSetInRange(WorldPacket const *data, float dist, bool self) const override
Definition: Player.cpp:6292
bool IsGameMasterAcceptingWhispers() const
Definition: Player.h:1179
bool IsInWhisperWhiteList(ObjectGuid guid)
Definition: Player.cpp:29127
std::string autoReplyMsg
Definition: Player.h:1159
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:6324
Group * GetOriginalGroup() const
Definition: Player.h:2625
Guild * GetGuild()
Definition: Player.cpp:29432
WorldSession * GetSession() const
Definition: Player.h:2101
void WhisperAddon(std::string const &text, std::string const &prefix, bool isLogged, Player *receiver)
Definition: Player.cpp:21769
void UpdateCriteria(CriteriaType type, uint64 miscValue1=0, uint64 miscValue2=0, uint64 miscValue3=0, WorldObject *ref=nullptr)
Definition: Player.cpp:26767
ObjectGuid::LowType GetGuildId() const
Definition: Player.h:1993
bool IsGameMaster() const
Definition: Player.h:1178
void ToggleAFK()
Definition: Player.cpp:1214
bool isDND() const
Definition: Player.h:1157
void UpdateSpeakTime(ChatFloodThrottle::Index index)
Definition: Player.cpp:21230
void AddWhisperWhiteList(ObjectGuid guid)
Definition: Player.h:2678
Group * GetGroup(Optional< uint8 > partyIndex)
Definition: Player.h:2606
uint8 GetSubGroup() const
Definition: Player.h:2612
bool isAFK() const
Definition: Player.h:1156
bool isAcceptWhispers() const
Definition: Player.h:1176
void Yell(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles yelled message in regular chat based on declared language and in config pre-defined Range.
Definition: Player.cpp:21746
void Say(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles said message in regular chat based on declared language and in config pre-defined Range.
Definition: Player.cpp:21720
void TextEmote(std::string_view text, WorldObject const *=nullptr, bool=false) override
Outputs an universal text which is supposed to be an action.
Definition: Player.cpp:21759
Team GetEffectiveTeam() const
Definition: Player.h:2239
void Whisper(std::string_view text, Language language, Player *receiver, bool=false) override
Handles whispers from Addons and players based on sender, receiver's guid and language.
Definition: Player.cpp:21787
void ToggleDND()
Definition: Player.cpp:1226
Definition: Unit.h:627
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition: Unit.h:1321
bool HasAuraTypeWithMiscvalue(AuraType auraType, int32 miscValue) const
Definition: Unit.cpp:4687
std::forward_list< AuraEffect * > AuraEffectList
Definition: Unit.h:644
bool IsAlive() const
Definition: Unit.h:1164
void SetEmoteState(Emote emote)
Definition: Unit.h:852
void RemoveAurasWithInterruptFlags(InterruptFlags flag, SpellInfo const *source=nullptr)
Definition: Unit.cpp:4101
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition: Unit.cpp:1598
uint8 GetLevel() const
Definition: Unit.h:746
bool IsInCombat() const
Definition: Unit.h:1043
std::string const & GetName() const
Definition: Object.h:555
size_type size() const
Array< int32, 2 > SpellVisualKitIDs
Definition: ChatPackets.h:208
ChatAddonMessageParams Params
Definition: ChatPackets.h:99
WorldPacket const * Write() override
void Initialize(ChatMsg chatType, Language language, WorldObject const *sender, WorldObject const *receiver, std::string_view message, uint32 achievementId=0, std::string_view channelName="", LocaleConstant locale=DEFAULT_LOCALE, std::string_view addonPrefix="")
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
OpcodeClient GetOpcode() const
Definition: Packet.h:68
char const * GetTrinityString(uint32 entry) const
void HandleChatMessageEmoteOpcode(WorldPackets::Chat::ChatMessageEmote &chatMessageEmote)
void SendNotification(char const *format,...) ATTR_PRINTF(2
void HandleEmoteOpcode(WorldPackets::Chat::EmoteClient &packet)
void HandleChatMessageAFKOpcode(WorldPackets::Chat::ChatMessageAFK &chatMessageAFK)
ObjectGuid GetAccountGUID() const
std::string GetPlayerInfo() const
Player * GetPlayer() const
void HandleChatCanLocalWhisperTargetRequest(WorldPackets::Chat::CanLocalWhisperTargetRequest const &canLocalWhisperTargetRequest)
void HandleChatMessageChannelOpcode(WorldPackets::Chat::ChatMessageChannel &chatMessageChannel)
void SendChatRestricted(ChatRestrictionType restriction)
void SendChatPlayerNotfoundNotice(std::string const &name)
bool CanSpeak() const
void HandleChatAddonMessage(ChatMsg type, std::string prefix, std::string text, bool isLogged, std::string target="", Optional< ObjectGuid > channelGuid={})
void SendPlayerAmbiguousNotice(std::string const &name)
ChatMessageResult HandleChatMessage(ChatMsg type, Language lang, std::string msg, std::string target="", Optional< ObjectGuid > channelGuid={})
bool HasPermission(uint32 permissionId)
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
void HandleTextEmoteOpcode(WorldPackets::Chat::CTextEmote &packet)
Player * _player
void HandleChatMessageWhisperOpcode(WorldPackets::Chat::ChatMessageWhisper &chatMessageWhisper)
void HandleChatMessageOpcode(WorldPackets::Chat::ChatMessage &chatMessage)
Definition: ChatHandler.cpp:93
void HandleChatMessageDNDOpcode(WorldPackets::Chat::ChatMessageDND &chatMessageDND)
void HandleChatAddonMessageTargetedOpcode(WorldPackets::Chat::ChatAddonMessageTargeted &chatAddonMessageTargeted)
void HandleChatUpdateAADCStatus(WorldPackets::Chat::UpdateAADCStatus const &updateAADCStatus)
time_t m_muteTime
std::unique_ptr< Warden > _warden
bool ValidateHyperlinksAndMaybeKick(std::string const &str)
void HandleChatAddonMessageOpcode(WorldPackets::Chat::ChatAddonMessage &chatAddonMessage)
void HandleChatIgnoredOpcode(WorldPackets::Chat::ChatReportIgnored &chatReportIgnored)
ChatRestrictionType
Definition: WorldSession.h:891
@ CMSG_CHAT_MESSAGE_YELL
Definition: Opcodes.h:229
@ CMSG_CHAT_MESSAGE_GUILD
Definition: Opcodes.h:221
@ CMSG_CHAT_MESSAGE_INSTANCE_CHAT
Definition: Opcodes.h:222
@ CMSG_CHAT_MESSAGE_RAID_WARNING
Definition: Opcodes.h:226
@ CMSG_CHAT_MESSAGE_SAY
Definition: Opcodes.h:227
@ CMSG_CHAT_MESSAGE_RAID
Definition: Opcodes.h:225
@ CMSG_CHAT_MESSAGE_OFFICER
Definition: Opcodes.h:223
@ CMSG_CHAT_MESSAGE_PARTY
Definition: Opcodes.h:224
#define sWorld
Definition: World.h:931
@ CONFIG_CHAT_CHANNEL_LEVEL_REQ
Definition: World.h:321
@ CONFIG_CHAT_YELL_LEVEL_REQ
Definition: World.h:325
@ CONFIG_CHAT_WHISPER_LEVEL_REQ
Definition: World.h:322
@ CONFIG_CHAT_EMOTE_LEVEL_REQ
Definition: World.h:323
@ CONFIG_CHAT_SAY_LEVEL_REQ
Definition: World.h:324
@ CONFIG_CHAT_PARTY_RAID_WARNINGS
Definition: World.h:126
@ CONFIG_CHAT_FAKE_MESSAGE_PREVENTING
Definition: World.h:129
@ CONFIG_ADDON_CHANNEL
Definition: World.h:105
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition: World.h:111
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD
Definition: World.h:112
@ CONFIG_LISTEN_RANGE_TEXTEMOTE
Definition: World.h:210
TC_GAME_API bool GetName(uint32 accountId, std::string &name)
time_t GetGameTime()
Definition: GameTime.cpp:44
TC_GAME_API Player * FindPlayerByName(std::string_view name)
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API Player * FindConnectedPlayerByName(std::string_view name)
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
@ RBAC_PERM_TWO_SIDE_INTERACTION_CHAT
Definition: RBAC.h:78
@ RBAC_PERM_CAN_FILTER_WHISPERS
Definition: RBAC.h:89
@ RBAC_PERM_SKIP_CHECK_CHAT_CHANNEL_REQ
Definition: RBAC.h:72
std::string Name
Definition: ObjectMgr.h:991