diff options
author | stoneharry <stoneharryjames@gmail.com> | 2022-04-17 00:27:28 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-06-10 16:56:23 +0200 |
commit | 1046a027f232322b3a8e9e87d0e846cd9a4a0f16 (patch) | |
tree | 58cec33a710012857c6badf2e45c3aa2b8597832 | |
parent | a196f8fdecd95fa80342d6db8247f04c8bba1ac4 (diff) |
Core/Chat: Apply chat flood control to addon messages as well (#26908)
Co-authored-by: Shauren <shauren.trinity@gmail.com>
(cherry picked from commit 5384fc194f9061bbac314abb66a9bac88aaaf760)
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 36 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 18 | ||||
-rw-r--r-- | src/server/game/Handlers/ChatHandler.cpp | 8 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 2 | ||||
-rw-r--r-- | src/server/game/World/World.h | 2 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 17 |
6 files changed, 67 insertions, 16 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index db92c47349b..481f18c4b82 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -140,9 +140,6 @@ uint64 const MAX_MONEY_AMOUNT = 99999999999ULL; Player::Player(WorldSession* session) : Unit(true), m_sceneMgr(this) { - m_speakTime = 0; - m_speakCount = 0; - m_objectType |= TYPEMASK_PLAYER; m_objectTypeId = TYPEID_PLAYER; @@ -21649,34 +21646,49 @@ void Player::outDebugValues() const /*** FLOOD FILTER SYSTEM ***/ /*********************************************************/ -void Player::UpdateSpeakTime() +void Player::UpdateSpeakTime(ChatFloodThrottle::Index index) { // ignore chat spam protection for GMs in any mode if (GetSession()->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHAT_SPAM)) return; + uint32 limit; + uint32 delay; + switch (index) + { + case ChatFloodThrottle::REGULAR: + limit = sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_COUNT); + delay = sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_DELAY); + break; + case ChatFloodThrottle::ADDON: + limit = sWorld->getIntConfig(CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT); + delay = sWorld->getIntConfig(CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY); + break; + default: + return; + } + time_t current = GameTime::GetGameTime(); - if (m_speakTime > current) + if (m_chatFloodData[index].Time > current) { - uint32 max_count = sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_COUNT); - if (!max_count) + if (!limit) return; - ++m_speakCount; - if (m_speakCount >= max_count) + ++m_chatFloodData[index].Count; + if (m_chatFloodData[index].Count >= limit) { // prevent overwrite mute time, if message send just before mutes set, for example. time_t new_mute = current + sWorld->getIntConfig(CONFIG_CHATFLOOD_MUTE_TIME); if (GetSession()->m_muteTime < new_mute) GetSession()->m_muteTime = new_mute; - m_speakCount = 0; + m_chatFloodData[index].Count = 0; } } else - m_speakCount = 1; + m_chatFloodData[index].Count = 1; - m_speakTime = current + sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_DELAY); + m_chatFloodData[index].Time = current + delay; } /*********************************************************/ diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 3f366b41c72..ffb20f35682 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2433,7 +2433,20 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> /*** FLOOD FILTER SYSTEM ***/ /*********************************************************/ - void UpdateSpeakTime(); + struct ChatFloodThrottle + { + enum Index + { + REGULAR = 0, + ADDON = 1, + MAX + }; + + time_t Time = 0; + uint32 Count = 0; + }; + + void UpdateSpeakTime(ChatFloodThrottle::Index index); /*********************************************************/ /*** VARIOUS SYSTEMS ***/ @@ -2952,8 +2965,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> uint32 m_team; uint32 m_nextSave; bool m_customizationsChanged; - time_t m_speakTime; - uint32 m_speakCount; + std::array<ChatFloodThrottle, ChatFloodThrottle::MAX> m_chatFloodData; Difficulty m_dungeonDifficulty; Difficulty m_raidDifficulty; Difficulty m_legacyRaidDifficulty; diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index db8fa111fe4..622914055fa 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -208,6 +208,9 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms return; } + if (type != CHAT_MSG_AFK && type != CHAT_MSG_DND) + sender->UpdateSpeakTime(Player::ChatFloodThrottle::REGULAR); + if (sender->HasAura(GM_SILENCE_AURA) && type != CHAT_MSG_WHISPER) { SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str()); @@ -476,6 +479,11 @@ void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std: if (!sWorld->getBoolConfig(CONFIG_ADDON_CHANNEL)) return; + if (!CanSpeak()) + return; + + sender->UpdateSpeakTime(Player::ChatFloodThrottle::ADDON); + if (prefix == AddonChannelCommandHandler::PREFIX && AddonChannelCommandHandler(this).ParseCommands(text.c_str())) return; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 7b04ccaf462..c483947f5bf 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1220,6 +1220,8 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_CHATFLOOD_MESSAGE_COUNT] = sConfigMgr->GetIntDefault("ChatFlood.MessageCount", 10); m_int_configs[CONFIG_CHATFLOOD_MESSAGE_DELAY] = sConfigMgr->GetIntDefault("ChatFlood.MessageDelay", 1); + m_int_configs[CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT] = sConfigMgr->GetIntDefault("ChatFlood.AddonMessageCount", 100); + m_int_configs[CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY] = sConfigMgr->GetIntDefault("ChatFlood.AddonMessageDelay", 1); m_int_configs[CONFIG_CHATFLOOD_MUTE_TIME] = sConfigMgr->GetIntDefault("ChatFlood.MuteTime", 10); m_bool_configs[CONFIG_EVENT_ANNOUNCE] = sConfigMgr->GetBoolDefault("Event.Announce", false); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 4e2d89b564b..eb49382921f 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -301,6 +301,8 @@ enum WorldIntConfigs CONFIG_EXPANSION, CONFIG_CHATFLOOD_MESSAGE_COUNT, CONFIG_CHATFLOOD_MESSAGE_DELAY, + CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT, + CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY, CONFIG_CHATFLOOD_MUTE_TIME, CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY, CONFIG_CREATURE_FAMILY_FLEE_DELAY, diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 71e82176a91..59c8b5ecdf6 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -2047,8 +2047,23 @@ ChatFlood.MessageCount = 10 ChatFlood.MessageDelay = 1 # +# ChatFlood.AddonMessageCount +# Description: Chat flood protection, number of addon messages before player gets muted. +# Default: 100 - (Enabled) +# 0 - (Disabled) + +ChatFlood.AddonMessageCount = 100 + +# +# ChatFlood.AddonMessageDelay +# Description: Time (in seconds) between addon messages to be counted into ChatFlood.AddonMessageCount. +# Default: 1 + +ChatFlood.AddonMessageDelay = 1 + +# # ChatFlood.MuteTime -# Description: Time (in seconds) characters get muted for violating ChatFlood.MessageCount. +# Description: Time (in seconds) characters get muted for violating ChatFlood.MessageCount / ChatFlood.AddonMessageCount. # Default: 10 ChatFlood.MuteTime = 10 |