summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gui/widgets/tabs/chat/chattab.cpp4
-rw-r--r--src/gui/windows/chatwindow.cpp31
-rw-r--r--src/gui/windows/chatwindow.h6
-rw-r--r--src/net/eathena/chathandler.cpp24
-rw-r--r--src/net/eathena/chathandler.h2
5 files changed, 62 insertions, 5 deletions
diff --git a/src/gui/widgets/tabs/chat/chattab.cpp b/src/gui/widgets/tabs/chat/chattab.cpp
index 5dc18b329..3ba1ee00a 100644
--- a/src/gui/widgets/tabs/chat/chattab.cpp
+++ b/src/gui/widgets/tabs/chat/chattab.cpp
@@ -43,6 +43,7 @@
#include "input/inputmanager.h"
#include "net/chathandler.h"
+#include "net/serverfeatures.h"
#include "resources/iteminfo.h"
@@ -217,7 +218,8 @@ void ChatTab::chatLog(std::string line, ChatMsgType::Type own,
}
// if configured, move magic messages log to debug chat tab
- if (localChatTab && this == localChatTab
+ if (!serverFeatures->haveChatChannels()
+ && localChatTab && this == localChatTab
&& ((config.getBoolValue("showMagicInDebug")
&& own == ChatMsgType::BY_PLAYER
&& tmp.text.length() > 1
diff --git a/src/gui/windows/chatwindow.cpp b/src/gui/windows/chatwindow.cpp
index 4abc70561..5cf727d92 100644
--- a/src/gui/windows/chatwindow.cpp
+++ b/src/gui/windows/chatwindow.cpp
@@ -1559,6 +1559,10 @@ bool ChatWindow::resortChatLog(std::string line, ChatMsgType::Type own,
ignoreRecord, tryRemoveColors);
}
}
+ else if (serverFeatures->haveChatChannels())
+ {
+ channelChatLog(channel, line, own, ignoreRecord, tryRemoveColors);
+ }
else if (mShowAllLang)
{
localChatTab->chatLog(prefix + line, own,
@@ -1584,6 +1588,33 @@ void ChatWindow::battleChatLog(const std::string &line, ChatMsgType::Type own,
debugChatTab->chatLog(line, own, ignoreRecord, tryRemoveColors);
}
+void ChatWindow::channelChatLog(const std::string &channel,
+ const std::string &line,
+ ChatMsgType::Type own,
+ const bool ignoreRecord,
+ const bool tryRemoveColors)
+{
+ std::string tempChannel = channel;
+ toLower(tempChannel);
+
+ ChannelTab *tab = nullptr;
+ const ChannelMap::const_iterator i = mChannels.find(tempChannel);
+
+ if (i != mChannels.end())
+ {
+ tab = i->second;
+ }
+ else
+ {
+ tab = addChannelTab(channel, false);
+ if (tab)
+ saveState();
+ }
+
+ if (tab)
+ tab->chatLog(line, own, ignoreRecord, tryRemoveColors);
+}
+
void ChatWindow::localPetSay(const std::string &nick, const std::string &text)
{
Being *const being = actorManager->findBeingByName(
diff --git a/src/gui/windows/chatwindow.h b/src/gui/windows/chatwindow.h
index 068ec4111..b21930bd0 100644
--- a/src/gui/windows/chatwindow.h
+++ b/src/gui/windows/chatwindow.h
@@ -223,6 +223,12 @@ class ChatWindow final : public Window,
const bool ignoreRecord = false,
const bool tryRemoveColors = true);
+ void channelChatLog(const std::string &channel,
+ const std::string &line,
+ ChatMsgType::Type own,
+ const bool ignoreRecord,
+ const bool tryRemoveColors);
+
void updateOnline(const std::set<std::string> &onlinePlayers) const;
void loadState();
diff --git a/src/net/eathena/chathandler.cpp b/src/net/eathena/chathandler.cpp
index ac626fd71..b3f81e20a 100644
--- a/src/net/eathena/chathandler.cpp
+++ b/src/net/eathena/chathandler.cpp
@@ -380,19 +380,35 @@ void ChatHandler::processColorChat(Net::MessageIn &msg)
processChatContinue(msg.readRawString(chatMsgLength, "message"));
}
+std::string ChatHandler::extractChannelFromMessage(std::string &chatMsg)
+{
+ std::string msg = chatMsg;
+ std::string channel(GENERAL_CHANNEL);
+ if (findCutFirst(msg, "[ #"))
+ { // found channel message
+ const size_t idx = msg.find(" ] ");
+ if (idx != std::string::npos)
+ {
+ channel = std::string("#").append(msg.substr(0, idx));
+ chatMsg = msg.substr(idx + 3);
+ }
+ }
+ return channel;
+}
+
void ChatHandler::processChatContinue(std::string chatMsg)
{
- const size_t pos = chatMsg.find(" : ", 0);
-
+ const std::string channel = extractChannelFromMessage(chatMsg);
bool allow(true);
if (chatWindow)
{
allow = chatWindow->resortChatLog(chatMsg,
ChatMsgType::BY_PLAYER,
- GENERAL_CHANNEL,
+ channel,
false, true);
}
+ const size_t pos = chatMsg.find(" : ", 0);
if (pos != std::string::npos)
chatMsg.erase(0, pos + 3);
@@ -521,7 +537,7 @@ void ChatHandler::joinChannel(const std::string &channel)
{
// to join channel need use gm commands or send something.
// here we sending invisible message.
- channelMessage(channel, "\302\202G");
+ channelMessage(channel, "\302\202\302");
}
} // namespace EAthena
diff --git a/src/net/eathena/chathandler.h b/src/net/eathena/chathandler.h
index 418250eb1..86eeb1386 100644
--- a/src/net/eathena/chathandler.h
+++ b/src/net/eathena/chathandler.h
@@ -81,6 +81,8 @@ class ChatHandler final : public MessageHandler, public Ea::ChatHandler
const std::string &password) const override final;
protected:
+ static std::string extractChannelFromMessage(std::string &chatMsg);
+
void processChat(Net::MessageIn &msg);
void processColorChat(Net::MessageIn &msg);