From 52c9c38223f7c247baadaeffd60f72e9100a57c5 Mon Sep 17 00:00:00 2001 From: TotallyNotElite <1yourexperiment@protonmail.com> Date: Sat, 19 Oct 2019 23:08:18 +0200 Subject: [PATCH] Fix anti party spam crash code Increased code quality Void messages until spam stops --- src/hooks/FireEventClientSide.cpp | 68 ++++++++++++++++--------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/src/hooks/FireEventClientSide.cpp b/src/hooks/FireEventClientSide.cpp index eccfa16a..3331ccb5 100644 --- a/src/hooks/FireEventClientSide.cpp +++ b/src/hooks/FireEventClientSide.cpp @@ -21,44 +21,46 @@ static settings::Boolean enable_antispam{ "chat.party.anticrash.enabled", "false // max messages in 5 seconds before being flagged static settings::Int spam_rate{ "chat.party.anticrash.limit-rate", "12" }; -int messages_since_reset{ 0 }; -Timer spam_timer{}; +static int spam_messages_since_reset{ 0 }; +static Timer spam_timer{}; +static bool spam_blocked = true; DEFINE_HOOKED_METHOD(FireEventClientSide, bool, IGameEventManager2 *this_, IGameEvent *event) { - if (enable_antispam) - if (!strcmp(event->GetName(), "party_chat")) + if (enable_antispam && strcmp(event->GetName(), "party_chat") == 0) + { + // Increase total count + spam_messages_since_reset++; + // Limit reached + if (spam_messages_since_reset > *spam_rate) { - // You have violated the law, please sit in timeout for your sins - if (messages_since_reset >= *spam_rate) - { - // Way to reuse same timer - if (messages_since_reset == *spam_rate) - { - spam_timer.test_and_set(0); - messages_since_reset++; - } - // You're free, now flee - if (spam_timer.check(15000)) - messages_since_reset = 0; - // How about we don't send that anywhere m'lad - else - return true; - } - - // Not banned yet - if (messages_since_reset < 12) - { - // Way to reset timer every 5 seconds - if (spam_timer.check(5000)) - { - spam_timer.test_and_set(0); - messages_since_reset = 0; - } - // Increment spam counter - messages_since_reset++; - } + spam_blocked = true; + spam_timer.update(); + spam_messages_since_reset = 0; } + + if (spam_blocked) + { + // Check if we can lift the ban again + if (spam_timer.test_and_set(10000)) + { + spam_messages_since_reset = 0; + // Need to readd 1 to the timer since the current message counts towards the next "epoch" + spam_messages_since_reset++; + spam_blocked = false; + } + else + // Void messages to avoid crash + return true; + } + // We havent reached the limit yet. Reset the limit if last reset is 5 seconds in the past + else if (spam_timer.test_and_set(5000)) + { + spam_messages_since_reset = 0; + // Need to readd 1 to the timer since the current message counts towards the next "epoch" + spam_messages_since_reset++; + } + } hacks::tf2::killstreak::fire_event(event); return original::FireEventClientSide(this_, event); }