diff options
Diffstat (limited to 'src/server/game/Handlers/ChatHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/ChatHandler.cpp | 68 |
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) |