From 05d41da56882a14b44648c8daed5f50979154c16 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 12 Oct 2014 21:37:33 +0300 Subject: Add basic support for chat channels. --- src/actions/chat.cpp | 11 ++-- src/gui/widgets/tabs/chat/whispertab.cpp | 2 +- src/gui/windows/chatwindow.cpp | 107 ++++++++++++++++++++++++++----- src/gui/windows/chatwindow.h | 14 ++++ 4 files changed, 111 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/actions/chat.cpp b/src/actions/chat.cpp index d838aac06..379d7d49c 100644 --- a/src/actions/chat.cpp +++ b/src/actions/chat.cpp @@ -223,9 +223,10 @@ impHandler(msg) impHandler(query) { + const std::string &args = event.args; if (chatWindow) { - if (chatWindow->addWhisperTab(event.args, true)) + if (chatWindow->addChatTab(args, true)) { chatWindow->saveState(); return true; @@ -234,10 +235,10 @@ impHandler(query) if (event.tab) { - // TRANSLATORS: new whisper query - event.tab->chatLog(strprintf(_("Cannot create a whisper tab for nick " - "\"%s\"! It either already exists, or is you."), - event.args.c_str()), ChatMsgType::BY_SERVER); + // TRANSLATORS: new whisper or channel query + event.tab->chatLog(strprintf(_("Cannot create a whisper tab " + "\"%s\"! It either already exists."), + args.c_str()), ChatMsgType::BY_SERVER); } return true; } diff --git a/src/gui/widgets/tabs/chat/whispertab.cpp b/src/gui/widgets/tabs/chat/whispertab.cpp index fc68cb222..e1740d808 100644 --- a/src/gui/widgets/tabs/chat/whispertab.cpp +++ b/src/gui/widgets/tabs/chat/whispertab.cpp @@ -38,7 +38,7 @@ WhisperTab::WhisperTab(const Widget2 *const widget, const std::string &nick) : - ChatTab(widget, nick, "", nick, ChatTabType::WHISPER), + ChatTab(widget, nick, nick, nick, ChatTabType::WHISPER), mNick(nick) { setWhisperTabColors(); diff --git a/src/gui/windows/chatwindow.cpp b/src/gui/windows/chatwindow.cpp index a6a96be5b..3a59279cc 100644 --- a/src/gui/windows/chatwindow.cpp +++ b/src/gui/windows/chatwindow.cpp @@ -49,17 +49,17 @@ #include "gui/windows/emotewindow.h" #include "gui/windows/setupwindow.h" -#include "gui/widgets/tabbedarea.h" #include "gui/windows/whoisonline.h" -#include "gui/widgets/tabs/chat/battletab.h" - #include "gui/widgets/button.h" #include "gui/widgets/chatinput.h" #include "gui/widgets/dropdown.h" #include "gui/widgets/itemlinkhandler.h" #include "gui/widgets/scrollarea.h" +#include "gui/widgets/tabbedarea.h" +#include "gui/widgets/tabs/chat/battletab.h" +#include "gui/widgets/tabs/chat/channeltab.h" #include "gui/widgets/tabs/chat/langtab.h" #include "gui/widgets/tabs/chat/tradetab.h" #include "gui/widgets/tabs/chat/whispertab.h" @@ -67,6 +67,7 @@ #include "render/opengldebug.h" #include "net/chathandler.h" +#include "net/serverfeatures.h" #include "utils/copynpaste.h" #include "utils/delete2.h" @@ -94,6 +95,7 @@ ChatWindow::ChatWindow() : mChatInput(new ChatInput(this)), mRainbowColor(0), mWhispers(), + mChannels(), mHistory(), mCurHist(), mCommands(), @@ -200,6 +202,7 @@ ChatWindow::~ChatWindow() saveState(); config.setValue("ReturnToggles", mReturnToggles); removeAllWhispers(); + removeAllChannels(); delete2(mItemLinkHandler); delete2(mColorPicker); delete2(mColorListModel); @@ -559,6 +562,22 @@ void ChatWindow::removeAllWhispers() mWhispers.clear(); } +void ChatWindow::removeAllChannels() +{ + std::list tabs; + + FOR_EACH (ChannelMap::iterator, iter, mChannels) + tabs.push_back(iter->second); + + for (std::list::iterator it = tabs.begin(); + it != tabs.end(); ++it) + { + delete *it; + } + + mChannels.clear(); +} + void ChatWindow::ignoreAllWhispers() { for (TabMap::iterator iter = mWhispers.begin(); @@ -1149,6 +1168,46 @@ WhisperTab *ChatWindow::getWhisperTab(const std::string &nick) const return ret; } +ChannelTab *ChatWindow::addChannelTab(const std::string &name, + const bool switchTo) +{ + std::string tempName = name; + toLower(tempName); + + const ChannelMap::const_iterator i = mChannels.find(tempName); + ChannelTab *ret = nullptr; + + if (i != mChannels.end()) + { + ret = i->second; + } + else + { + ret = new ChannelTab(this, name); + mChannels[tempName] = ret; + if (config.getBoolValue("showChatHistory")) + ret->loadFromLogFile(name); + } + + if (switchTo) + mChatTabs->setSelectedTab(ret); + + return ret; +} + +ChatTab *ChatWindow::addChatTab(const std::string &name, + const bool switchTo) +{ + if (serverFeatures->haveChatChannels() && name.size() > 1 + && name[0] == '#') + { + return addChannelTab(name, switchTo); + } + else + { + return addWhisperTab(name, switchTo); + } +} #define changeColor(fun) \ { \ @@ -1636,7 +1695,7 @@ void ChatWindow::loadState() const int flags = serverConfig.getValue( "chatWhisperFlags" + toString(num), 1); - ChatTab *const tab = addWhisperTab(nick); + ChatTab *const tab = addChatTab(nick, false); if (tab) { tab->setAllowHighlight(flags & 1); @@ -1650,25 +1709,23 @@ void ChatWindow::loadState() void ChatWindow::saveState() const { int num = 0; + for (ChannelMap::const_iterator iter = mChannels.begin(), + iter_end = mChannels.end(); iter != iter_end && num < 50; ++iter) + { + if (!iter->second) + return; + if (!saveTab(num, iter->second)) + continue; + num ++; + } + for (TabMap::const_iterator iter = mWhispers.begin(), iter_end = mWhispers.end(); iter != iter_end && num < 50; ++iter) { if (!iter->second) return; - - const WhisperTab *const tab = static_cast(iter->second); - - if (!tab) + if (!saveTab(num, iter->second)) continue; - - serverConfig.setValue("chatWhisper" + toString(num), - tab->getNick()); - - serverConfig.setValue("chatWhisperFlags" + toString(num), - static_cast(tab->getAllowHighlight()) - + (2 * static_cast(tab->getRemoveNames())) - + (4 * static_cast(tab->getNoAway()))); - num ++; } @@ -1680,6 +1737,22 @@ void ChatWindow::saveState() const } } +bool ChatWindow::saveTab(const int num, ChatTab *const tab) const +{ + if (!tab) + return false; + + serverConfig.setValue("chatWhisper" + toString(num), + tab->getChannelName()); + + serverConfig.setValue("chatWhisperFlags" + toString(num), + static_cast(tab->getAllowHighlight()) + + (2 * static_cast(tab->getRemoveNames())) + + (4 * static_cast(tab->getNoAway()))); + + return true; +} + std::string ChatWindow::doReplace(const std::string &msg) { std::string str = msg; diff --git a/src/gui/windows/chatwindow.h b/src/gui/windows/chatwindow.h index d6b89fbd1..313a65803 100644 --- a/src/gui/windows/chatwindow.h +++ b/src/gui/windows/chatwindow.h @@ -38,6 +38,7 @@ #include class Button; +class ChannelTab; class ChatTab; class ChatInput; class ColorListModel; @@ -198,8 +199,16 @@ class ChatWindow final : public Window, WhisperTab *getWhisperTab(const std::string &nick) const A_WARN_UNUSED; + ChannelTab *addChannelTab(const std::string &name, + const bool switchTo = false) A_WARN_UNUSED; + + ChatTab *addChatTab(const std::string &name, + const bool switchTo = false) A_WARN_UNUSED; + void removeAllWhispers(); + void removeAllChannels(); + void ignoreAllWhispers(); bool resortChatLog(std::string line, ChatMsgType::Type own, @@ -219,6 +228,8 @@ class ChatWindow final : public Window, void saveState() const; + bool saveTab(const int num, ChatTab *const tab) const; + void loadCustomList(); void loadGMCommands(); @@ -332,8 +343,11 @@ class ChatWindow final : public Window, bool addCurrentToHistory(); typedef std::map TabMap; + typedef std::map ChannelMap; + /** Manage whisper tabs */ TabMap mWhispers; + ChannelMap mChannels; typedef History::iterator HistoryIterator; History mHistory; /**< Command history. */ -- cgit v1.2.3-70-g09d2