aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstoneharry <stoneharryjames@gmail.com>2022-04-17 00:27:28 +0200
committerShauren <shauren.trinity@gmail.com>2022-06-10 16:56:23 +0200
commit1046a027f232322b3a8e9e87d0e846cd9a4a0f16 (patch)
tree58cec33a710012857c6badf2e45c3aa2b8597832
parenta196f8fdecd95fa80342d6db8247f04c8bba1ac4 (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.cpp36
-rw-r--r--src/server/game/Entities/Player/Player.h18
-rw-r--r--src/server/game/Handlers/ChatHandler.cpp8
-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, 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