summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Makefile.am2
-rw-r--r--src/commandhandler.cpp10
-rw-r--r--src/gui/chat.cpp38
-rw-r--r--src/gui/chat.h6
-rw-r--r--src/gui/widgets/chattab.h2
-rw-r--r--src/gui/widgets/whispertab.cpp77
-rw-r--r--src/gui/widgets/whispertab.h54
-rw-r--r--src/net/ea/chathandler.cpp11
8 files changed, 183 insertions, 17 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index ff2aae3d..4c5893ac 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -25,6 +25,8 @@ tmw_SOURCES = gui/widgets/avatar.cpp \
gui/widgets/tabbedarea.h \
gui/widgets/textpreview.cpp \
gui/widgets/textpreview.h \
+ gui/widgets/whispertab.cpp \
+ gui/widgets/whispertab.h \
gui/browserbox.cpp \
gui/browserbox.h \
gui/button.cpp \
diff --git a/src/commandhandler.cpp b/src/commandhandler.cpp
index 96b66835..833ce718 100644
--- a/src/commandhandler.cpp
+++ b/src/commandhandler.cpp
@@ -383,15 +383,7 @@ void CommandHandler::handleMsg(const std::string &args)
if (tempNick.compare(playerName) == 0 || args.empty())
return;
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_CHAT_WHISPER);
- outMsg.writeInt16(msg.length() + 28);
- outMsg.writeString(recvnick, 24);
- outMsg.writeString(msg, msg.length());
-
- chatWindow->chatLog(strprintf(_("Whispering to %s: %s"),
- recvnick.c_str(), msg.c_str()),
- BY_PLAYER);
+ chatWindow->whisper(recvnick, msg, true);
}
else
chatWindow->chatLog("Cannont send empty whispers!");
diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp
index 8961b704..174285c9 100644
--- a/src/gui/chat.cpp
+++ b/src/gui/chat.cpp
@@ -29,6 +29,7 @@
#include "sdlinput.h"
#include "widgets/tabbedarea.h"
+#include "widgets/whispertab.h"
#include "../beingmanager.h"
#include "../configuration.h"
@@ -96,6 +97,7 @@ ChatWindow::~ChatWindow()
delete mRecorder;
#endif
delete_all(mTabs);
+ delete_all(mWhispers);
delete mItemLinkHandler;
}
@@ -137,6 +139,12 @@ void ChatWindow::widgetResized(const gcn::Event &event)
void ChatWindow::logic()
{
Window::logic();
+
+ Tab *tab = getFocused();
+ if (tab != currentTab) {
+ currentTab == tab;
+ adjustTabSize();
+ }
}
void ChatWindow::chatLog(std::string line, int own, std::string channelName,
@@ -394,3 +402,33 @@ void ChatWindow::setRecordingFile(const std::string &msg)
{
mRecorder->setRecordingFile(msg);
}
+
+void ChatWindow::whisper(std::string nick, std::string mes, bool own)
+{
+ if (mes.length() == 0) return;
+ std::string playerName = player_node->getName();
+ std::string tempNick = nick;
+
+ toLower(playerName);
+ toLower(tempNick);
+
+ if (tempNick.compare(playerName) == 0)
+ if (own)
+ ;
+ else
+ return;
+
+ ChatTab *tab = mWhispers[tempNick];
+
+ if (!tab)
+ {
+ tab = new WhisperTab(tempNick);
+ mWhispers[tempNick] = tab;
+ mChatTabs->addTab(tab, tab->mScrollArea);
+ }
+
+ if (own)
+ tab->chatSend(mes);
+ else
+ tab->chatLog(nick, mes);
+}
diff --git a/src/gui/chat.h b/src/gui/chat.h
index 89bb033e..46358268 100644
--- a/src/gui/chat.h
+++ b/src/gui/chat.h
@@ -45,6 +45,7 @@ class ItemLinkHandler;
#ifdef EATHENA_SUPPORT
class Network;
#endif
+class WhisperTab;
enum
{
@@ -227,8 +228,11 @@ class ChatWindow : public Window,
void doPresent();
+ void whisper(std::string nick, std::string mes, bool own = false);
+
protected:
friend class ChatTab;
+ friend class WhisperTab;
void adjustTabSize();
@@ -249,10 +253,12 @@ class ChatWindow : public Window,
/** Tabbed area for holding each channel. */
TabbedArea *mChatTabs;
+ Tab *currentTab;
typedef std::map<const std::string, ChatTab*> TabMap;
/** Map each tab to its browser and scroll area. */
TabMap mTabs;
+ TabMap mWhispers;
typedef std::list<std::string> History;
typedef History::iterator HistoryIterator;
diff --git a/src/gui/widgets/chattab.h b/src/gui/widgets/chattab.h
index d102d7a0..9e2aff6b 100644
--- a/src/gui/widgets/chattab.h
+++ b/src/gui/widgets/chattab.h
@@ -90,7 +90,7 @@ class ChatTab : public Tab
protected:
friend class ChatWindow;
- void sendChat(std::string &msg);
+ virtual void sendChat(std::string &msg);
ScrollArea *mScrollArea;
BrowserBox *mTextOutput;
diff --git a/src/gui/widgets/whispertab.cpp b/src/gui/widgets/whispertab.cpp
new file mode 100644
index 00000000..b67b74f8
--- /dev/null
+++ b/src/gui/widgets/whispertab.cpp
@@ -0,0 +1,77 @@
+/*
+ * The Mana World
+ * Copyright (C) 2008 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <guichan/widgets/label.hpp>
+
+#include "whispertab.h"
+
+#include "../../beingmanager.h"
+#include "../../commandhandler.h"
+#include "../../channel.h"
+#include "../../configuration.h"
+#include "../../game.h"
+#include "../../localplayer.h"
+
+#ifdef TMWSERV_SUPPORT
+#include "../../net/tmwserv/chatserver/chatserver.h"
+#include "../../net/tmwserv/gameserver/player.h"
+#else
+#include "../../party.h"
+#include "../../net/messageout.h"
+#include "../../net/ea/protocol.h"
+#endif
+
+#include "../../resources/iteminfo.h"
+#include "../../resources/itemdb.h"
+
+#include "../../utils/dtor.h"
+#include "../../utils/gettext.h"
+#include "../../utils/strprintf.h"
+#include "../../utils/stringutils.h"
+
+WhisperTab::WhisperTab(std::string nick) : ChatTab(nick),
+ mNick(nick)
+{
+}
+
+WhisperTab::~WhisperTab()
+{
+}
+
+void WhisperTab::sendChat(std::string &msg) {
+ if (msg.length() == 0) {
+ chatLog(_("Cannot send empty chat!"), BY_SERVER, false);
+ return;
+ }
+
+#ifdef TMWSERV_SUPPORT
+ Net::ChatServer::privMsg(mNick, msg);
+#else
+ MessageOut outMsg(chatWindow->mNetwork);
+ outMsg.writeInt16(CMSG_CHAT_WHISPER);
+ outMsg.writeInt16(msg.length() + 28);
+ outMsg.writeString(mNick, 24);
+ outMsg.writeString(msg, msg.length());
+#endif
+
+ chatLog(strprintf(_("%s: %s"), player_node->getName().c_str(),
+ msg.c_str()), BY_PLAYER, false);
+}
diff --git a/src/gui/widgets/whispertab.h b/src/gui/widgets/whispertab.h
new file mode 100644
index 00000000..66ec2720
--- /dev/null
+++ b/src/gui/widgets/whispertab.h
@@ -0,0 +1,54 @@
+/*
+ * The Mana World
+ * Copyright (C) 2009 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef WHISPERTAB_H
+#define WHISPERTAB_H
+
+#include "chattab.h"
+
+class Channel;
+
+/**
+ * A tab for whispers from a single nick.
+ */
+class WhisperTab : public ChatTab
+{
+ public:
+ /**
+ * Constructor.
+ */
+ WhisperTab(std::string nick);
+
+ /**
+ * Destructor.
+ */
+ ~WhisperTab();
+
+ std::string getNick() { return mNick; }
+
+ protected:
+ void sendChat(std::string &msg);
+
+ private:
+ std::string mNick;
+};
+
+#endif // CHANNELTAB_H
diff --git a/src/net/ea/chathandler.cpp b/src/net/ea/chathandler.cpp
index 4842c86f..aaf56555 100644
--- a/src/net/ea/chathandler.cpp
+++ b/src/net/ea/chathandler.cpp
@@ -89,15 +89,12 @@ void ChatHandler::handleMessage(MessageIn &msg)
break;
chatMsg = msg.readString(chatMsgLength);
- if (nick != SERVER_NAME)
- chatMsg = nick + " : " + chatMsg;
- if (nick == SERVER_NAME)
- chatWindow->chatLog(chatMsg, BY_SERVER);
- else {
+ if (nick != SERVER_NAME)
if (player_relations.hasPermission(nick, PlayerRelation::WHISPER))
- chatWindow->chatLog(chatMsg, ACT_WHISPER);
- }
+ chatWindow->whisper(nick, chatMsg);
+ else
+ chatWindow->chatLog(chatMsg, BY_SERVER);
break;