diff options
author | Heaven31415 <heaven31415@gmail.com> | 2019-02-16 13:29:22 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-11-23 23:07:23 +0100 |
commit | 0ea3fe545c6582de23fb264627b27f27fc2a21ff (patch) | |
tree | c5d55c842b3c44df72ad8495c2e607d10a22209b | |
parent | ee0662ca3ded2b9cd5ecd9f8a506ed3309a858d7 (diff) |
Refactor SendSysMessage, SendGlobalSysMessage, SendGlobalGMSysMessage (#23029)
(cherry picked from commit 9db50f05cb7d225f3bd7b2a209509a072f915fd3)
-rw-r--r-- | src/server/game/Chat/Chat.cpp | 57 |
1 files changed, 14 insertions, 43 deletions
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 434dbb67d1e..146410f0fbc 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -172,75 +172,46 @@ bool ChatHandler::hasStringAbbr(const char* name, const char* part) void ChatHandler::SendSysMessage(const char *str, bool escapeCharacters) { - WorldPackets::Chat::Chat packet; - - // need copy to prevent corruption by strtok call in LineFromMessage original string - char* buf; - char* pos; + std::string msg{ str }; - if (escapeCharacters && strchr(str, '|')) + // Replace every "|" with "||" in msg + if (escapeCharacters && msg.find('|') != std::string::npos) { - size_t startPos = 0; - std::ostringstream o; - while (const char* charPos = strchr(str + startPos, '|')) - { - o.write(str + startPos, charPos - str - startPos); - o << "||"; - startPos = charPos - str + 1; - } - o.write(str + startPos, strlen(str) - startPos); - buf = strdup(o.str().c_str()); - } - else - { - buf = strdup(str); - } + Tokenizer tokens{msg, '|'}; + std::ostringstream stream; + for (size_t i = 0; i < tokens.size() - 1; ++i) + stream << tokens[i] << "||"; + stream << tokens[tokens.size() - 1]; - pos = buf; + msg = stream.str(); + } - while (char* line = LineFromMessage(pos)) + WorldPackets::Chat::Chat packet; + for (const auto& line : Tokenizer{msg, '\n'}) { packet.Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); m_session->SendPacket(packet.Write()); } - - free(buf); } void ChatHandler::SendGlobalSysMessage(const char *str) { - // Chat output WorldPackets::Chat::Chat packet; - - // need copy to prevent corruption by strtok call in LineFromMessage original string - char* buf = strdup(str); - char* pos = buf; - - while (char* line = LineFromMessage(pos)) + for (const auto& line : Tokenizer{str, '\n'}) { packet.Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); sWorld->SendGlobalMessage(packet.Write()); } - - free(buf); } void ChatHandler::SendGlobalGMSysMessage(const char *str) { - // Chat output WorldPackets::Chat::Chat packet; - - // need copy to prevent corruption by strtok call in LineFromMessage original string - char* buf = strdup(str); - char* pos = buf; - - while (char* line = LineFromMessage(pos)) + for (const auto& line : Tokenizer{str, '\n'}) { packet.Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); sWorld->SendGlobalGMMessage(packet.Write()); } - - free(buf); } void ChatHandler::SendSysMessage(uint32 entry) |