aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/ChatHandler.cpp
diff options
context:
space:
mode:
authorFabian <Fabi@users.noreply.github.com>2024-02-12 16:42:08 +0100
committerGitHub <noreply@github.com>2024-02-12 16:42:08 +0100
commit9fa521194b374cc55953e7a9ab6d531fdd39a838 (patch)
tree0e19b0a292f9154c1d2d09674452fdbd3509604a /src/server/game/Handlers/ChatHandler.cpp
parent13398a9710e3414bc1ad4aacd3ec0bfed9ef2593 (diff)
Core/Guilds: Implemented club basics to restore old guild functionality (#29587)
* Updated BGS status names enum. Values bigger than 0x0000AFCD & some others are preserved for compatibility reasons. They were not in the client by default. * Added services & service methods required for guilds. * Allow club stream messages the usage of LANG_UNIVERSAL. Co-authored-by: Shauren <shauren.trinity@gmail.com>
Diffstat (limited to 'src/server/game/Handlers/ChatHandler.cpp')
-rw-r--r--src/server/game/Handlers/ChatHandler.cpp68
1 files changed, 39 insertions, 29 deletions
diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp
index 5111e6f03ac..e1c3b74622c 100644
--- a/src/server/game/Handlers/ChatHandler.cpp
+++ b/src/server/game/Handlers/ChatHandler.cpp
@@ -143,15 +143,15 @@ void WorldSession::HandleChatMessageEmoteOpcode(WorldPackets::Chat::ChatMessageE
HandleChatMessage(CHAT_MSG_EMOTE, LANG_UNIVERSAL, chatMessageEmote.Text);
}
-void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string msg, std::string target /*= ""*/, Optional<ObjectGuid> channelGuid /*= {}*/)
+ChatMessageResult WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string msg, std::string target /*= ""*/, Optional<ObjectGuid> channelGuid /*= {}*/)
{
Player* sender = GetPlayer();
- if (lang == LANG_UNIVERSAL && type != CHAT_MSG_EMOTE)
+ if (lang == LANG_UNIVERSAL && type != CHAT_MSG_EMOTE && type != CHAT_MSG_GUILD && type != CHAT_MSG_OFFICER)
{
TC_LOG_ERROR("entities.player.cheat", "CMSG_MESSAGECHAT: Possible hacking-attempt: {} tried to send a message in universal language", GetPlayerInfo());
SendNotification(LANG_UNKNOWN_LANGUAGE);
- return;
+ return ChatMessageResult::DisallowedLanguage;
}
// prevent talking at unknown language (cheating)
@@ -159,7 +159,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
if (languageData.begin() == languageData.end())
{
SendNotification(LANG_UNKNOWN_LANGUAGE);
- return;
+ return ChatMessageResult::InvalidLanguage;
}
if (std::none_of(languageData.begin(), languageData.end(),
@@ -169,7 +169,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
if (!sender->HasAuraTypeWithMiscvalue(SPELL_AURA_COMPREHEND_LANGUAGE, lang))
{
SendNotification(LANG_NOT_LEARNED_LANGUAGE);
- return;
+ return ChatMessageResult::LanguageNotLearned;
}
}
@@ -213,7 +213,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
{
std::string timeStr = secsToTimeString(m_muteTime - GameTime::GetGameTime());
SendNotification(GetTrinityString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str());
- return;
+ return ChatMessageResult::Muted;
}
if (type != CHAT_MSG_AFK && type != CHAT_MSG_DND)
@@ -222,25 +222,25 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
if (sender->HasAura(GM_SILENCE_AURA) && type != CHAT_MSG_WHISPER)
{
SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str());
- return;
+ return ChatMessageResult::SilencedByGM;
}
if (msg.size() > 511)
- return;
+ return ChatMessageResult::MessageTooLong;
if (msg.empty())
- return;
+ return ChatMessageResult::MessageEmpty;
if (ChatHandler(this).ParseCommands(msg.c_str()))
- return;
+ return ChatMessageResult::HandledCommand;
// do message validity checks
if (!ValidateMessage(GetPlayer(), msg))
- return;
+ return ChatMessageResult::MessageHasInvalidCharacters;
// validate hyperlinks
if (!ValidateHyperlinksAndMaybeKick(msg))
- return;
+ return ChatMessageResult::MalformedHyperlinks;
switch (type)
{
@@ -248,12 +248,12 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
{
// Prevent cheating
if (!sender->IsAlive())
- return;
+ return ChatMessageResult::PlayerDead;
if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ))
{
SendNotification(GetTrinityString(LANG_SAY_REQ), sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ));
- return;
+ return ChatMessageResult::LevelTooLow;
}
sender->Say(msg, lang);
@@ -263,12 +263,12 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
{
// Prevent cheating
if (!sender->IsAlive())
- return;
+ return ChatMessageResult::PlayerDead;
if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_EMOTE_LEVEL_REQ))
{
SendNotification(GetTrinityString(LANG_SAY_REQ), sWorld->getIntConfig(CONFIG_CHAT_EMOTE_LEVEL_REQ));
- return;
+ return ChatMessageResult::LevelTooLow;
}
sender->TextEmote(msg);
@@ -278,12 +278,12 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
{
// Prevent cheating
if (!sender->IsAlive())
- return;
+ return ChatMessageResult::PlayerDead;
if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_YELL_LEVEL_REQ))
{
SendNotification(GetTrinityString(LANG_SAY_REQ), sWorld->getIntConfig(CONFIG_CHAT_YELL_LEVEL_REQ));
- return;
+ return ChatMessageResult::LevelTooLow;
}
sender->Yell(msg, lang);
@@ -304,7 +304,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
if (!receiver || (lang != LANG_ADDON && !receiver->isAcceptWhispers() && receiver->GetSession()->HasPermission(rbac::RBAC_PERM_CAN_FILTER_WHISPERS) && !receiver->IsInWhisperWhiteList(sender->GetGUID())))
{
SendChatPlayerNotfoundNotice(target);
- return;
+ return ChatMessageResult::NoWhisperTarget;
}
// Apply checks only if receiver is not already in whitelist and if receiver is not a GM with ".whisper on"
@@ -313,20 +313,20 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
if (!sender->IsGameMaster() && sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ))
{
SendNotification(GetTrinityString(LANG_WHISPER_REQ), sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ));
- return;
+ return ChatMessageResult::LevelTooLow;
}
if (GetPlayer()->GetEffectiveTeam() != receiver->GetEffectiveTeam() && !HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT))
{
SendChatPlayerNotfoundNotice(target);
- return;
+ return ChatMessageResult::WhisperTargetWrongFaction;
}
}
if (GetPlayer()->HasAura(1852) && !receiver->IsGameMaster())
{
SendNotification(GetTrinityString(LANG_GM_SILENCE), GetPlayer()->GetName().c_str());
- return;
+ return ChatMessageResult::SilencedByGM;
}
// If player is a Gamemaster and doesn't accept whisper, we auto-whitelist every player that the Gamemaster is talking to
@@ -346,7 +346,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
{
group = sender->GetGroup();
if (!group || group->isBGGroup())
- return;
+ return ChatMessageResult::NotInGroup;
}
if (group->IsLeader(GetPlayer()->GetGUID()))
@@ -389,7 +389,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
{
Group* group = GetPlayer()->GetGroup();
if (!group || !group->isRaidGroup() || group->isBGGroup())
- return;
+ return ChatMessageResult::NotInGroup;
if (group->IsLeader(GetPlayer()->GetGUID()))
type = CHAT_MSG_RAID_LEADER;
@@ -404,8 +404,16 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
case CHAT_MSG_RAID_WARNING:
{
Group* group = GetPlayer()->GetGroup();
- if (!group || !(group->isRaidGroup() || sWorld->getBoolConfig(CONFIG_CHAT_PARTY_RAID_WARNINGS)) || !(group->IsLeader(GetPlayer()->GetGUID()) || group->IsAssistant(GetPlayer()->GetGUID())) || group->isBGGroup())
- return;
+ if (!group)
+ return ChatMessageResult::NotInGroup;
+
+ if (group->isRaidGroup())
+ {
+ if (!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID()))
+ return ChatMessageResult::NotLeaderOrAssistant;
+ }
+ else if (!sWorld->getBoolConfig(CONFIG_CHAT_PARTY_RAID_WARNINGS))
+ return ChatMessageResult::RaidWarningInPartyDisabled;
sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
@@ -422,7 +430,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_CHANNEL_LEVEL_REQ))
{
SendNotification(GetTrinityString(LANG_CHANNEL_REQ), sWorld->getIntConfig(CONFIG_CHAT_CHANNEL_LEVEL_REQ));
- return;
+ return ChatMessageResult::LevelTooLow;
}
}
@@ -433,7 +441,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
{
if (ChatChannelsEntry const* chatChannel = sChatChannelsStore.LookupEntry(chn->GetChannelId()))
if (chatChannel->GetFlags().HasFlag(ChatChannelFlags::ReadOnly))
- return;
+ return ChatMessageResult::ChannelIsReadOnly;
sScriptMgr->OnPlayerChat(sender, type, lang, msg, chn);
chn->Say(sender->GetGUID(), msg, lang);
@@ -444,7 +452,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
{
Group* group = GetPlayer()->GetGroup();
if (!group)
- return;
+ return ChatMessageResult::NotInGroup;
if (group->IsLeader(GetPlayer()->GetGUID()))
type = CHAT_MSG_INSTANCE_CHAT_LEADER;
@@ -460,6 +468,8 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
TC_LOG_ERROR("network", "CHAT: unknown message type {}, lang: {}", type, lang);
break;
}
+
+ return ChatMessageResult::Ok;
}
void WorldSession::HandleChatAddonMessageOpcode(WorldPackets::Chat::ChatAddonMessage& chatAddonMessage)