fix(chat): resolve /r reply target when name arrives after whisper

Whisper sender name may not be in the player name cache when the packet
arrives. Store the sender GUID and lazily resolve the name from the
cache in getLastWhisperSender(). Also backfill lastWhisperSender_ when
the SMSG_NAME_QUERY_RESPONSE arrives.
This commit is contained in:
Kelsi 2026-04-04 00:03:05 -07:00
parent c85d023329
commit 5538655383
4 changed files with 31 additions and 9 deletions

View file

@ -255,15 +255,22 @@ void ChatHandler::handleMessageChat(network::Packet& packet) {
}
// Track whisper sender for /r command
if (data.type == ChatType::WHISPER && !data.senderName.empty()) {
owner_.lastWhisperSender_ = data.senderName;
if (data.type == ChatType::WHISPER) {
// Always store GUID so getLastWhisperSender() can resolve the name
// from the player name cache even if name wasn't available yet
if (data.senderGuid != 0)
owner_.lastWhisperSenderGuid_ = data.senderGuid;
if (!data.senderName.empty())
owner_.lastWhisperSender_ = data.senderName;
if (owner_.afkStatus_ && !data.senderName.empty()) {
std::string reply = owner_.afkMessage_.empty() ? "Away from Keyboard" : owner_.afkMessage_;
sendChatMessage(ChatType::WHISPER, "<AFK> " + reply, data.senderName);
} else if (owner_.dndStatus_ && !data.senderName.empty()) {
std::string reply = owner_.dndMessage_.empty() ? "Do Not Disturb" : owner_.dndMessage_;
sendChatMessage(ChatType::WHISPER, "<DND> " + reply, data.senderName);
if (!data.senderName.empty()) {
if (owner_.afkStatus_) {
std::string reply = owner_.afkMessage_.empty() ? "Away from Keyboard" : owner_.afkMessage_;
sendChatMessage(ChatType::WHISPER, "<AFK> " + reply, data.senderName);
} else if (owner_.dndStatus_) {
std::string reply = owner_.dndMessage_.empty() ? "Do Not Disturb" : owner_.dndMessage_;
sendChatMessage(ChatType::WHISPER, "<DND> " + reply, data.senderName);
}
}
}