diff options
author | stoneharry <stoneharryjames@gmail.com> | 2022-04-17 00:27:28 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-17 00:27:28 +0200 |
commit | 5384fc194f9061bbac314abb66a9bac88aaaf760 (patch) | |
tree | 24817fab6b57eeceb391a14f086c23953114a076 | |
parent | 0d0cb23a634a37e2d679a5b8ec2e078d20def66a (diff) |
Core/Chat: Apply chat flood control to addon messages as well (#26908)
Co-authored-by: Shauren <shauren.trinity@gmail.com>
-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 | 21 | ||||
-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, 69 insertions, 27 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 8eb22328511..d67598558e0 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -173,9 +173,6 @@ uint32 const MAX_MONEY_AMOUNT = static_cast<uint32>(std::numeric_limits<int32>:: Player::Player(WorldSession* session): Unit(true) { - m_speakTime = 0; - m_speakCount = 0; - m_objectType |= TYPEMASK_PLAYER; m_objectTypeId = TYPEID_PLAYER; @@ -20279,34 +20276,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 b08fd00b72b..646d98925b3 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1969,7 +1969,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 ***/ @@ -2297,8 +2310,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> uint32 m_team; uint32 m_nextSave; - time_t m_speakTime; - uint32 m_speakCount; + std::array<ChatFloodThrottle, ChatFloodThrottle::MAX> m_chatFloodData; Difficulty m_dungeonDifficulty; Difficulty m_raidDifficulty; Difficulty m_raidMapDifficulty; diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index c9e69ba6c0a..6e3d5765179 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -135,7 +135,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) return; } } - // LANG_ADDON should not be changed nor be affected by flood control else { // send in universal language if player in .gm on mode (ignore spell effects) @@ -170,19 +169,19 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) } } } + } - if (!CanSpeak()) - { - std::string timeStr = secsToTimeString(m_muteTime - GameTime::GetGameTime()); - SendNotification(GetTrinityString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str()); - recvData.rfinish(); // Prevent warnings - return; - } - - if (type != CHAT_MSG_AFK && type != CHAT_MSG_DND) - sender->UpdateSpeakTime(); + if (!CanSpeak()) + { + std::string timeStr = secsToTimeString(m_muteTime - GameTime::GetGameTime()); + SendNotification(GetTrinityString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str()); + recvData.rfinish(); // Prevent warnings + return; } + if (type != CHAT_MSG_AFK && type != CHAT_MSG_DND) + sender->UpdateSpeakTime(lang == LANG_ADDON ? Player::ChatFloodThrottle::ADDON : Player::ChatFloodThrottle::REGULAR); + if (sender->HasAura(1852) && type != CHAT_MSG_WHISPER) { SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str()); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 2d8882dcaec..77c474439c3 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1106,6 +1106,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 eeda8e69709..8119d1321c8 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -281,6 +281,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 4842ac12b5a..442681e6465 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -1994,8 +1994,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 |