diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | src/chat-server/chatchannelmanager.cpp | 16 | ||||
-rw-r--r-- | src/chat-server/chatchannelmanager.hpp | 7 | ||||
-rw-r--r-- | src/chat-server/chathandler.cpp | 73 | ||||
-rw-r--r-- | src/chat-server/chathandler.hpp | 25 | ||||
-rw-r--r-- | src/chat-server/guild.hpp | 6 | ||||
-rw-r--r-- | src/chat-server/guildmanager.cpp | 37 | ||||
-rw-r--r-- | src/chat-server/guildmanager.hpp | 6 | ||||
-rw-r--r-- | src/defines.h | 24 |
9 files changed, 148 insertions, 55 deletions
@@ -1,3 +1,12 @@ +2008-06-25 Roderic Morris <roderic@ccs.neu.edu> + + * src/chat-server/guildmanager.cpp, src/chat-server/guildmanager.hpp, + src/chat-server/chathandler.cpp, src/chat-server/chathandler.hpp, + src/chat-server/chatchannelmanager.cpp, src/chat-server/chatchannelmanager.hpp, + src/chat-server/guild.hpp: Handle topic changes, and inform guild members about + players going offline / online and leaving / joining the guild. + * src/defines.h: Update protocol definitions. + 2008-06-14 Roderic Morris <roderic@ccs.neu.edu> * src/account-server/dalstorage.cpp: Work around for members not being diff --git a/src/chat-server/chatchannelmanager.cpp b/src/chat-server/chatchannelmanager.cpp index 7a98f2cb..2b312b75 100644 --- a/src/chat-server/chatchannelmanager.cpp +++ b/src/chat-server/chatchannelmanager.cpp @@ -104,8 +104,8 @@ ChatChannel* ChatChannelManager::getChannel(int channelId) ChatChannel* ChatChannelManager::getChannel(const std::string &name) { - ChatChannelIterator i_end = mChatChannels.end(); - for (ChatChannelIterator i = mChatChannels.begin(); i != i_end; ++i) + for (ChatChannelIterator i = mChatChannels.begin(); + i != mChatChannels.end(); ++i) { if (i->second.getName() == name) { @@ -116,6 +116,18 @@ ChatChannel* ChatChannelManager::getChannel(const std::string &name) return NULL; } +void ChatChannelManager::setChannelTopic(int channelId, const std::string &topic) +{ + ChatChannelIterator i = mChatChannels.find(channelId); + if(i == mChatChannels.end()) + return; + + i->second.setAnnouncement(topic); + chatHandler->warnUsersAboutPlayerEventInChat(&(i->second), + topic, + CHAT_EVENT_TOPIC_CHANGE); +} + void ChatChannelManager::removeUserFromAllChannels(ChatClient *user) { // Local copy as they will be destroyed under our feet. diff --git a/src/chat-server/chatchannelmanager.hpp b/src/chat-server/chatchannelmanager.hpp index 86591606..05761506 100644 --- a/src/chat-server/chatchannelmanager.hpp +++ b/src/chat-server/chatchannelmanager.hpp @@ -98,6 +98,13 @@ class ChatChannelManager void removeUserFromAllChannels(ChatClient *); /** + * Set the topic of a channel. + * + * @param topic the new topic of the given channel + */ + void setChannelTopic(int channelId, const std::string &name); + + /** * Returns whether a channel exists. * * @param channelId a channel ID diff --git a/src/chat-server/chathandler.cpp b/src/chat-server/chathandler.cpp index fcd4a28f..907ec8fb 100644 --- a/src/chat-server/chathandler.cpp +++ b/src/chat-server/chathandler.cpp @@ -165,6 +165,10 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message) handleListChannelUsersMessage(computer, message); break; + case PCMSG_TOPIC_CHANGE: + handleTopicChange(computer, message); + break; + case PCMSG_DISCONNECT: handleDisconnectMessage(computer, message); break; @@ -475,10 +479,8 @@ ChatHandler::handleListChannelsMessage(ChatClient &client, MessageIn &msg) i_end = channels.end(); i != i_end; ++i) { - const std::string &name = (*i)->getName(); - short users = (*i)->getUserList().size(); - reply.writeString(name); - reply.writeShort(users); + reply.writeString((*i)->getName()); + reply.writeShort((*i)->getUserList().size()); } client.send(reply); @@ -509,11 +511,33 @@ ChatHandler::handleListChannelUsersMessage(ChatClient &client, MessageIn &msg) } void +ChatHandler::handleTopicChange(ChatClient &client, MessageIn &msg) +{ + short channelId = msg.readShort(); + std::string topic = msg.readString(); + ChatChannel *channel = chatChannelManager->getChannel(channelId); + + if(!guildManager->doesExist(channel->getName())) + { + chatChannelManager->setChannelTopic(channelId, topic); + } + else + { + Guild *guild = guildManager->findByName(channel->getName()); + if(guild->checkLeader(client.characterName)) + { + chatChannelManager->setChannelTopic(channelId, topic); + } + } +} + +void ChatHandler::handleDisconnectMessage(ChatClient &client, MessageIn &msg) { MessageOut reply(CPMSG_DISCONNECT_RESPONSE); reply.writeByte(ERRMSG_OK); chatChannelManager->removeUserFromAllChannels(&client); + guildManager->disconnectPlayer(&client); client.send(reply); } @@ -615,6 +639,7 @@ ChatHandler::handleGuildAcceptInvite(ChatClient &client, MessageIn &msg) ChatChannel *channel = joinGuildChannel(guild->getName(), client); reply.writeShort(channel->getId()); + sendGuildListUpdate(guildName, client.characterName, GUILD_EVENT_NEW_PLAYER); } else { @@ -645,9 +670,11 @@ ChatHandler::handleGuildRetrieveMembers(ChatClient &client, MessageIn &msg) { reply.writeByte(ERRMSG_OK); reply.writeShort(guildId); - for(int i = 0; i < guild->totalMembers(); ++i) + for(std::list<std::string>::const_iterator itr = guild->getMembers()->begin(); + itr != guild->getMembers()->end(); ++itr) { - reply.writeString(guild->getMember(i)); + reply.writeString((*itr)); + reply.writeByte(mPlayerMap.find((*itr)) != mPlayerMap.end()); } } } @@ -681,8 +708,11 @@ ChatHandler::handleGuildQuit(ChatClient &client, MessageIn &msg) { chatChannelManager->removeChannel(chatChannelManager->getChannelId(guild->getName())); } - - guildManager->removeGuildMember(guild, client.characterName); + else + { + guildManager->removeGuildMember(guild, client.characterName); + sendGuildListUpdate(guild->getName(), client.characterName, GUILD_EVENT_LEAVING_PLAYER); + } } else { @@ -719,13 +749,13 @@ ChatHandler::sayToPlayer(ChatClient &computer, const std::string &playerName, } void ChatHandler::warnUsersAboutPlayerEventInChat(ChatChannel *channel, - const std::string &userName, + const std::string &info, char eventId) { MessageOut msg(CPMSG_CHANNEL_EVENT); msg.writeShort(channel->getId()); msg.writeByte(eventId); - msg.writeString(userName); + msg.writeString(info); sendInChannel(channel, msg); } @@ -785,10 +815,11 @@ void ChatHandler::sendGuildRejoin(ChatClient &client) // send the channel id for the autojoined channel msg.writeShort(channel->getId()); + msg.writeString(channel->getAnnouncement()); client.send(msg); - sendGuildListUpdate(guildName, client.characterName); + sendGuildListUpdate(guildName, client.characterName, GUILD_EVENT_ONLINE_PLAYER); } } @@ -812,15 +843,14 @@ ChatChannel* ChatHandler::joinGuildChannel(const std::string &guildName, ChatCli // in the channel. warnUsersAboutPlayerEventInChat(channel, client.characterName, CHAT_EVENT_NEW_PLAYER); - - sendGuildListUpdate(guildName, client.characterName); } return channel; } void ChatHandler::sendGuildListUpdate(const std::string &guildName, - const std::string &characterName) + const std::string &characterName, + char eventId) { Guild *guild = guildManager->findByName(guildName); if (guild) @@ -829,16 +859,17 @@ void ChatHandler::sendGuildListUpdate(const std::string &guildName, msg.writeShort(guild->getId()); msg.writeString(characterName); + msg.writeByte(eventId); + std::map<std::string, ChatClient*>::const_iterator chr; + std::list<std::string> *members = guild->getMembers(); - // TODO: This should get a list of all members - // and iterate through them - std::map<std::string, ChatClient*>::iterator itr; - for (int i = 0; i < guild->totalMembers(); ++i) + for (std::list<std::string>::const_iterator itr = members->begin(); + itr != members->end(); ++itr) { - itr = mPlayerMap.find(guild->getMember(i)); - if (itr != mPlayerMap.end()) + chr = mPlayerMap.find((*itr)); + if (chr != mPlayerMap.end()) { - itr->second->send(msg); + chr->second->send(msg); } } } diff --git a/src/chat-server/chathandler.hpp b/src/chat-server/chathandler.hpp index 6a0cbc01..7469e9e1 100644 --- a/src/chat-server/chathandler.hpp +++ b/src/chat-server/chathandler.hpp @@ -65,13 +65,13 @@ class ChatHandler : public ConnectionHandler bool startListen(enet_uint16 port); /** - * Tell a list of users about an event in a chatchannel about a player. + * Tell a list of users about an event in a chatchannel. * * @param channel the channel to send the message in, must not be NULL - * @param userName the name of the player the event applies to + * @param info information pertaining to the event */ void warnUsersAboutPlayerEventInChat(ChatChannel *channel, - const std::string &userName, + const std::string &info, char eventId); /** @@ -89,6 +89,13 @@ class ChatHandler : public ConnectionHandler */ void tokenMatched(ChatClient *, Pending *); + /** + * Send information about a change in the guild list to guild members. + */ + void sendGuildListUpdate(const std::string &guildName, + const std::string &characterName, + char eventId); + protected: /** * Process chat related messages. @@ -124,12 +131,6 @@ class ChatHandler : public ConnectionHandler const std::string &inviterName, const std::string &guildName); - /** - * Send the new list of guild members - */ - void sendGuildListUpdate(const std::string &guildName, - const std::string &characterName); - private: /** * Deal with command messages. @@ -185,6 +186,12 @@ class ChatHandler : public ConnectionHandler handleListChannelUsersMessage(ChatClient &client, MessageIn &msg); /** + * Deal with changing a channel's topic + */ + void + handleTopicChange(ChatClient &client, MessageIn &msg); + + /** * Deal with disconnection. */ void diff --git a/src/chat-server/guild.hpp b/src/chat-server/guild.hpp index 7b453e9e..5d0be6bc 100644 --- a/src/chat-server/guild.hpp +++ b/src/chat-server/guild.hpp @@ -86,6 +86,12 @@ class Guild */ int getId() const { return mId; } + + /** + * Returns a list of the members in this guild. + */ + GuildMembers* getMembers() + { return &mMembers; } /** * Returns the total number of members in the guild. diff --git a/src/chat-server/guildmanager.cpp b/src/chat-server/guildmanager.cpp index a87df1ce..8cb98b1a 100644 --- a/src/chat-server/guildmanager.cpp +++ b/src/chat-server/guildmanager.cpp @@ -22,7 +22,10 @@ #include "guildmanager.hpp" #include "guild.hpp" +#include "defines.h" #include "account-server/dalstorage.hpp" +#include "chat-server/chatclient.hpp" +#include "chat-server/chathandler.hpp" GuildManager::GuildManager() { @@ -122,26 +125,28 @@ bool GuildManager::doesExist(const std::string &name) std::vector<Guild*> GuildManager::getGuilds(const std::string &name) { - Guild *guild; std::vector<Guild*> guildList; - - // Iterate through all guilds, get the number of members - // Check if any of the members match the specified name - // Add the guild to the list if they match, and return - // the list of all guilds the user with that name belongs to - for (std::list<Guild*>::iterator itr = mGuilds.begin(), - itr_end = mGuilds.end(); - itr != itr_end; ++itr) + + for (std::list<Guild*>::iterator itr = mGuilds.begin(); + itr != mGuilds.end(); ++itr) { - guild = (*itr); - for (int i = 0; i < guild->totalMembers(); ++i) + if((*itr)->checkInGuild(name)) { - if (guild->getMember(i) == name) - { - guildList.push_back(guild); - break; - } + guildList.push_back((*itr)); } } return guildList; } + +void GuildManager::disconnectPlayer(ChatClient *player) +{ + std::vector<Guild*> guildList = getGuilds(player->characterName); + + for (std::vector<Guild*>::const_iterator itr = guildList.begin(); + itr != guildList.end(); ++itr) + { + chatHandler->sendGuildListUpdate((*itr)->getName(), + player->characterName, + GUILD_EVENT_OFFLINE_PLAYER); + } +} diff --git a/src/chat-server/guildmanager.hpp b/src/chat-server/guildmanager.hpp index d28d5648..2545afb4 100644 --- a/src/chat-server/guildmanager.hpp +++ b/src/chat-server/guildmanager.hpp @@ -27,6 +27,7 @@ #include <vector> class Guild; +class ChatClient; /** * Guild manager takes care of creating, removing and modifying guilds. @@ -92,6 +93,11 @@ class GuildManager */ std::vector<Guild*> getGuilds(const std::string &name); + /** + * Inform guild members that a player has disconnected. + */ + void disconnectPlayer(ChatClient* player); + private: std::list<Guild*> mGuilds; }; diff --git a/src/defines.h b/src/defines.h index 57c45e96..7ddcf0c4 100644 --- a/src/defines.h +++ b/src/defines.h @@ -192,8 +192,8 @@ enum { PCMSG_GUILD_ACCEPT = 0x0354, // W id CPMSG_GUILD_ACCEPT_RESPONSE = 0x0355, // B error, W guild, B rights, W channel PCMSG_GUILD_GET_MEMBERS = 0x0356, // W id - CPMSG_GUILD_GET_MEMBERS_RESPONSE = 0x0357, // S names - CPMSG_GUILD_UPDATE_LIST = 0x0358, // W id, S name + CPMSG_GUILD_GET_MEMBERS_RESPONSE = 0x0357, // S names, B online + CPMSG_GUILD_UPDATE_LIST = 0x0358, // W id, S name, B event PCMSG_GUILD_QUIT = 0x0360, // W id CPMSG_GUILD_QUIT_RESPONSE = 0x0361, // B error @@ -218,17 +218,18 @@ enum { PCMSG_ANNOUNCE = 0x0411, // S text PCMSG_PRIVMSG = 0x0412, // S user, S text // -- Channeling - PCMSG_REGISTER_CHANNEL = 0x0420, // S name, S announcement, S password - CPMSG_REGISTER_CHANNEL_RESPONSE = 0x0421, // B error, W id, S name, S announcement - CPMSG_CHANNEL_EVENT = 0x0430, // W channel, B event, S user + PCMSG_REGISTER_CHANNEL = 0x0420, // S name, S topic, S password + CPMSG_REGISTER_CHANNEL_RESPONSE = 0x0421, // B error, W id, S name, S topic + CPMSG_CHANNEL_EVENT = 0x0430, // W channel, B event, S info PCMSG_ENTER_CHANNEL = 0x0440, // S channel, S password - CPMSG_ENTER_CHANNEL_RESPONSE = 0x0441, // B error, W id, S name, S announcement, S userlist + CPMSG_ENTER_CHANNEL_RESPONSE = 0x0441, // B error, W id, S name, S topic, S userlist PCMSG_QUIT_CHANNEL = 0x0443, // W channel id CPMSG_QUIT_CHANNEL_RESPONSE = 0x0444, // B error, W channel id PCMSG_LIST_CHANNELS = 0x0445, // - CPMSG_LIST_CHANNELS_RESPONSE = 0x0446, // S names, W number of users PCMSG_LIST_CHANNELUSERS = 0x0460, // S channel CPMSG_LIST_CHANNELUSERS_RESPONSE = 0x0461, // S channel, S users + PCMSG_TOPIC_CHANGE = 0x0462, // W channel id, S topic // Inter-server GAMSG_REGISTER = 0x0500, // S address, W port, { W map id }* @@ -309,7 +310,16 @@ enum { // Chat channels event values enum { CHAT_EVENT_NEW_PLAYER = 0, - CHAT_EVENT_LEAVING_PLAYER + CHAT_EVENT_LEAVING_PLAYER, + CHAT_EVENT_TOPIC_CHANGE +}; + +// Guild member event values +enum { + GUILD_EVENT_NEW_PLAYER = 0, + GUILD_EVENT_LEAVING_PLAYER, + GUILD_EVENT_ONLINE_PLAYER, + GUILD_EVENT_OFFLINE_PLAYER }; // Moving object flags |