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 /src/server/game/Entities | |
| parent | 0d0cb23a634a37e2d679a5b8ec2e078d20def66a (diff) | |
Core/Chat: Apply chat flood control to addon messages as well (#26908)
Co-authored-by: Shauren <shauren.trinity@gmail.com>
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 36 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 18 |
2 files changed, 39 insertions, 15 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; |
