aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorstoneharry <stoneharryjames@gmail.com>2022-04-17 00:27:28 +0200
committerGitHub <noreply@github.com>2022-04-17 00:27:28 +0200
commit5384fc194f9061bbac314abb66a9bac88aaaf760 (patch)
tree24817fab6b57eeceb391a14f086c23953114a076 /src/server/game/Entities
parent0d0cb23a634a37e2d679a5b8ec2e078d20def66a (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.cpp36
-rw-r--r--src/server/game/Entities/Player/Player.h18
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;