diff options
Diffstat (limited to 'src/net/chathandler.cpp')
-rw-r--r-- | src/net/chathandler.cpp | 311 |
1 files changed, 196 insertions, 115 deletions
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()); + } +} + |