summaryrefslogtreecommitdiff
path: root/src/gui/windows/chatwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/windows/chatwindow.cpp')
-rw-r--r--src/gui/windows/chatwindow.cpp2181
1 files changed, 0 insertions, 2181 deletions
diff --git a/src/gui/windows/chatwindow.cpp b/src/gui/windows/chatwindow.cpp
deleted file mode 100644
index aa899202d..000000000
--- a/src/gui/windows/chatwindow.cpp
+++ /dev/null
@@ -1,2181 +0,0 @@
-/*
- * The ManaPlus Client
- * Copyright (C) 2004-2009 The Mana World Development Team
- * Copyright (C) 2009-2010 The Mana Developers
- * Copyright (C) 2011-2017 The ManaPlus Developers
- *
- * This file is part of The ManaPlus Client.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "gui/windows/chatwindow.h"
-
-#include "actormanager.h"
-#include "game.h"
-#include "guild.h"
-#include "party.h"
-#include "settings.h"
-#include "spellmanager.h"
-
-#include "being/localplayer.h"
-#include "being/playerinfo.h"
-#include "being/playerrelations.h"
-
-#include "const/gui/chat.h"
-
-#include "fs/virtfs/tools.h"
-
-#include "input/inputmanager.h"
-
-#include "gui/focushandler.h"
-#include "gui/gui.h"
-#include "gui/skin.h"
-#include "gui/viewport.h"
-
-#include "gui/models/colorlistmodel.h"
-
-#include "gui/popups/popupmenu.h"
-
-#include "gui/windows/setupwindow.h"
-#include "gui/windows/whoisonline.h"
-
-#include "gui/widgets/button.h"
-#include "gui/widgets/chatinput.h"
-#include "gui/widgets/createwidget.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/gmtab.h"
-#include "gui/widgets/tabs/chat/langtab.h"
-#include "gui/widgets/tabs/chat/tradetab.h"
-#include "gui/widgets/tabs/chat/whispertab.h"
-
-#include "render/opengl/opengldebug.h"
-
-#include "resources/db/textdb.h"
-
-#include "net/chathandler.h"
-#include "net/net.h"
-
-#include "utils/copynpaste.h"
-#include "utils/delete2.h"
-#include "utils/foreach.h"
-
-#include "utils/translation/podict.h"
-
-#include <sys/stat.h>
-
-#include <sstream>
-
-#include "debug.h"
-
-ChatWindow *chatWindow = nullptr;
-
-static const char *const ACTION_COLOR_PICKER = "color picker";
-
-ChatWindow::ChatWindow(const std::string &name) :
- // TRANSLATORS: chat window name
- Window(_("Chat"), Modal_false, nullptr, "chat.xml"),
- ActionListener(),
- KeyListener(),
- AttributeListener(),
- mItemLinkHandler(new ItemLinkHandler),
- mChatTabs(CREATEWIDGETR(TabbedArea, this)),
- mChatInput(new ChatInput(this)),
- mRainbowColor(0U),
- mWhispers(),
- mChannels(),
- mHistory(),
- mCurHist(),
- mCommands(),
- mCustomWords(),
- mTradeFilter(),
- mColorListModel(new ColorListModel),
- mColorPicker(new DropDown(this, mColorListModel)),
- mChatButton(new Button(this, ":)", "openemote", this)),
- mAwayLog(),
- mHighlights(),
- mGlobalsFilter(),
- mChatColor(config.getIntValue("chatColor")),
- mEmoteButtonSpacing(mSkin != nullptr ?
- mSkin->getOption("emoteButtonSpacing", 2) : 2),
- mEmoteButtonY(mSkin != nullptr ?
- mSkin->getOption("emoteButtonY", -2) : -2),
- mChatHistoryIndex(0),
- mReturnToggles(config.getBoolValue("ReturnToggles")),
- mGMLoaded(false),
- mHaveMouse(false),
- mAutoHide(config.getBoolValue("autohideChat")),
- mShowBattleEvents(config.getBoolValue("showBattleEvents")),
- mShowAllLang(serverConfig.getValue("showAllLang", 0) != 0),
- mEnableTradeFilter(config.getBoolValue("enableTradeFilter")),
- mTmpVisible(false)
-{
- setWindowName(name);
-
- if (setupWindow != nullptr)
- setupWindow->registerWindowForReset(this);
-
- setShowTitle(false);
- setResizable(true);
- setDefaultVisible(true);
- setSaveVisible(true);
- setStickyButtonLock(true);
-
- int w = 600;
-#ifdef ANDROID
- if (mainGraphics->getWidth() < 710)
- w = mainGraphics->getWidth() - 110;
- if (w < 100)
- w = 100;
- if (mainGraphics->getHeight() < 480)
- setDefaultSize(w, 90, ImagePosition::UPPER_LEFT, -110, -35);
- else
- setDefaultSize(w, 123, ImagePosition::UPPER_LEFT, -110, -35);
-#else // ANDROID
-
- if (mainGraphics->getWidth() < 600)
- w = mainGraphics->getWidth() - 10;
- if (w < 100)
- w = 100;
- setDefaultSize(w, 123, ImagePosition::LOWER_LEFT);
-#endif // ANDROID
-
- setMinWidth(150);
- setMinHeight(90);
-
- setTitleBarHeight(getPadding() + getTitlePadding());
-
- if (emoteWindow != nullptr)
- emoteWindow->addListeners(this);
-
- mChatButton->adjustSize();
-
- mChatTabs->enableScrollButtons(true);
- mChatTabs->setFollowDownScroll(true);
- mChatTabs->setResizeHeight(false);
-
- mChatInput->setActionEventId("chatinput");
- mChatInput->addActionListener(this);
- mChatInput->setAllowSpecialActions(false);
-
- mColorPicker->setActionEventId(ACTION_COLOR_PICKER);
- mColorPicker->addActionListener(this);
- mColorPicker->setSelected(mChatColor);
-
- mItemLinkHandler->setAllowCommands(false);
-
- loadWindowState();
-
- mColorPicker->setPosition(this->getWidth() - mColorPicker->getWidth()
- - 2 * mPadding - 8 - 16, mPadding);
-
- // Add key listener to chat input to be able to respond to up/down
- mChatInput->addKeyListener(this);
- mCurHist = mHistory.end();
- mColorPicker->setVisible(fromBool(config.getBoolValue(
- "showChatColorsList"), Visible));
- updateTabsMargin();
-
- fillCommands();
- if ((localPlayer != nullptr) && localPlayer->isGM())
- loadGMCommands();
- initTradeFilter();
- loadCustomList();
- parseHighlights();
- parseGlobalsFilter();
-
- config.addListener("autohideChat", this);
- config.addListener("showBattleEvents", this);
- config.addListener("globalsFilter", this);
- config.addListener("enableTradeFilter", this);
-
- enableVisibleSound(true);
-}
-
-ChatWindow::~ChatWindow()
-{
- config.removeListeners(this);
- CHECKLISTENERS
- saveState();
- config.setValue("ReturnToggles", mReturnToggles);
- removeAllWhispers();
- removeAllChannels();
- delete2(mItemLinkHandler);
- delete2(mColorPicker);
- delete2(mColorListModel);
-}
-
-void ChatWindow::postInit()
-{
- Window::postInit();
- add(mChatTabs);
- add(mChatInput);
- add(mColorPicker);
- add(mChatButton);
- updateVisibility();
-}
-
-void ChatWindow::loadCommandsFile(const std::string &name)
-{
- StringVect list;
- VirtFs::loadTextFile(name, list);
- StringVectCIter it = list.begin();
- const StringVectCIter it_end = list.end();
-
- while (it != it_end)
- {
- const std::string str = *it;
- if (!str.empty())
- mCommands.push_back(str);
- ++ it;
- }
-}
-
-void ChatWindow::fillCommands()
-{
- loadCommandsFile("chatcommands.txt");
- inputManager.addChatCommands(mCommands);
-}
-
-void ChatWindow::loadGMCommands()
-{
- if (mGMLoaded)
- return;
-
- loadCommandsFile("gmcommands.txt");
- mGMLoaded = true;
-}
-
-void ChatWindow::updateTabsMargin()
-{
- if (mColorPicker->mVisible == Visible_true)
- mChatTabs->setRightMargin(mColorPicker->getWidth() + 16 + 8);
- else
- mChatTabs->setRightMargin(8);
-}
-
-void ChatWindow::adjustTabSize()
-{
- const Rect area = getChildrenArea();
-
- const int aw = area.width;
- const int ah = area.height;
- const int frame = mChatInput->getFrameSize();
- const int inputHeight = mChatInput->getHeight();
- const bool showEmotes = config.getBoolValue("showEmotesButton");
- int maxHeight = inputHeight;
- if (showEmotes)
- {
- const int buttonHeight = mChatButton->getHeight();
- if (buttonHeight > maxHeight)
- maxHeight = buttonHeight;
- }
- const int frame2 = 2 * frame;
- const int awFrame2 = aw - frame2;
- int y = ah - maxHeight - frame;
- mChatInput->setPosition(frame, y);
- mChatTabs->setWidth(awFrame2);
- const int height = ah - frame2 - (maxHeight + frame2);
- if (mChatInput->mVisible == Visible_true ||
- !config.getBoolValue("hideChatInput"))
- {
- mChatTabs->setHeight(height);
- }
- else
- {
- mChatTabs->setHeight(height + maxHeight);
- }
- updateTabsMargin();
-
- if (showEmotes)
- {
- const int chatButtonSize = mChatButton->getWidth();
- int w = awFrame2 - chatButtonSize;
- const int x = aw - frame - chatButtonSize;
- w -= mEmoteButtonSpacing;
- y += mEmoteButtonY;
- mChatInput->setWidth(w);
- mChatButton->setVisible(mChatInput->mVisible);
- mChatButton->setPosition(x, y);
- }
- else
- {
- mChatInput->setWidth(awFrame2);
- mChatButton->setVisible(Visible_false);
- }
-
- const ChatTab *const tab = getFocused();
- if (tab != nullptr)
- {
- Widget *const content = tab->mScrollArea;
- if (content != nullptr)
- {
- const int contentFrame2 = 2 * content->getFrameSize();
- content->setSize(mChatTabs->getWidth() - contentFrame2,
- mChatTabs->getContainerHeight() - contentFrame2);
- content->logic();
- }
- }
-
- mColorPicker->setPosition(this->getWidth() - mColorPicker->getWidth()
- - 2 * mPadding - 8 - 16, mPadding);
-
- mChatTabs->adjustSize();
-}
-
-void ChatWindow::widgetResized(const Event &event)
-{
- Window::widgetResized(event);
-
- adjustTabSize();
-}
-
-ChatTab *ChatWindow::getFocused() const
-{
- return static_cast<ChatTab*>(mChatTabs->getSelectedTab());
-}
-
-void ChatWindow::clearTab(ChatTab *const tab)
-{
- if (tab != nullptr)
- tab->clearText();
-}
-
-void ChatWindow::clearTab() const
-{
- clearTab(getFocused());
-}
-
-void ChatWindow::prevTab()
-{
- if (mChatTabs == nullptr)
- return;
-
- int tab = mChatTabs->getSelectedTabIndex();
-
- if (tab <= 0)
- tab = mChatTabs->getNumberOfTabs();
- tab--;
-
- mChatTabs->setSelectedTabByIndex(tab);
-}
-
-void ChatWindow::nextTab()
-{
- if (mChatTabs == nullptr)
- return;
-
- int tab = mChatTabs->getSelectedTabIndex();
-
- tab++;
- if (tab == mChatTabs->getNumberOfTabs())
- tab = 0;
-
- mChatTabs->setSelectedTabByIndex(tab);
-}
-
-void ChatWindow::selectTabByType(const ChatTabTypeT &type)
-{
- if (mChatTabs == nullptr)
- return;
-
- int sz = mChatTabs->getNumberOfTabs();
- for (int f = 0; f < sz; f ++)
- {
- ChatTab *const tab = dynamic_cast<ChatTab*>(
- mChatTabs->getTabByIndex(f));
- if ((tab != nullptr) && tab->getType() == type)
- {
- mChatTabs->setSelectedTab(tab);
- break;
- }
- }
-}
-
-void ChatWindow::closeTab() const
-{
- if (mChatTabs == nullptr)
- return;
-
- ChatTab *const tab = dynamic_cast<ChatTab*>(mChatTabs->getTabByIndex(
- mChatTabs->getSelectedTabIndex()));
- if (tab == nullptr)
- return;
- const ChatTabTypeT &type = tab->getType();
- if (type == ChatTabType::WHISPER || type == ChatTabType::CHANNEL)
- tab->handleCommand("close", "");
-}
-
-void ChatWindow::defaultTab()
-{
- if (mChatTabs != nullptr)
- mChatTabs->setSelectedTabByIndex(CAST_U32(0));
-}
-
-void ChatWindow::action(const ActionEvent &event)
-{
- const std::string &eventId = event.getId();
- if (eventId == "chatinput")
- {
- std::string message = mChatInput->getText();
-
- if (!message.empty())
- {
- // If message different from previous, put it in the history
- if (mHistory.empty() || message != mHistory.back())
- mHistory.push_back(message);
-
- // Reset history iterator
- mCurHist = mHistory.end();
-
- // Send the message to the server
- chatInput(addColors(message));
-
- // Clear the text from the chat input
- mChatInput->setText("");
- }
-
- if (message.empty() || !mReturnToggles)
- {
- // Remove focus and hide input
- mChatInput->unprotectFocus();
- if (mFocusHandler != nullptr)
- mFocusHandler->focusNone();
-
- // If the chatWindow is shown up because you want to send a message
- // It should hide now
- if (mTmpVisible)
- setVisible(Visible_false);
- }
- }
- else if (eventId == "emote")
- {
- if (emoteWindow != nullptr)
- {
- const std::string str = emoteWindow->getSelectedEmote();
- if (!str.empty())
- {
- addInputText(str, false);
- emoteWindow->clearEmote();
- }
- }
- }
- else if (eventId == "openemote")
- {
- if (emoteWindow != nullptr)
- {
- if (emoteWindow->mVisible == Visible_true)
- emoteWindow->hide();
- else
- emoteWindow->show();
- }
- }
- else if (eventId == "color")
- {
- if (emoteWindow != nullptr)
- {
- const std::string str = emoteWindow->getSelectedColor();
- if (!str.empty())
- {
- addInputText(str, false);
- emoteWindow->clearColor();
- }
- }
- }
- else if (eventId == "font")
- {
- if (emoteWindow != nullptr)
- {
- const std::string str = emoteWindow->getSelectedFont();
- if (!str.empty())
- {
- addInputText(str, false);
- emoteWindow->clearFont();
- }
- }
- }
- else if (eventId == "text")
- {
- if ((emoteWindow != nullptr) && (reverseDictionary != nullptr))
- {
- const int idx = emoteWindow->getSelectedTextIndex();
- if (idx >= 0)
- {
- const std::string str = TextDb::getByIndex(idx);
- const std::string enStr = reverseDictionary->getStr(str);
- addInputText(enStr, false);
- }
- emoteWindow->clearText();
- }
- }
- else if (eventId == ACTION_COLOR_PICKER)
- {
- if (mColorPicker != nullptr)
- {
- mChatColor = mColorPicker->getSelected();
- config.setValue("chatColor", mChatColor);
- }
- }
-
- if (mColorPicker != nullptr)
- {
- const Visible vis = fromBool(config.getBoolValue(
- "showChatColorsList"), Visible);
- if (mColorPicker->mVisible != vis)
- mColorPicker->setVisible(vis);
- }
-}
-
-bool ChatWindow::requestChatFocus()
-{
- // Make sure chatWindow is visible
- if (!isWindowVisible())
- {
- setVisible(Visible_true);
-
- /*
- * This is used to hide chatWindow after sending the message. There is
- * a trick here, because setVisible will set mTmpVisible to false, you
- * have to put this sentence *after* setVisible, not before it
- */
- mTmpVisible = true;
- }
-
- // Don't do anything else if the input is already visible and has focus
- if (mChatInput->isVisible() && mChatInput->isFocused())
- return false;
-
- // Give focus to the chat input
- mChatInput->processVisible(Visible_true);
- unHideWindow();
- mChatInput->requestFocus();
- return true;
-}
-
-bool ChatWindow::isInputFocused() const
-{
- return mChatInput->isFocused();
-}
-
-void ChatWindow::removeTab(ChatTab *const tab)
-{
- mChatTabs->removeTab(tab);
-}
-
-void ChatWindow::addTab(ChatTab *const tab)
-{
- if (tab == nullptr)
- return;
-
- mChatTabs->addTab(tab, tab->mScrollArea);
- logic();
-}
-
-void ChatWindow::removeWhisper(const std::string &nick)
-{
- std::string tempNick = nick;
- toLower(tempNick);
- mWhispers.erase(tempNick);
-}
-
-void ChatWindow::removeChannel(const std::string &name)
-{
- std::string tempName = name;
- toLower(tempName);
- mChannels.erase(tempName);
- chatHandler->partChannel(name);
-}
-
-void ChatWindow::removeAllWhispers()
-{
- std::list<ChatTab*> tabs;
-
- FOR_EACH (TabMap::iterator, iter, mWhispers)
- tabs.push_back(iter->second);
-
- for (std::list<ChatTab*>::iterator it = tabs.begin();
- it != tabs.end(); ++it)
- {
- delete *it;
- }
-
- mWhispers.clear();
-}
-
-void ChatWindow::removeAllChannels()
-{
- std::list<ChatTab*> tabs;
-
- FOR_EACH (ChannelMap::iterator, iter, mChannels)
- tabs.push_back(iter->second);
-
- for (std::list<ChatTab*>::iterator it = tabs.begin();
- it != tabs.end(); ++it)
- {
- delete *it;
- }
-
- mChannels.clear();
-}
-
-void ChatWindow::ignoreAllWhispers()
-{
- for (TabMap::iterator iter = mWhispers.begin();
- iter != mWhispers.end();
- ++ iter)
- {
- WhisperTab *const tab = iter->second;
- if (tab != nullptr)
- {
- if (playerRelations.getRelation(tab->getNick())
- != Relation::IGNORED)
- {
- playerRelations.setRelation(tab->getNick(),
- Relation::IGNORED);
- }
- tab->handleCommand("close", "");
- }
- }
-}
-
-void ChatWindow::chatInput(const std::string &message) const
-{
- ChatTab *tab = nullptr;
- std::string msg = message;
- trim(msg);
-
- if (config.getBoolValue("allowCommandsInChatTabs")
- && msg.length() > 1
- && ((msg.at(0) == '#' && msg.at(1) != '#') || msg.at(0) == '@')
- && (localChatTab != nullptr))
- {
- tab = localChatTab;
- }
- else
- {
- tab = getFocused();
- if (tab == nullptr)
- tab = localChatTab;
- }
- if (tab != nullptr)
- tab->chatInput(msg);
- Game *const game = Game::instance();
- if (game != nullptr)
- game->setValidSpeed();
-}
-
-void ChatWindow::localChatInput(const std::string &msg) const
-{
- if (localChatTab != nullptr)
- localChatTab->chatInput(msg);
- else
- chatInput(msg);
-}
-
-void ChatWindow::doPresent() const
-{
- if (actorManager == nullptr)
- return;
-
- const ActorSprites &actors = actorManager->getAll();
- std::string response;
- int playercount = 0;
-
- FOR_EACH (ActorSpritesIterator, it, actors)
- {
- if ((*it)->getType() == ActorType::Player)
- {
- if (!response.empty())
- response.append(", ");
- response.append(static_cast<Being*>(*it)->getName());
- playercount ++;
- }
- }
-
- ChatTab *const tab = getFocused();
- if (tab != nullptr)
- {
- const std::string log = strprintf(
- // TRANSLATORS: chat message
- _("Present: %s; %d players are present."),
- response.c_str(), playercount);
- tab->chatLog(log, ChatMsgType::BY_SERVER);
- }
-}
-
-void ChatWindow::scroll(const int amount) const
-{
- if (!isWindowVisible())
- return;
-
- ChatTab *const tab = getFocused();
- if (tab != nullptr)
- tab->scroll(amount);
-}
-
-void ChatWindow::mousePressed(MouseEvent &event)
-{
- if (event.isConsumed())
- return;
-
- if (event.getButton() == MouseButton::RIGHT)
- {
- if (popupMenu != nullptr)
- {
- ChatTab *const cTab = dynamic_cast<ChatTab*>(
- mChatTabs->getSelectedTab());
- if (cTab != nullptr)
- {
- event.consume();
- if (inputManager.isActionActive(InputAction::CHAT_MOD))
- {
- inputManager.executeChatCommand(
- InputAction::CLOSE_CHAT_TAB,
- std::string(), cTab);
- }
- else
- {
- popupMenu->showChatPopup(viewport->mMouseX,
- viewport->mMouseY,
- cTab);
- }
- }
- }
- }
-
- Window::mousePressed(event);
-
- if (event.isConsumed())
- return;
-
- if (event.getButton() == MouseButton::LEFT)
- {
- const int clicks = event.getClickCount();
- if (clicks == 2)
- {
- toggleChatFocus();
- if (gui != nullptr)
- gui->resetClickCount();
- }
- else if (clicks == 1)
- {
- const ChatTab *const tab = getFocused();
- if (tab != nullptr)
- mMoved = !isResizeAllowed(event);
- }
- }
-
- mDragOffsetX = event.getX();
- mDragOffsetY = event.getY();
-}
-
-void ChatWindow::mouseDragged(MouseEvent &event)
-{
- Window::mouseDragged(event);
-
- if (event.isConsumed())
- return;
-
- if (canMove() && isMovable() && mMoved)
- {
- int newX = std::max(0, getX() + event.getX() - mDragOffsetX);
- int newY = std::max(0, getY() + event.getY() - mDragOffsetY);
- newX = std::min(mainGraphics->mWidth - getWidth(), newX);
- newY = std::min(mainGraphics->mHeight - getHeight(), newY);
- setPosition(newX, newY);
- }
-}
-
-#define ifKey(key, str) \
- else if (actionId == key) \
- { \
- temp = str; \
- }
-
-void ChatWindow::keyPressed(KeyEvent &event)
-{
- const InputActionT actionId = event.getActionId();
- std::string temp;
- if (actionId == InputAction::GUI_DOWN)
- {
- if (mCurHist != mHistory.end())
- {
- // Move forward through the history
- const HistoryIterator prevHist = mCurHist++;
- addCurrentToHistory();
-
- if (mCurHist != mHistory.end())
- {
- mChatInput->setText(*mCurHist);
- mChatInput->setCaretPosition(CAST_U32(
- mChatInput->getText().length()));
- }
- else
- {
- mChatInput->setText("");
- mCurHist = prevHist;
- }
- }
- else if (!mChatInput->getText().empty())
- {
- if (addCurrentToHistory())
- mCurHist = mHistory.end();
- mChatInput->setText("");
- }
- }
- else if (actionId == InputAction::GUI_UP &&
- mCurHist != mHistory.begin() &&
- !mHistory.empty())
- {
- // Move backward through the history
- --mCurHist;
- addCurrentToHistory();
- mChatInput->setText(*mCurHist);
- mChatInput->setCaretPosition(CAST_U32(
- mChatInput->getText().length()));
- }
- else if (actionId == InputAction::GUI_INSERT &&
- !mChatInput->getText().empty())
- {
- const std::string str = mChatInput->getText();
- // Add the current message to the history and clear the text
- if (mHistory.empty() || str != mHistory.back())
- mHistory.push_back(str);
- mCurHist = mHistory.end();
- mChatInput->setText(std::string());
- }
- else if (actionId == InputAction::GUI_TAB &&
- !mChatInput->getText().empty())
- {
- autoComplete();
- return;
- }
- else if (actionId == InputAction::GUI_CANCEL &&
- mChatInput->mVisible == Visible_true)
- {
- mChatInput->processVisible(Visible_false);
- }
- else if (actionId == InputAction::CHAT_PREV_HISTORY &&
- mChatInput->mVisible == Visible_true)
- {
- const ChatTab *const tab = getFocused();
- if ((tab != nullptr) && tab->hasRows())
- {
- if (mChatHistoryIndex == 0u)
- {
- mChatHistoryIndex = CAST_U32(
- tab->getRows().size());
-
- mChatInput->setText("");
- mChatInput->setCaretPosition(0);
- return;
- }
-
- mChatHistoryIndex --;
-
- unsigned int f = 0;
- const std::list<std::string> &rows = tab->getRows();
- for (std::list<std::string>::const_iterator it = rows.begin(),
- it_end = rows.end(); it != it_end; ++ it, f ++)
- {
- if (f == mChatHistoryIndex)
- mChatInput->setText(*it);
- }
- mChatInput->setCaretPosition(CAST_U32(
- mChatInput->getText().length()));
- }
- }
- else if (actionId == InputAction::CHAT_NEXT_HISTORY &&
- mChatInput->mVisible == Visible_true)
- {
- const ChatTab *const tab = getFocused();
- if ((tab != nullptr) && tab->hasRows())
- {
- const std::list<std::string> &rows = tab->getRows();
- const size_t &tabSize = rows.size();
- if (CAST_SIZE(mChatHistoryIndex) + 1 < tabSize)
- {
- mChatHistoryIndex ++;
- }
- else if (CAST_SIZE(mChatHistoryIndex) < tabSize)
- {
- mChatHistoryIndex ++;
- mChatInput->setText("");
- mChatInput->setCaretPosition(0);
- return;
- }
- else
- {
- mChatHistoryIndex = 0;
- }
-
- unsigned int f = 0;
- for (std::list<std::string>::const_iterator
- it = rows.begin(), it_end = rows.end();
- it != it_end; ++it, f++)
- {
- if (f == mChatHistoryIndex)
- mChatInput->setText(*it);
- }
- mChatInput->setCaretPosition(CAST_U32(
- mChatInput->getText().length()));
- }
- }
- else if (actionId == InputAction::GUI_F1)
- {
- if (emoteWindow != nullptr)
- {
- if (emoteWindow->mVisible == Visible_true)
- emoteWindow->hide();
- else
- emoteWindow->show();
- }
- }
- ifKey(InputAction::GUI_F2, "\u2318")
- ifKey(InputAction::GUI_F3, "\u263A")
- ifKey(InputAction::GUI_F4, "\u2665")
- ifKey(InputAction::GUI_F5, "\u266A")
- ifKey(InputAction::GUI_F6, "\u266B")
- ifKey(InputAction::GUI_F7, "\u26A0")
- ifKey(InputAction::GUI_F8, "\u2622")
- ifKey(InputAction::GUI_F9, "\u262E")
- ifKey(InputAction::GUI_F10, "\u2605")
- ifKey(InputAction::GUI_F11, "\u2618")
- ifKey(InputAction::GUI_F12, "\u2592")
-
- if (inputManager.isActionActive(InputAction::GUI_CTRL))
- {
- if (actionId == InputAction::GUI_B)
- {
- std::string inputText = mChatInput->getTextBeforeCaret();
- toLower(inputText);
- const size_t idx = inputText.rfind("##b");
- if (idx == std::string::npos
- || mChatInput->getTextBeforeCaret().substr(idx, 3) == "##b")
- {
- temp = "##B";
- }
- else
- {
- temp = "##b";
- }
- }
- }
-
- if (!temp.empty())
- addInputText(temp, false);
-}
-
-#undef ifKey
-
-bool ChatWindow::addCurrentToHistory()
-{
- const std::string &str = mChatInput->getText();
- if (str.empty())
- return false;
- FOR_EACH (HistoryIterator, it, mHistory)
- {
- if (*it == str)
- return false;
- }
- mHistory.push_back(str);
- return true;
-}
-
-void ChatWindow::attributeChanged(const AttributesT id,
- const int64_t oldVal,
- const int64_t newVal)
-{
- if (!mShowBattleEvents)
- return;
- PRAGMA45(GCC diagnostic push)
- PRAGMA45(GCC diagnostic ignored "-Wswitch-enum")
- switch (id)
- {
- case Attributes::PLAYER_EXP:
- {
- if (oldVal > newVal)
- break;
- const int64_t change = newVal - oldVal;
- if (change != 0)
- {
- battleChatLog(std::string("+").append(toString(
- CAST_U64(change))).append(" xp"),
- ChatMsgType::BY_SERVER);
- }
- break;
- }
- case Attributes::PLAYER_BASE_LEVEL:
- battleChatLog(std::string(
- "Level: ").append(toString(CAST_S32(
- newVal))),
- ChatMsgType::BY_SERVER);
- break;
- case Attributes::PLAYER_JOB_EXP:
- {
- if (!config.getBoolValue("showJobExp"))
- return;
- if (oldVal > newVal ||
- PlayerInfo::getAttribute(
- Attributes::PLAYER_JOB_EXP_NEEDED) == 0)
- {
- return;
- }
- const int64_t change = newVal - oldVal;
- if (change != 0)
- {
- battleChatLog(std::string("+").append(toString(CAST_U64(
- change))).append(" job"),
- ChatMsgType::BY_SERVER);
- }
- break;
- }
- default:
- break;
- };
- PRAGMA45(GCC diagnostic pop)
-}
-
-void ChatWindow::addInputText(const std::string &text, const bool space)
-{
- const int caretPos = mChatInput->getCaretPosition();
- const std::string &inputText = mChatInput->getText();
-
- std::ostringstream ss;
- ss << inputText.substr(0, caretPos) << text;
- if (space)
- ss << " ";
-
- ss << inputText.substr(caretPos);
- mChatInput->setText(ss.str());
- mChatInput->setCaretPosition(caretPos + CAST_S32(
- text.length()) + CAST_S32(space));
- requestChatFocus();
-}
-
-void ChatWindow::addItemText(const std::string &item)
-{
- std::ostringstream text;
- text << "[" << item << "]";
- addInputText(text.str());
-}
-
-void ChatWindow::setVisible(Visible visible)
-{
- Window::setVisible(visible);
-
- /*
- * For whatever reason, if setVisible is called, the mTmpVisible effect
- * should be disabled.
- */
- mTmpVisible = false;
-}
-
-void ChatWindow::addWhisper(const std::string &restrict nick,
- const std::string &restrict mes,
- const ChatMsgTypeT own)
-{
- if (mes.empty() || (localPlayer == nullptr))
- return;
-
- std::string playerName = localPlayer->getName();
- std::string tempNick = nick;
-
- toLower(playerName);
- toLower(tempNick);
-
- if (tempNick == playerName)
- return;
-
- WhisperTab *tab = nullptr;
- const TabMap::const_iterator i = mWhispers.find(tempNick);
-
- if (i != mWhispers.end())
- {
- tab = i->second;
- }
- else if (config.getBoolValue("whispertab"))
- {
- tab = addWhisperTab(nick, nick);
- if (tab != nullptr)
- saveState();
- }
-
- if (tab != nullptr)
- {
- if (own == ChatMsgType::BY_PLAYER)
- {
- tab->chatInput(mes);
- }
- else if (own == ChatMsgType::BY_SERVER)
- {
- tab->chatLog(mes, ChatMsgType::BY_SERVER);
- }
- else
- {
- if (tab->getRemoveNames())
- {
- std::string msg = mes;
- const size_t idx = mes.find(':');
- if (idx != std::string::npos && idx > 0)
- {
- std::string nick2 = msg.substr(0, idx);
- msg = msg.substr(idx + 1);
- nick2 = removeColors(nick2);
- nick2 = trim(nick2);
- if (config.getBoolValue("removeColors"))
- msg = removeColors(msg);
- msg = trim(msg);
- tab->chatLog(nick2, msg);
- }
- else
- {
- if (config.getBoolValue("removeColors"))
- msg = removeColors(msg);
- tab->chatLog(msg, ChatMsgType::BY_SERVER);
- }
- }
- else
- {
- tab->chatLog(nick, mes);
- }
- localPlayer->afkRespond(tab, nick);
- }
- }
- else if (localChatTab != nullptr)
- {
- if (own == ChatMsgType::BY_PLAYER)
- {
- chatHandler->privateMessage(nick, mes);
-
- // TRANSLATORS: chat message
- localChatTab->chatLog(strprintf(_("Whispering to %s: %s"),
- nick.c_str(), mes.c_str()),
- ChatMsgType::BY_PLAYER);
- }
- else
- {
- localChatTab->chatLog(std::string(nick).append(
- " : ").append(mes),
- ChatMsgType::ACT_WHISPER,
- IgnoreRecord_false);
- if (localPlayer != nullptr)
- localPlayer->afkRespond(nullptr, nick);
- }
- }
-}
-
-WhisperTab *ChatWindow::addWhisperTab(const std::string &caption,
- const std::string &nick,
- const bool switchTo)
-{
- if (localPlayer == nullptr)
- return nullptr;
-
- std::string playerName = localPlayer->getName();
- std::string tempNick = nick;
-
- toLower(playerName);
- toLower(tempNick);
-
- const TabMap::const_iterator i = mWhispers.find(tempNick);
- WhisperTab *ret = nullptr;
-
- if (tempNick == playerName)
- return nullptr;
-
- if (i != mWhispers.end())
- {
- ret = i->second;
- }
- else
- {
- ret = new WhisperTab(this, caption, nick);
- if ((gui != nullptr) && !playerRelations.isGoodName(nick))
- ret->setLabelFont(gui->getSecureFont());
- mWhispers[tempNick] = ret;
- if (config.getBoolValue("showChatHistory"))
- ret->loadFromLogFile(nick);
- }
-
- if (switchTo)
- mChatTabs->setSelectedTab(ret);
-
- return ret;
-}
-
-WhisperTab *ChatWindow::getWhisperTab(const std::string &nick) const
-{
- if (localPlayer == nullptr)
- return nullptr;
-
- std::string playerName = localPlayer->getName();
- std::string tempNick = nick;
-
- toLower(playerName);
- toLower(tempNick);
-
- const TabMap::const_iterator i = mWhispers.find(tempNick);
- WhisperTab *ret = nullptr;
-
- if (tempNick == playerName)
- return nullptr;
-
- if (i != mWhispers.end())
- ret = i->second;
-
- return ret;
-}
-
-ChatTab *ChatWindow::addSpecialChannelTab(const std::string &name,
- const bool switchTo)
-{
- ChatTab *ret = nullptr;
- if (name == TRADE_CHANNEL)
- {
- if (tradeChatTab == nullptr)
- {
- tradeChatTab = new TradeTab(chatWindow);
- tradeChatTab->setAllowHighlight(false);
- chatHandler->joinChannel(tradeChatTab->getChannelName());
- }
- ret = tradeChatTab;
- }
- else if (name == GM_CHANNEL)
- {
- if (gmChatTab == nullptr)
- {
- gmChatTab = new GmTab(chatWindow);
- chatHandler->joinChannel(gmChatTab->getChannelName());
- }
- ret = gmChatTab;
- }
- if (switchTo)
- mChatTabs->setSelectedTab(ret);
-
- return ret;
-}
-
-ChatTab *ChatWindow::addChannelTab(const std::string &name,
- const bool switchTo)
-{
- std::string tempName = name;
- toLower(tempName);
-
- ChatTab *const tab = addSpecialChannelTab(name, switchTo);
- if (tab != nullptr)
- return tab;
-
- 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;
- ret->setAllowHighlight(false);
- if (config.getBoolValue("showChatHistory"))
- ret->loadFromLogFile(name);
- }
-
- if (switchTo)
- mChatTabs->setSelectedTab(ret);
-
- return ret;
-}
-
-ChatTab *ChatWindow::addChatTab(const std::string &name,
- const bool switchTo,
- const bool join)
-{
- if (Net::getNetworkType() != ServerType::TMWATHENA &&
- name.size() > 1 &&
- name[0] == '#')
- {
- ChatTab *const tab = addChannelTab(name, switchTo);
- if ((tab != nullptr) && join)
- chatHandler->joinChannel(name);
- return tab;
- }
- return addWhisperTab(name, name, switchTo);
-}
-
-void ChatWindow::postConnection()
-{
- FOR_EACH (ChannelMap::const_iterator, iter, mChannels)
- {
- ChatTab *const tab = iter->second;
- if (tab == nullptr)
- return;
- chatHandler->joinChannel(tab->getChannelName());
- }
- if (langChatTab != nullptr)
- chatHandler->joinChannel(langChatTab->getChannelName());
-}
-
-#define changeColor(fun) \
- { \
- msg = removeColors(msg); \
- int skip = 0; \
- const size_t sz = msg.length(); \
- for (size_t f = 0; f < sz; f ++) \
- { \
- if (skip > 0) \
- { \
- newMsg += msg.at(f); \
- skip --; \
- continue; \
- } \
- const unsigned char ch = CAST_U8(msg.at(f)); \
- if (f + 2 < sz && msg.substr(f, 2) == "%%") \
- { \
- newMsg += msg.at(f); \
- skip = 2; \
- } \
- else if (ch > 0xc0 || ch < 0x80) \
- { \
- newMsg += "##" + toString(fun) + msg.at(f); \
- if (mRainbowColor > 9U) \
- mRainbowColor = 0U; \
- } \
- else \
- { \
- newMsg += msg.at(f); \
- } \
- } \
- }
-
-std::string ChatWindow::addColors(std::string &msg)
-{
- // default color or chat command
- if (mChatColor == 0 || msg.length() == 0 || msg.at(0) == '#'
- || msg.at(0) == '/' || msg.at(0) == '@' || msg.at(0) == '!')
- {
- return msg;
- }
-
- std::string newMsg;
- const int cMap[] = {1, 4, 5, 2, 3, 6, 7, 9, 0, 8};
-
- // rainbow
- switch (mChatColor)
- {
- case 11:
- changeColor(mRainbowColor++)
- return newMsg;
- case 12:
- changeColor(cMap[mRainbowColor++])
- return newMsg;
- case 13:
- changeColor(cMap[9-mRainbowColor++])
- return newMsg;
- default:
- break;
- }
-
- // simple colors
- return std::string("##").append(toString(mChatColor - 1)).append(msg);
-}
-
-#undef changeColor
-
-void ChatWindow::autoComplete()
-{
- const int caretPos = mChatInput->getCaretPosition();
- int startName = 0;
- const std::string &inputText = mChatInput->getText();
- std::string name = inputText.substr(0, caretPos);
-
- for (int f = caretPos - 1; f > -1; f --)
- {
- if (isWordSeparator(inputText[f]))
- {
- startName = f + 1;
- name = inputText.substr(f + 1, caretPos - f);
- break;
- }
- }
-
- if (caretPos - 1 + 1 == startName)
- return;
-
- const ChatTab *const cTab = static_cast<ChatTab*>(
- mChatTabs->getSelectedTab());
- StringVect nameList;
-
- if (cTab != nullptr)
- cTab->getAutoCompleteList(nameList);
- std::string newName = autoComplete(nameList, name);
- if (!newName.empty() && (startName == 0))
- secureChatCommand(newName);
-
- if ((cTab != nullptr) && newName.empty())
- {
- cTab->getAutoCompleteCommands(nameList);
- newName = autoComplete(nameList, name);
- }
-
- if (newName.empty() && (actorManager != nullptr))
- {
- actorManager->getPlayerNames(nameList, NpcNames_true);
- newName = autoComplete(nameList, name);
- if (!newName.empty() && (startName == 0))
- secureChatCommand(newName);
- }
- if (newName.empty())
- newName = autoCompleteHistory(name);
- if (newName.empty() && (spellManager != nullptr))
- newName = spellManager->autoComplete(name);
- if (newName.empty())
- newName = autoComplete(name, &mCommands);
- if (newName.empty() && (actorManager != nullptr))
- {
- actorManager->getMobNames(nameList);
- newName = autoComplete(nameList, name);
- }
- if (newName.empty())
- newName = autoComplete(name, &mCustomWords);
- if (newName.empty())
- {
- whoIsOnline->getPlayerNames(nameList);
- newName = autoComplete(nameList, name);
- }
-
- if (!newName.empty())
- {
- mChatInput->setText(inputText.substr(0, startName).append(newName)
- .append(inputText.substr(caretPos,
- inputText.length() - caretPos)));
-
- const int len = caretPos - CAST_S32(name.length())
- + CAST_S32(newName.length());
-
- if (startName > 0)
- mChatInput->setCaretPosition(len + 1);
- else
- mChatInput->setCaretPosition(len);
- }
-}
-
-std::string ChatWindow::autoComplete(const StringVect &names,
- std::string partName)
-{
- StringVectCIter i = names.begin();
- const StringVectCIter i_end = names.end();
- toLower(partName);
- std::string newName;
-
- while (i != i_end)
- {
- if (!i->empty())
- {
- std::string name = *i;
- toLower(name);
-
- const size_t pos = name.find(partName, 0);
- if (pos == 0)
- {
- if (!newName.empty())
- newName = findSameSubstringI(*i, newName);
- else
- newName = *i;
- }
- }
- ++i;
- }
-
- return newName;
-}
-
-std::string ChatWindow::autoComplete(const std::string &partName,
- const History *const words) const
-{
- if (words == nullptr)
- return "";
-
- ChatCommands::const_iterator i = words->begin();
- const ChatCommands::const_iterator i_end = words->end();
- StringVect nameList;
-
- while (i != i_end)
- {
- const std::string line = *i;
- if (line.find(partName, 0) == 0)
- nameList.push_back(line);
- ++i;
- }
- return autoComplete(nameList, partName);
-}
-
-/*
-void ChatWindow::moveTabLeft(ChatTab *tab)
-{
- mChatTabs->moveLeft(tab);
-}
-
-void ChatWindow::moveTabRight(ChatTab *tab)
-{
- mChatTabs->moveRight(tab);
-}
-*/
-
-std::string ChatWindow::autoCompleteHistory(const std::string &partName) const
-{
- History::const_iterator i = mHistory.begin();
- const History::const_iterator i_end = mHistory.end();
- StringVect nameList;
-
- while (i != i_end)
- {
- std::string line = *i;
- unsigned int f = 0;
- while (f < line.length() && !isWordSeparator(line.at(f)))
- f++;
-
- line = line.substr(0, f);
- if (!line.empty())
- nameList.push_back(line);
-
- ++i;
- }
- return autoComplete(nameList, partName);
-}
-
-bool ChatWindow::resortChatLog(std::string line,
- ChatMsgTypeT own,
- const std::string &channel,
- const IgnoreRecord ignoreRecord,
- const TryRemoveColors tryRemoveColors)
-{
- if (own == ChatMsgType::BY_UNKNOWN)
- {
- const size_t pos = line.find(" : ");
- if (pos != std::string::npos)
- {
- if (line.length() <= pos + 3)
- own = ChatMsgType::BY_SERVER;
- else if (line.substr(0, pos) == localPlayer->getName())
- own = ChatMsgType::BY_PLAYER;
- else
- own = ChatMsgType::BY_OTHER;
- }
- else
- {
- own = ChatMsgType::BY_SERVER;
- }
- }
-
- std::string prefix;
- if (!channel.empty())
- {
- prefix = std::string("##3").append(channel).append("##0");
- }
- else if (mEnableTradeFilter &&
- (tradeChatTab != nullptr) &&
- findI(line, mTradeFilter) != std::string::npos)
- {
- // TRANSLATORS: prefix for moved message to trade tab.
- tradeChatTab->chatLog(std::string("##S") + _("Moved: ") + line,
- own,
- ignoreRecord,
- tryRemoveColors);
- if (own == ChatMsgType::BY_PLAYER)
- {
- own = ChatMsgType::BY_SERVER;
- // TRANSLATORS: moved message to trade tab warning.
- line = _("Your message was moved to trade tab");
- }
- else
- {
- return false;
- }
- }
-
- size_t idx2 = line.find(": ");
- if (idx2 != std::string::npos)
- {
- std::string tmpNick = line.substr(0, idx2);
- if (tmpNick.find('#') != std::string::npos ||
- tmpNick.find(':') != std::string::npos ||
- tmpNick.find('%') != std::string::npos ||
- tmpNick.find('@') != std::string::npos ||
- tmpNick.size() < 5 ||
- tmpNick[0] == '@' ||
- tmpNick[0] == '/' ||
- tmpNick[0] == '!'
- )
- {
- replaceAll(tmpNick, "#", "_");
- replaceAll(tmpNick, "%", "_");
- // TRANSLATORS: error message
- line = _("Broken nick detected: ") + line;
- own = ChatMsgType::BY_SERVER;
- }
- const size_t idx = line.find(": \302\202");
- if (idx == idx2)
- {
- if (line.find(": \302\202\302") != std::string::npos)
- {
- if (line.find(": \302\202\302e") != std::string::npos)
- {
- // Do nothing. Before was local pet emote
- }
- else if (line.find(": \302\202\302m") != std::string::npos)
- {
- // Do nothing. Before was local pet move
- }
- else if (line.find(": \302\202\302d") != std::string::npos)
- {
- // Do nothing. Before was local pet direction
- }
- else if (line.find(": \302\202\302a") != std::string::npos)
- {
- // Do nothing. Before was local pet ai enable/disable
- }
- // ignore other special message formats.
- return false;
- }
-
- // pet talk message detected
- if (line.find(": \302\202\303 ") != std::string::npos)
- {
- // Do nothing. Before was local pet talk
- return false;
- }
- if (line.find(": \302\202\304") != std::string::npos)
- {
- replaceAll(line, ": \302\202\304", ": ");
- }
-
- if (tradeChatTab != nullptr)
- {
- line = line.erase(idx + 2, 2);
- tradeChatTab->chatLog(prefix + line,
- own,
- ignoreRecord,
- tryRemoveColors);
- }
- else if (localChatTab != nullptr)
- {
- line = line.erase(idx + 2, 2);
- localChatTab->chatLog(prefix + line,
- own,
- ignoreRecord,
- tryRemoveColors);
- }
- return false;
- }
- }
-
- if (!channel.empty())
- {
- if (langChatTab != nullptr)
- {
- if (langChatTab->getChannelName() == channel)
- {
- langChatTab->chatLog(line, own, ignoreRecord, tryRemoveColors);
- }
- else if (mShowAllLang)
- {
- langChatTab->chatLog(prefix + line,
- own,
- ignoreRecord,
- tryRemoveColors);
- }
- }
- else if (Net::getNetworkType() != ServerType::TMWATHENA)
- {
- channelChatLog(channel, line, own, ignoreRecord, tryRemoveColors);
- return false;
- }
- else if (mShowAllLang)
- {
- localChatTab->chatLog(prefix + line,
- own,
- ignoreRecord,
- tryRemoveColors);
- }
- }
- else if ((localChatTab != nullptr) && channel.empty())
- {
- localChatTab->chatLog(line, own, ignoreRecord, tryRemoveColors);
- }
- return true;
-}
-
-void ChatWindow::battleChatLog(const std::string &line, ChatMsgTypeT own,
- const IgnoreRecord ignoreRecord,
- const TryRemoveColors tryRemoveColors)
-{
- if (own == ChatMsgType::BY_UNKNOWN)
- own = ChatMsgType::BY_SERVER;
- if (battleChatTab != nullptr)
- battleChatTab->chatLog(line, own, ignoreRecord, tryRemoveColors);
- else if (debugChatTab != nullptr)
- debugChatTab->chatLog(line, own, ignoreRecord, tryRemoveColors);
-}
-
-void ChatWindow::channelChatLog(const std::string &channel,
- const std::string &line,
- ChatMsgTypeT own,
- const IgnoreRecord ignoreRecord,
- const TryRemoveColors tryRemoveColors)
-{
- std::string tempChannel = channel;
- toLower(tempChannel);
-
- ChatTab *tab = nullptr;
- const ChannelMap::const_iterator i = mChannels.find(tempChannel);
-
- if (i != mChannels.end())
- {
- tab = i->second;
- }
- else
- {
- tab = addChannelTab(channel, false);
- if (tab != nullptr)
- saveState();
- }
-
- if (tab != nullptr)
- tab->chatLog(line, own, ignoreRecord, tryRemoveColors);
-}
-
-void ChatWindow::initTradeFilter()
-{
- const std::string tradeListName = settings.serverConfigDir
- + "/tradefilter.txt";
-
- std::ifstream tradeFile;
- struct stat statbuf;
-
- if (stat(tradeListName.c_str(), &statbuf) == 0 &&
- S_ISREG(statbuf.st_mode))
- {
- tradeFile.open(tradeListName.c_str(), std::ios::in);
- if (tradeFile.is_open())
- {
- char line[100];
- while (tradeFile.getline(line, 100))
- {
- const std::string str = line;
- if (!str.empty())
- mTradeFilter.push_back(str);
- }
- }
- tradeFile.close();
- }
-}
-
-void ChatWindow::updateOnline(const std::set<std::string> &onlinePlayers) const
-{
- const Party *party = nullptr;
- const Guild *guild = nullptr;
- if (localPlayer != nullptr)
- {
- party = localPlayer->getParty();
- guild = localPlayer->getGuild();
- }
- FOR_EACH (TabMap::const_iterator, iter, mWhispers)
- {
- if (iter->second == nullptr)
- return;
-
- WhisperTab *const tab = static_cast<WhisperTab*>(iter->second);
- if (tab == nullptr)
- continue;
-
- if (onlinePlayers.find(tab->getNick()) != onlinePlayers.end())
- {
- tab->setWhisperTabColors();
- }
- else
- {
- const std::string &nick = tab->getNick();
- if (actorManager != nullptr)
- {
- const Being *const being = actorManager->findBeingByName(
- nick, ActorType::Player);
- if (being != nullptr)
- {
- tab->setWhisperTabColors();
- continue;
- }
- }
- if (party != nullptr)
- {
- const PartyMember *const pm = party->getMember(nick);
- if ((pm != nullptr) && pm->getOnline())
- {
- tab->setWhisperTabColors();
- continue;
- }
- }
- if (guild != nullptr)
- {
- const GuildMember *const gm = guild->getMember(nick);
- if ((gm != nullptr) && gm->getOnline())
- {
- tab->setWhisperTabColors();
- continue;
- }
- }
- tab->setWhisperTabOfflineColors();
- }
- }
-}
-
-void ChatWindow::loadState()
-{
- int num = 0;
- while (num < 50)
- {
- const std::string nick = serverConfig.getValue(
- "chatWhisper" + toString(num), "");
-
- if (nick.empty())
- break;
-
- const int flags = serverConfig.getValue(
- "chatWhisperFlags" + toString(num), 1);
-
- ChatTab *const tab = addChatTab(nick, false, false);
- if (tab != nullptr)
- {
- tab->setAllowHighlight((flags & 1) != 0);
- tab->setRemoveNames(((flags & 2) / 2) != 0);
- tab->setNoAway(((flags & 4) / 4) != 0);
- }
- num ++;
- }
-}
-
-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 == nullptr)
- 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 == nullptr)
- return;
- if (!saveTab(num, iter->second))
- continue;
- num ++;
- }
-
- while (num < 50)
- {
- serverConfig.deleteKey("chatWhisper" + toString(num));
- serverConfig.deleteKey("chatWhisperFlags" + toString(num));
- num ++;
- }
-}
-
-bool ChatWindow::saveTab(const int num,
- const ChatTab *const tab) const
-{
- if (tab == nullptr)
- return false;
-
- serverConfig.setValue("chatWhisper" + toString(num),
- tab->getChannelName());
-
- serverConfig.setValue("chatWhisperFlags" + toString(num),
- CAST_S32(tab->getAllowHighlight())
- + (2 * CAST_S32(tab->getRemoveNames()))
- + (4 * CAST_S32(tab->getNoAway())));
-
- return true;
-}
-
-std::string ChatWindow::doReplace(const std::string &msg)
-{
- std::string str = msg;
- replaceSpecialChars(str);
- return str;
-}
-
-void ChatWindow::loadCustomList()
-{
- std::ifstream listFile;
- struct stat statbuf;
-
- std::string listName = settings.serverConfigDir
- + "/customwords.txt";
-
- if ((stat(listName.c_str(), &statbuf) == 0) && S_ISREG(statbuf.st_mode))
- {
- listFile.open(listName.c_str(), std::ios::in);
- if (listFile.is_open())
- {
- char line[101];
- while (listFile.getline(line, 100))
- {
- std::string str = line;
- if (!str.empty())
- mCustomWords.push_back(str);
- }
- }
- listFile.close();
- }
-}
-
-void ChatWindow::addToAwayLog(const std::string &line)
-{
- if (!settings.awayMode)
- return;
-
- if (mAwayLog.size() > 20)
- mAwayLog.pop_front();
-
- if (findI(line, mHighlights) != std::string::npos)
- mAwayLog.push_back("##aaway:" + line);
-}
-
-void ChatWindow::displayAwayLog() const
-{
- if (localChatTab == nullptr)
- return;
-
- std::list<std::string>::const_iterator i = mAwayLog.begin();
- const std::list<std::string>::const_iterator i_end = mAwayLog.end();
-
- while (i != i_end)
- {
- std::string str = *i;
- localChatTab->addNewRow(str);
- ++i;
- }
-}
-
-void ChatWindow::parseHighlights()
-{
- mHighlights.clear();
- if (localPlayer == nullptr)
- return;
-
- splitToStringVector(mHighlights, config.getStringValue(
- "highlightWords"), ',');
-
- mHighlights.push_back(localPlayer->getName());
-}
-
-void ChatWindow::parseGlobalsFilter()
-{
- mGlobalsFilter.clear();
- if (localPlayer == nullptr)
- return;
-
- splitToStringVector(mGlobalsFilter, config.getStringValue(
- "globalsFilter"), ',');
-
- mHighlights.push_back(localPlayer->getName());
-}
-
-bool ChatWindow::findHighlight(const std::string &str)
-{
- return findI(str, mHighlights) != std::string::npos;
-}
-
-void ChatWindow::copyToClipboard(const int x, const int y) const
-{
- const ChatTab *const tab = getFocused();
- if (tab == nullptr)
- return;
-
- const BrowserBox *const text = tab->mTextOutput;
- if (text == nullptr)
- return;
-
- std::string str = text->getTextAtPos(x, y);
- sendBuffer(str);
-}
-
-void ChatWindow::optionChanged(const std::string &name)
-{
- if (name == "autohideChat")
- mAutoHide = config.getBoolValue("autohideChat");
- else if (name == "showBattleEvents")
- mShowBattleEvents = config.getBoolValue("showBattleEvents");
- else if (name == "globalsFilter")
- parseGlobalsFilter();
- else if (name == "enableTradeFilter")
- mEnableTradeFilter = config.getBoolValue("enableTradeFilter");
-}
-
-void ChatWindow::mouseMoved(MouseEvent &event)
-{
- mHaveMouse = true;
- Window::mouseMoved(event);
-}
-
-void ChatWindow::mouseEntered(MouseEvent& event)
-{
- mHaveMouse = true;
- Window::mouseEntered(event);
-}
-
-void ChatWindow::mouseExited(MouseEvent& event)
-{
- updateVisibility();
- Window::mouseExited(event);
-}
-
-void ChatWindow::draw(Graphics *const graphics)
-{
- BLOCK_START("ChatWindow::draw")
- if (!mAutoHide || mHaveMouse)
- {
- GLDEBUG_START("ChatWindow::draw");
- Window::draw(graphics);
- GLDEBUG_END();
- }
- BLOCK_END("ChatWindow::draw")
-}
-
-void ChatWindow::safeDraw(Graphics *const graphics)
-{
- BLOCK_START("ChatWindow::draw")
- if (!mAutoHide || mHaveMouse)
- {
- GLDEBUG_START("ChatWindow::draw");
- Window::safeDraw(graphics);
- GLDEBUG_END();
- }
- BLOCK_END("ChatWindow::draw")
-}
-
-void ChatWindow::updateVisibility()
-{
- if (gui == nullptr)
- return;
-
- int mouseX = 0;
- int mouseY = 0;
- int x = 0;
- int y = 0;
- Gui::getMouseState(mouseX, mouseY);
- getAbsolutePosition(x, y);
- if (mChatInput->isVisible())
- {
- mHaveMouse = true;
- }
- else
- {
- mHaveMouse = mouseX >= x && mouseX <= x + getWidth()
- && mouseY >= y && mouseY <= y + getHeight();
- }
-}
-
-void ChatWindow::unHideWindow()
-{
- mHaveMouse = true;
-}
-
-#ifdef USE_PROFILER
-void ChatWindow::logicChildren()
-{
- BLOCK_START("ChatWindow::logicChildren")
- BasicContainer::logicChildren();
- BLOCK_END("ChatWindow::logicChildren")
-}
-#endif // USE_PROFILER
-
-void ChatWindow::addGlobalMessage(const std::string &line)
-{
- if (debugChatTab != nullptr &&
- findI(line, mGlobalsFilter) != std::string::npos)
- {
- debugChatTab->chatLog(line, ChatMsgType::BY_OTHER);
- }
- else
- {
- localChatTab->chatLog(line, ChatMsgType::BY_GM);
- }
-}
-
-bool ChatWindow::isTabPresent(const ChatTab *const tab) const
-{
- return mChatTabs->isTabPresent(tab);
-}
-
-void ChatWindow::debugMessage(const std::string &msg)
-{
- if (debugChatTab != nullptr)
- debugChatTab->chatLog(msg, ChatMsgType::BY_SERVER);
-}
-
-void ChatWindow::showGMTab()
-{
- if ((gmChatTab == nullptr) &&
- config.getBoolValue("enableGmTab") &&
- localPlayer->getGroupId() >= paths.getIntValue("gmTabMinimalLevel"))
- {
- addSpecialChannelTab(GM_CHANNEL, false);
- }
-}
-
-void ChatWindow::toggleChatFocus()
-{
- if (mChatInput->isVisible() && mChatInput->isFocused())
- mChatInput->processVisible(Visible_false);
- else
- requestChatFocus();
-}
-
-void ChatWindow::joinRoom(const bool isJoin)
-{
- Tab *const tab = mChatTabs->getTabByIndex(0);
- if (tab != nullptr)
- {
- std::string name;
- if (isJoin)
- {
- name = PlayerInfo::getRoomName();
- }
- else
- {
- // TRANSLATORS: chat tab name
- name = _("General");
- }
- tab->setCaption(name);
- }
-}
-
-void ChatWindow::scheduleDelete()
-{
- DebugMessageListener::removeListener(this);
- Window::scheduleDelete();
-}