aboutsummaryrefslogtreecommitdiff
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
parent0d0cb23a634a37e2d679a5b8ec2e078d20def66a (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.cpp36
-rw-r--r--src/server/game/Entities/Player/Player.h18
-rw-r--r--src/server/game/Handlers/ChatHandler.cpp21
-rw-r--r--src/server/game/World/World.cpp2
-rw-r--r--src/server/game/World/World.h2
-rw-r--r--src/server/worldserver/worldserver.conf.dist17
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