summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--src/channel.cpp38
-rw-r--r--src/channel.h72
-rw-r--r--src/gui/chat.cpp96
-rw-r--r--src/gui/chat.h71
-rw-r--r--src/net/chathandler.cpp311
-rw-r--r--src/net/chathandler.h56
-rw-r--r--src/net/guildhandler.cpp8
-rw-r--r--src/net/protocol.h17
9 files changed, 368 insertions, 312 deletions
diff --git a/ChangeLog b/ChangeLog
index add6d288..ec4a3eaf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2008-06-03 Roderic Morris <roderic@ccs.neu.edu>
+
+ * src/gui/chat.cpp, src/gui/chat.h, src/net/guildhandler.cpp:
+ Get rid of more eAthena related code, get rid of the redundant
+ addChannel method.
+ * src/net/chathandler.cpp, src/net/chathandler.h, src/net/protocol.h,:
+ break up the logic in chathandler with helper methods, add enums
+ for up to now unhandled messages, handle announcements and leave /
+ enter messages for channels.
+ * src/channel.h, src/channel.cpp: handle user lists and announcements.
+
2008-05-30 Roderic Morris <roderic@ccs.neu.edu>
* src/gui/chat.cpp, src/net/chathandler.cpp: Fixed handling of
diff --git a/src/channel.cpp b/src/channel.cpp
index 3204b3b2..2bebcf51 100644
--- a/src/channel.cpp
+++ b/src/channel.cpp
@@ -21,35 +21,33 @@
* $Id$
*/
+#include <algorithm>
#include "channel.h"
-Channel::Channel(short id) :
-mID(id)
+Channel::Channel(short id,
+ const std::string &name,
+ const std::string &announcement) :
+ mId(id),
+ mName(name),
+ mAnnouncement(announcement)
{
}
-std::string Channel::getName() const
+void Channel::addUser(const std::string &user)
{
- return mName;
+ // Check if the user already exists in the channel
+ ChannelUsers::const_iterator i = mUserList.begin(),
+ i_end = mUserList.end();
+ if (std::find(i, i_end, user) != i_end) return;
+ mUserList.push_back(user);
}
-void Channel::setName(const std::string &channelName)
+void Channel::removeUser(const std::string &user)
{
- mName = channelName;
-}
-
-int Channel::getUserListSize() const
-{
- return userList.size();
-}
-
-std::string Channel::getUser(unsigned int id) const
-{
- if(id <= userList.size())
- {
- return userList[id];
- }
- return "";
+ ChannelUsers::iterator i_end = mUserList.end(),
+ i = std::find(mUserList.begin(), i_end, user);
+ if (i == i_end) return;
+ mUserList.erase(i);
}
diff --git a/src/channel.h b/src/channel.h
index ea6789ee..9f7557c1 100644
--- a/src/channel.h
+++ b/src/channel.h
@@ -27,15 +27,69 @@
class Channel
{
public:
- Channel(short id);
- std::string getName() const;
- void setName(const std::string &channelName);
- int getId() const { return mID; }
- int getUserListSize() const;
- std::string getUser(unsigned int i) const;
+
+ typedef std::vector<std::string> ChannelUsers;
+
+ /**
+ * Constructor.
+ *
+ * @param id the id associated with the channel.
+ * @param name the name of the channel.
+ * @param announcement a welcome message.
+ */
+ Channel(short id,
+ const std::string &name,
+ const std::string &announcement = std::string());
+
+ /**
+ * Get the id associated witht his channel
+ */
+ int getId() const { return mId; }
+
+ /**
+ * Get this channel's name
+ */
+ const std::string& getName() const
+ { return mName; }
+
+ /**
+ * Get the announcement message for this channel
+ */
+ const std::string& getAnnouncement() const
+ { return mAnnouncement; }
+
+ /**
+ * Get the list of users in this channel
+ */
+ const ChannelUsers& getUserList() const
+ { return mUserList; }
+
+ /**
+ * Sets the name of the channel.
+ */
+ void setName(const std::string &channelName)
+ { mName = channelName; }
+
+ /**
+ * Sets the announcement string of the channel.
+ */
+ void setAnnouncement(const std::string &channelAnnouncement)
+ { mAnnouncement = channelAnnouncement; }
+
+ /**
+ * Adds a user to this channel.
+ */
+ void addUser(const std::string &user);
+
+ /**
+ * Removes a user from the channel.
+ */
+ void removeUser(const std::string &user);
+
private:
- typedef std::vector<std::string> Users;
+
+ unsigned short mId;
std::string mName;
- short mID;
- Users userList;
+ std::string mAnnouncement;
+ ChannelUsers mUserList;
};
diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp
index 3748b31c..e7b82621 100644
--- a/src/gui/chat.cpp
+++ b/src/gui/chat.cpp
@@ -203,14 +203,6 @@ ChatWindow::chatLog(std::string line, int own, const std::string &channelName)
scroll->logic();
}
-#if 0
-void
-ChatWindow::chatLog(CHATSKILL act)
-{
- chatLog(const_msg(act), BY_SERVER);
-}
-#endif
-
void
ChatWindow::action(const gcn::ActionEvent &event)
{
@@ -385,94 +377,6 @@ void ChatWindow::chatSend(std::string const &nick, std::string const &msg,
}
}
-#if 0
-std::string
-ChatWindow::const_msg(CHATSKILL act)
-{
- std::string msg;
- if (act.success == SKILL_FAILED && act.skill == SKILL_BASIC) {
- switch (act.bskill) {
- case BSKILL_TRADE :
- msg = "Trade failed!";
- break;
- case BSKILL_EMOTE :
- msg = "Emote failed!";
- break;
- case BSKILL_SIT :
- msg = "Sit failed!";
- break;
- case BSKILL_CREATECHAT :
- msg = "Chat creating failed!";
- break;
- case BSKILL_JOINPARTY :
- msg = "Could not join party!";
- break;
- case BSKILL_SHOUT :
- msg = "Cannot shout!";
- break;
- }
-
- switch (act.reason) {
- case RFAIL_SKILLDEP :
- msg += " You have not yet reached a high enough lvl!";
- break;
- case RFAIL_INSUFHP :
- msg += " Insufficient HP!";
- break;
- case RFAIL_INSUFSP :
- msg += " Insufficient SP!";
- break;
- case RFAIL_NOMEMO :
- msg += " You have no memos!";
- break;
- case RFAIL_SKILLDELAY :
- msg += " You cannot do that right now!";
- break;
- case RFAIL_ZENY :
- msg += " Seems you need more Zeny... ;-)";
- break;
- case RFAIL_WEAPON :
- msg += " You cannot use this skill with that kind of weapon!";
- break;
- case RFAIL_REDGEM :
- msg += " You need another red gem!";
- break;
- case RFAIL_BLUEGEM :
- msg += " You need another blue gem!";
- break;
- case RFAIL_OVERWEIGHT :
- msg += " You're carrying to much to do this!";
- break;
- default :
- msg += " Huh? What's that?";
- break;
- }
- } else {
- switch(act.skill) {
- case SKILL_WARP :
- msg = "Warp failed...";
- break;
- case SKILL_STEAL :
- msg = "Could not steal anything...";
- break;
- case SKILL_ENVENOM :
- msg = "Poison had no effect...";
- break;
- }
- }
-
- return msg;
-}
-#endif
-
-void
-ChatWindow::addChannel(short channelId, const std::string &channelName)
-{
- Channel *channel = new Channel(channelId);
- channel->setName(channelName);
- channelManager->addChannel(channel);
-}
-
void
ChatWindow::removeChannel(short channelId)
{
diff --git a/src/gui/chat.h b/src/gui/chat.h
index 26e30374..148feb7e 100644
--- a/src/gui/chat.h
+++ b/src/gui/chat.h
@@ -49,57 +49,6 @@ enum
BY_LOGGER
};
-#if 0
-/**
- * gets in between usernick and message text depending on
- * message type
- */
-#define CAT_NORMAL ": "
-#define CAT_IS ""
-#define CAT_WHISPER " says: "
-
-/** job dependend identifiers (?) */
-#define SKILL_BASIC 0x0001
-#define SKILL_WARP 0x001b
-#define SKILL_STEAL 0x0032
-#define SKILL_ENVENOM 0x0034
-
-/** basic skills identifiers */
-#define BSKILL_TRADE 0x0000
-#define BSKILL_EMOTE 0x0001
-#define BSKILL_SIT 0x0002
-#define BSKILL_CREATECHAT 0x0003
-#define BSKILL_JOINPARTY 0x0004
-#define BSKILL_SHOUT 0x0005
-#define BSKILL_PK 0x0006 // ??
-#define BSKILL_SETALLIGN 0x0007 // ??
-
-/** reasons why action failed */
-#define RFAIL_SKILLDEP 0x00
-#define RFAIL_INSUFHP 0x01
-#define RFAIL_INSUFSP 0x02
-#define RFAIL_NOMEMO 0x03
-#define RFAIL_SKILLDELAY 0x04
-#define RFAIL_ZENY 0x05
-#define RFAIL_WEAPON 0x06
-#define RFAIL_REDGEM 0x07
-#define RFAIL_BLUEGEM 0x08
-#define RFAIL_OVERWEIGHT 0x09
-#define RFAIL_GENERIC 0x0a
-
-/** should always be zero if failed */
-#define SKILL_FAILED 0x00
-
-struct CHATSKILL
-{
- short skill;
- short bskill;
- short unused;
- char success;
- char reason;
-};
-#endif
-
/**
* The chat window.
*
@@ -126,7 +75,7 @@ class ChatWindow : public Window,
*/
void widgetResized(const gcn::Event &event);
- /*
+ /**
* Adds a line of text to our message list. Parameters:
*
* @param line Text message.
@@ -134,13 +83,6 @@ class ChatWindow : public Window,
*/
void chatLog(std::string line, int own, const std::string &channelName = "General");
-#if 0
- /*
- * Calls original chat_log() after processing the packet.
- */
- void chatLog(CHATSKILL);
-#endif
-
/**
* Performs action.
*/
@@ -156,7 +98,7 @@ class ChatWindow : public Window,
*/
bool isFocused();
- /*
+ /**
* Determines whether to send a command or an ordinary message, then
* contructs packets & sends them.
*
@@ -183,10 +125,6 @@ class ChatWindow : public Window,
void chatSend(std::string const &nick, std::string const &msg,
std::string const &channelName);
- /** Called to add the channel to the channel manager */
- void
- addChannel(short channel, const std::string &channelName);
-
/** Called to remove the channel from the channel manager */
void
removeChannel(short channelId);
@@ -251,11 +189,6 @@ class ChatWindow : public Window,
ScrollArea *scroll;
};
-#if 0
- /** Constructs failed messages for actions */
- std::string const_msg(CHATSKILL);*/
-#endif
-
/** Tabbed area for holding each channel. */
TabbedArea *mChatTabs;
diff --git a/src/net/chathandler.cpp b/src/net/chathandler.cpp
index 824d6e8c..aa090d64 100644
--- a/src/net/chathandler.cpp
+++ b/src/net/chathandler.cpp
@@ -33,6 +33,8 @@
#include "../being.h"
#include "../beingmanager.h"
#include "../game.h"
+#include "../channel.h"
+#include "../channelmanager.h"
#include "../gui/chat.h"
#include "../gui/guildwindow.h"
@@ -53,6 +55,7 @@ ChatHandler::ChatHandler()
CPMSG_PRIVMSG,
CPMSG_QUIT_CHANNEL_RESPONSE,
CPMSG_LIST_CHANNELUSERS_RESPONSE,
+ CPMSG_CHANNEL_EVENT,
0
};
handledMessages = _messages;
@@ -60,146 +63,224 @@ ChatHandler::ChatHandler()
void ChatHandler::handleMessage(MessageIn &msg)
{
- Being *being;
- std::string chatMsg;
- short channelId;
- short id;
- std::string userNick;
- std::string channelName;
- short error = -1;
-
switch (msg.getId())
{
case GPMSG_SAY:
- id = msg.readInt16();
- chatMsg = msg.readString();
- if (id == 0)
- {
- chatWindow->chatLog(chatMsg, BY_SERVER);
- break;
- }
- being = beingManager->findBeing(id);
- if (being)
- {
- chatWindow->chatLog(being->getName() + " : " + chatMsg, being == player_node ? BY_PLAYER : BY_OTHER);
- being->setSpeech(chatMsg, SPEECH_TIME);
- }
- else
- {
- chatWindow->chatLog("Unknown : " + chatMsg, BY_OTHER);
- }
+ handleGameChatMessage(msg);
break;
+
case CPMSG_REGISTER_CHANNEL_RESPONSE:
- error = msg.readInt8();
- if(error == ERRMSG_OK)
- {
- channelId = msg.readInt16();
- std::string channelName = msg.readString();
- chatWindow->chatLog("Registered Channel " + channelName, BY_SERVER);
- chatWindow->addChannel(channelId, channelName);
- chatWindow->createNewChannelTab(channelName);
- }
- else
- {
- if (error == ERRMSG_INVALID_ARGUMENT)
- {
- chatWindow->chatLog("Error registering channel - Invalid Channel Name given", BY_SERVER);
- }
- else
- {
- chatWindow->chatLog("Error registering channel", BY_SERVER);
- }
- }
+ handleRegisterChannelResponse(msg);
break;
+
case CPMSG_ENTER_CHANNEL_RESPONSE:
- if(msg.readInt8() == ERRMSG_OK)
- {
- channelId = msg.readInt16();
- channelName = msg.readString();
- std::string announcement = msg.readString();
- std::vector<std::string> userList;
- std::string user;
- while(msg.getUnreadLength())
- {
- user = msg.readString();
- if (user == "")
- break;
- userList.push_back(user);
- }
- chatWindow->addChannel(channelId, channelName);
- chatWindow->createNewChannelTab(channelName);
- chatWindow->chatLog(announcement, BY_SERVER, channelName);
- }
- else
- {
- chatWindow->chatLog("Error joining channel", BY_SERVER);
- }
+ handleEnterChannelResponse(msg);
break;
case CPMSG_LIST_CHANNELS_RESPONSE:
- chatWindow->chatLog("Listing Channels", BY_SERVER);
- while(msg.getUnreadLength())
- {
- channelName = msg.readString();
- if (channelName == "")
- break;
- std::ostringstream numUsers;
- numUsers << msg.readInt16();
- if(channelName != "")
- {
- channelName += " - ";
- channelName += numUsers.str();
- chatWindow->chatLog(channelName, BY_SERVER);
- }
- }
- chatWindow->chatLog("End of channel list", BY_SERVER);
+ handleListChannelsResponse(msg);
break;
case CPMSG_PRIVMSG:
- userNick = msg.readString();
- chatMsg = msg.readString();
-
- if (!chatWindow->tabExists(userNick))
- {
- chatWindow->createNewChannelTab(userNick);
-
- }
- chatWindow->chatLog(userNick + ": " + chatMsg, BY_OTHER, userNick);
+ handlePrivateMessage(msg);
break;
case CPMSG_ANNOUNCEMENT:
- chatMsg = msg.readString();
- chatWindow->chatLog(chatMsg, BY_GM);
+ handleAnnouncement(msg);
break;
case CPMSG_PUBMSG:
- channelId = msg.readInt16();
- userNick = msg.readString();
- chatMsg = msg.readString();
-
- chatWindow->sendToChannel(channelId, userNick, chatMsg);
+ handleChatMessage(msg);
break;
case CPMSG_QUIT_CHANNEL_RESPONSE:
- if(msg.readInt8() == ERRMSG_OK)
- {
- channelId = msg.readInt16();
- // remove the chat tab
- chatWindow->removeChannel(channelId);
- }
+ handleQuitChannelResponse(msg);
break;
case CPMSG_LIST_CHANNELUSERS_RESPONSE:
- channelName = msg.readString();
- while(msg.getUnreadLength())
- {
- userNick = msg.readString();
- if (userNick == "")
- {
- break;
- }
- guildWindow->setOnline(channelName, userNick, true);
- }
+ handleListChannelUsersResponse(msg);
+ break;
+
+ case CPMSG_CHANNEL_EVENT:
+ handleChannelEvent(msg);
+ }
+}
+
+void ChatHandler::handleGameChatMessage(MessageIn &msg)
+{
+ short id = msg.readInt16();
+ std::string chatMsg = msg.readString();
+
+ if (id == 0)
+ {
+ chatWindow->chatLog(chatMsg, BY_SERVER);
+ return;
+ }
+
+ Being *being = beingManager->findBeing(id);
+
+ if (being)
+ {
+ chatWindow->chatLog(being->getName() + " : " + chatMsg,
+ being == player_node ? BY_PLAYER : BY_OTHER);
+ being->setSpeech(chatMsg, SPEECH_TIME);
+ }
+ else
+ {
+ chatWindow->chatLog("Unknown : " + chatMsg, BY_OTHER);
+ }
+}
+
+void ChatHandler::handleRegisterChannelResponse(MessageIn &msg)
+{
+ char error = msg.readInt8();
+ if(error == ERRMSG_OK)
+ {
+ short channelId = msg.readInt16();
+ std::string channelName = msg.readString();
+ std::string channelAnnouncement = msg.readString();
+ chatWindow->chatLog("Registered Channel " + channelName, BY_SERVER);
+ channelManager->addChannel(new Channel(channelId,
+ channelName,
+ channelAnnouncement));
+ chatWindow->createNewChannelTab(channelName);
+ }
+ else
+ {
+ if (error == ERRMSG_INVALID_ARGUMENT)
+ {
+ chatWindow->chatLog("Error registering channel - Invalid Channel Name given", BY_SERVER);
+ }
+ else
+ {
+ chatWindow->chatLog("Error registering channel", BY_SERVER);
+ }
+ }
+}
+
+void ChatHandler::handleEnterChannelResponse(MessageIn &msg)
+{
+ if(msg.readInt8() == ERRMSG_OK)
+ {
+ short channelId = msg.readInt16();
+ std::string channelName = msg.readString();
+ std::string announcement = msg.readString();
+ Channel *channel = new Channel(channelId, channelName, announcement);
+ std::string user;
+ while(msg.getUnreadLength())
+ {
+ user = msg.readString();
+ if (user == "")
+ return;
+ channel->addUser(user);
+ }
+ channelManager->addChannel(channel);
+ chatWindow->createNewChannelTab(channelName);
+ chatWindow->chatLog(announcement, BY_SERVER, channelName);
+ }
+ else
+ {
+ chatWindow->chatLog("Error joining channel", BY_SERVER);
+ }
+}
+
+void ChatHandler::handleListChannelsResponse(MessageIn &msg)
+{
+ chatWindow->chatLog("Listing Channels", BY_SERVER);
+ while(msg.getUnreadLength())
+ {
+ std::string channelName = msg.readString();
+ if (channelName == "")
+ return;
+ std::ostringstream numUsers;
+ numUsers << msg.readInt16();
+ if(channelName != "")
+ {
+ channelName += " - ";
+ channelName += numUsers.str();
+ chatWindow->chatLog(channelName, BY_SERVER);
+ }
+ }
+ chatWindow->chatLog("End of channel list", BY_SERVER);
+}
+
+void ChatHandler::handlePrivateMessage(MessageIn &msg)
+{
+ std::string userNick = msg.readString();
+ std::string chatMsg = msg.readString();
+
+ if (!chatWindow->tabExists(userNick))
+ {
+ chatWindow->createNewChannelTab(userNick);
+
+ }
+ chatWindow->chatLog(userNick + ": " + chatMsg, BY_OTHER, userNick);
+}
+
+void ChatHandler::handleAnnouncement(MessageIn &msg)
+{
+ std::string chatMsg = msg.readString();
+ chatWindow->chatLog(chatMsg, BY_GM);
+}
+
+void ChatHandler::handleChatMessage(MessageIn &msg)
+{
+ short channelId = msg.readInt16();
+ std::string userNick = msg.readString();
+ std::string chatMsg = msg.readString();
+
+ chatWindow->sendToChannel(channelId, userNick, chatMsg);
+}
+
+void ChatHandler::handleQuitChannelResponse(MessageIn &msg)
+{
+ if(msg.readInt8() == ERRMSG_OK)
+ {
+ short channelId = msg.readInt16();
+ // remove the chat tab
+ chatWindow->removeChannel(channelId);
+ }
+}
+
+void ChatHandler::handleListChannelUsersResponse(MessageIn &msg)
+{
+ std::string channelName = msg.readString();
+ std::string userNick;
+ while(msg.getUnreadLength())
+ {
+ userNick = msg.readString();
+ if (userNick == "")
+ {
break;
+ }
+ guildWindow->setOnline(channelName, userNick, true);
}
}
+
+void ChatHandler::handleChannelEvent(MessageIn &msg)
+{
+ short channelId = msg.readInt16();
+ char eventId = msg.readInt8();
+ std::string line = msg.readString();
+ Channel *channel = channelManager->findById(channelId);
+
+ if(channel)
+ {
+ switch(eventId)
+ {
+ case CHAT_EVENT_NEW_PLAYER:
+ line += " entered the channel.";
+ break;
+
+ case CHAT_EVENT_LEAVING_PLAYER:
+ line += " left the channel.";
+ break;
+
+ default:
+ line = "Unknown channel event.";
+ }
+
+ chatWindow->chatLog(line, BY_SERVER, channel->getName());
+ }
+}
+
diff --git a/src/net/chathandler.h b/src/net/chathandler.h
index e9db3575..874998d9 100644
--- a/src/net/chathandler.h
+++ b/src/net/chathandler.h
@@ -30,8 +30,62 @@ class ChatHandler : public MessageHandler
{
public:
ChatHandler();
-
+
+ /**
+ * Handle the given message appropriately.
+ */
void handleMessage(MessageIn &msg);
+
+ private:
+ /**
+ * Handle chat messages sent from the game server.
+ */
+ void handleGameChatMessage(MessageIn &msg);
+
+ /**
+ * Handle channel registration responses.
+ */
+ void handleRegisterChannelResponse(MessageIn &msg);
+
+ /**
+ * Handle channel entry responses.
+ */
+ void handleEnterChannelResponse(MessageIn &msg);
+
+ /**
+ * Handle list channels responses.
+ */
+ void handleListChannelsResponse(MessageIn &msg);
+
+ /**
+ * Handle private messages.
+ */
+ void handlePrivateMessage(MessageIn &msg);
+
+ /**
+ * Handle announcements.
+ */
+ void handleAnnouncement(MessageIn &msg);
+
+ /**
+ * Handle chat messages.
+ */
+ void handleChatMessage(MessageIn &msg);
+
+ /**
+ * Handle quit channel responses.
+ */
+ void handleQuitChannelResponse(MessageIn &msg);
+
+ /**
+ * Handle list channel users responses.
+ */
+ void handleListChannelUsersResponse(MessageIn &msg);
+
+ /**
+ * Handle channel events.
+ */
+ void handleChannelEvent(MessageIn &msg);
};
#endif
diff --git a/src/net/guildhandler.cpp b/src/net/guildhandler.cpp
index 459c5ac4..10da5075 100644
--- a/src/net/guildhandler.cpp
+++ b/src/net/guildhandler.cpp
@@ -35,6 +35,8 @@
#include "../guild.h"
#include "../log.h"
#include "../localplayer.h"
+#include "../channel.h"
+#include "../channelmanager.h"
GuildHandler::GuildHandler()
{
@@ -181,6 +183,7 @@ void GuildHandler::joinedGuild(MessageIn &msg)
short guildId = msg.readInt16();
bool leader = msg.readInt8();
short channelId = msg.readInt16();
+ std::string announcement = msg.readString();
// Add guild to player and create new guild tab
Guild *guild = player_node->addGuild(guildId, leader);
@@ -190,7 +193,8 @@ void GuildHandler::joinedGuild(MessageIn &msg)
// Automatically create the guild channel
// COMMENT: Should this go here??
- chatWindow->addChannel(channelId, guildName);
+ Channel *channel = new Channel(channelId, guildName, announcement);
+ channelManager->addChannel(channel);
chatWindow->createNewChannelTab(guildName);
- chatWindow->chatLog("Guild Channel", BY_SERVER, guildName);
+ chatWindow->chatLog(announcement, BY_SERVER, guildName);
}
diff --git a/src/net/protocol.h b/src/net/protocol.h
index d2d5937d..87577942 100644
--- a/src/net/protocol.h
+++ b/src/net/protocol.h
@@ -252,4 +252,21 @@ enum {
MOVING_DESTINATION = 2
};
+// Email change specific return values
+enum {
+ EMAILCHG_EXISTS_EMAIL = 0x40
+};
+
+// Chat errors return values
+enum {
+ CHAT_USING_BAD_WORDS = 0x40,
+ CHAT_UNHANDLED_COMMAND
+};
+
+// Chat channels event values
+enum {
+ CHAT_EVENT_NEW_PLAYER = 0,
+ CHAT_EVENT_LEAVING_PLAYER
+};
+
#endif