From e4bd380c0ddac448c8dfde5e16dc63d84b74f5a4 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sun, 5 Apr 2026 04:50:40 -0700 Subject: [PATCH] fix(chat): prevent AFK/DND auto-reply whisper spam loop Auto-reply was sent on every incoming whisper with no dedup, causing infinite loops when both players had auto-reply enabled. Now tracks which senders have been replied to and only sends one auto-reply per sender per AFK/DND session. --- include/game/chat_handler.hpp | 5 +++++ src/game/chat_handler.cpp | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/game/chat_handler.hpp b/include/game/chat_handler.hpp index 22c3f00c..f4e55c16 100644 --- a/include/game/chat_handler.hpp +++ b/include/game/chat_handler.hpp @@ -8,6 +8,7 @@ #include #include #include +#include #include namespace wowee { @@ -67,6 +68,10 @@ private: std::deque chatHistory_; size_t maxChatHistory_ = 100; std::vector joinedChannels_; + + // Track senders we've already auto-replied to (AFK/DND) this session + // to prevent infinite reply loops. Cleared when AFK/DND is toggled off. + std::unordered_set afkAutoRepliedSenders_; }; } // namespace game diff --git a/src/game/chat_handler.cpp b/src/game/chat_handler.cpp index 0c3dcd83..15525808 100644 --- a/src/game/chat_handler.cpp +++ b/src/game/chat_handler.cpp @@ -264,10 +264,11 @@ void ChatHandler::handleMessageChat(network::Packet& packet) { owner_.lastWhisperSender_ = data.senderName; if (!data.senderName.empty()) { - if (owner_.afkStatus_) { + // Only auto-reply once per sender per AFK/DND session to prevent loops + if (owner_.afkStatus_ && afkAutoRepliedSenders_.insert(data.senderName).second) { std::string reply = owner_.afkMessage_.empty() ? "Away from Keyboard" : owner_.afkMessage_; sendChatMessage(ChatType::WHISPER, " " + reply, data.senderName); - } else if (owner_.dndStatus_) { + } else if (owner_.dndStatus_ && afkAutoRepliedSenders_.insert(data.senderName).second) { std::string reply = owner_.dndMessage_.empty() ? "Do Not Disturb" : owner_.dndMessage_; sendChatMessage(ChatType::WHISPER, " " + reply, data.senderName); } @@ -621,6 +622,7 @@ void ChatHandler::toggleAfk(const std::string& message) { } else { addSystemChatMessage("You are no longer AFK."); owner_.afkMessage_.clear(); + afkAutoRepliedSenders_.clear(); } LOG_INFO("AFK status: ", owner_.afkStatus_, ", message: ", message); @@ -644,6 +646,7 @@ void ChatHandler::toggleDnd(const std::string& message) { } else { addSystemChatMessage("You are no longer DND."); owner_.dndMessage_.clear(); + afkAutoRepliedSenders_.clear(); } LOG_INFO("DND status: ", owner_.dndStatus_, ", message: ", message);