diff options
Diffstat (limited to 'src/server/game/Handlers/ChatHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/ChatHandler.cpp | 76 |
1 files changed, 55 insertions, 21 deletions
diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 90aebd35b84..ff0b0c2214c 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -30,6 +30,7 @@ #include "Group.h" #include "Guild.h" #include "GuildMgr.h" +#include "Hyperlinks.h" #include "Language.h" #include "Log.h" #include "ObjectAccessor.h" @@ -42,6 +43,37 @@ #include "World.h" #include "WorldPacket.h" +static void StripInvisibleChars(std::string& str) +{ + static std::string const invChars = " \t\7\n"; + + size_t wpos = 0; + + bool space = false; + for (size_t pos = 0; pos < str.size(); ++pos) + { + if (invChars.find(str[pos]) != std::string::npos) + { + if (!space) + { + str[wpos++] = ' '; + space = true; + } + } + else + { + if (wpos != pos) + str[wpos++] = str[pos]; + else + ++wpos; + space = false; + } + } + + if (wpos < str.size()) + str.erase(wpos, str.size()); +} + void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) { uint32 type; @@ -180,7 +212,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) } std::string to, channel, msg; - bool ignoreChecks = false; switch (type) { case CHAT_MSG_SAY: @@ -195,6 +226,8 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) case CHAT_MSG_RAID_WARNING: case CHAT_MSG_BATTLEGROUND: case CHAT_MSG_BATTLEGROUND_LEADER: + case CHAT_MSG_AFK: + case CHAT_MSG_DND: recvData >> msg; break; case CHAT_MSG_WHISPER: @@ -205,44 +238,45 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) recvData >> channel; recvData >> msg; break; - case CHAT_MSG_AFK: - case CHAT_MSG_DND: - recvData >> msg; - ignoreChecks = true; - break; } - if (!ignoreChecks) + // Strip invisible characters for non-addon messages + if (sWorld->getBoolConfig(CONFIG_CHAT_FAKE_MESSAGE_PREVENTING) && lang != LANG_ADDON) + StripInvisibleChars(msg); + + // no chat commands in AFK/DND autoreply, and it can be empty + if (!(type == CHAT_MSG_AFK || type == CHAT_MSG_DND)) { if (msg.empty()) return; - if (lang == LANG_ADDON) { if (AddonChannelCommandHandler(this).ParseCommands(msg.c_str())) return; } - if (lang != LANG_ADDON) + else { if (ChatHandler(this).ParseCommands(msg.c_str())) return; - // Strip invisible characters for non-addon messages - if (sWorld->getBoolConfig(CONFIG_CHAT_FAKE_MESSAGE_PREVENTING)) - stripLineInvisibleChars(msg); - - if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY) && !ChatHandler(this).isValidChatMessage(msg.c_str())) - { - TC_LOG_ERROR("network", "Player %s (GUID: %u) sent a chatmessage with an invalid link: %s", GetPlayer()->GetName().c_str(), - GetPlayer()->GetGUID().GetCounter(), msg.c_str()); + } + } - if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_KICK)) - KickPlayer(); + bool validMessage = Trinity::Hyperlinks::ValidateLinks(msg); + if (!validMessage) + { + TC_LOG_ERROR("network", "Player %s (GUID: %u) sent a chatmessage with an invalid link - corrected", GetPlayer()->GetName().c_str(), + GetPlayer()->GetGUID().GetCounter()); - return; - } + if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_KICK)) + { + KickPlayer(); + return; } } + if (msg.length() > 255) + return; + switch (type) { case CHAT_MSG_SAY: |