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);