summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--src/chat-server/chatchannelmanager.cpp16
-rw-r--r--src/chat-server/chatchannelmanager.hpp7
-rw-r--r--src/chat-server/chathandler.cpp73
-rw-r--r--src/chat-server/chathandler.hpp25
-rw-r--r--src/chat-server/guild.hpp6
-rw-r--r--src/chat-server/guildmanager.cpp37
-rw-r--r--src/chat-server/guildmanager.hpp6
-rw-r--r--src/defines.h24
9 files changed, 148 insertions, 55 deletions
diff --git a/ChangeLog b/ChangeLog
index 5a55470c..79224bea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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