summaryrefslogtreecommitdiff
path: root/src/chat-server
diff options
context:
space:
mode:
authorDavid Athay <ko2fan@gmail.com>2007-06-26 19:50:02 +0000
committerDavid Athay <ko2fan@gmail.com>2007-06-26 19:50:02 +0000
commit301ffe1048fb23548f72759b6ed0ca98e9109ff4 (patch)
treec765b6df9a83227b1d40bb59949b768fbc4c1574 /src/chat-server
parent99263173738dfd6ca4ba822e0a112f1c7c17661c (diff)
downloadmanaserv-301ffe1048fb23548f72759b6ed0ca98e9109ff4.tar.gz
manaserv-301ffe1048fb23548f72759b6ed0ca98e9109ff4.tar.bz2
manaserv-301ffe1048fb23548f72759b6ed0ca98e9109ff4.tar.xz
manaserv-301ffe1048fb23548f72759b6ed0ca98e9109ff4.zip
Merged guilds-and-parties branch to trunk
Diffstat (limited to 'src/chat-server')
-rw-r--r--src/chat-server/chathandler.cpp147
-rw-r--r--src/chat-server/chathandler.hpp43
2 files changed, 180 insertions, 10 deletions
diff --git a/src/chat-server/chathandler.cpp b/src/chat-server/chathandler.cpp
index 75c8d915..d9c2360f 100644
--- a/src/chat-server/chathandler.cpp
+++ b/src/chat-server/chathandler.cpp
@@ -22,6 +22,10 @@
*/
#include "defines.h"
+#include "account-server/characterdata.hpp"
+#include "account-server/guild.hpp"
+#include "account-server/guildmanager.hpp"
+#include "account-server/serverhandler.hpp"
#include "chat-server/chatchannelmanager.hpp"
#include "chat-server/chathandler.hpp"
#include "net/connectionhandler.hpp"
@@ -155,12 +159,14 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message)
pendingClients.insert(std::make_pair(magic_token, &computer));
return;
}
+
computer.characterName = i->second.character;
computer.accountLevel = i->second.level;
pendingLogins.erase(i);
result.writeShort(CPMSG_CONNECT_RESPONSE);
result.writeByte(ERRMSG_OK);
computer.send(result);
+ sendGuildRejoin(computer);
return;
}
@@ -274,6 +280,12 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message)
result.writeByte(ERRMSG_INVALID_ARGUMENT);
break;
}
+
+ if(guildManager->doesExist(channelName))
+ {
+ result.writeByte(ERRMSG_INVALID_ARGUMENT);
+ break;
+ }
// If it's slang's free.
if (stringFilter->filterContent(channelName) &&
@@ -327,6 +339,11 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message)
result.writeShort(CPMSG_UNREGISTER_CHANNEL_RESPONSE);
short channelId = message.readShort();
+ std::string channelName = chatChannelManager->getChannelName(channelId);
+
+ // Get character based on name.
+ CharacterPtr character = serverHandler->getCharacter(computer.characterName);
+
if (!chatChannelManager->isChannelRegistered(channelId))
{
result.writeByte(ERRMSG_INVALID_ARGUMENT);
@@ -342,6 +359,16 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message)
else
result.writeByte(ERRMSG_FAILURE);
}
+ else if (guildManager->doesExist(channelName))
+ {
+ Guild *guild = guildManager->findByName(channelName);
+ if (guild->checkLeader(character.get()))
+ {
+ chatChannelManager->removeChannel(channelId);
+ guildManager->removeGuild(guild->getId());
+ result.writeByte(ERRMSG_OK);
+ }
+ }
else
{
result.writeByte(ERRMSG_INSUFFICIENT_RIGHTS);
@@ -392,6 +419,17 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message)
break;
}
}
+
+ if (guildManager->doesExist(channelName))
+ {
+ Guild *guild = guildManager->findByName(channelName);
+ if (!guild->checkInGuild(computer.characterName))
+ {
+ result.writeByte(ERRMSG_INVALID_ARGUMENT);
+ break;
+ }
+ sendUserJoined(channelId, computer.characterName);
+ }
if (chatChannelManager->addUserInChannel(computer.characterName, channelId))
{
result.writeByte(ERRMSG_OK);
@@ -400,8 +438,10 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message)
result.writeShort(channelId);
result.writeString(channelName);
result.writeString(chatChannelManager->getChannelAnnouncement(channelId));
- std::vector< std::string > const &userList = chatChannelManager->getUserListInChannel(channelId);
- for (std::vector< std::string >::const_iterator i = userList.begin(), i_end = userList.end();
+ std::vector< std::string > const &userList =
+ chatChannelManager->getUserListInChannel(channelId);
+ for (std::vector< std::string >::const_iterator i = userList.begin(),
+ i_end = userList.end();
i != i_end; ++i) {
result.writeString(*i);
}
@@ -427,6 +467,8 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message)
{
result.writeShort(CPMSG_QUIT_CHANNEL_RESPONSE);
short channelId = message.readShort();
+ std::string channelName = chatChannelManager->getChannelName(channelId);
+
if (channelId != 0 && chatChannelManager->isChannelRegistered(channelId))
{
if (chatChannelManager->removeUserFromChannel(computer.characterName, channelId))
@@ -438,6 +480,11 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message)
warnUsersAboutPlayerEventInChat(channelId,
computer.characterName,
CHAT_EVENT_LEAVING_PLAYER);
+ if(guildManager->doesExist(channelName))
+ {
+ // Send a user left message
+ sendUserLeft(channelId, computer.characterName);
+ }
}
else
{
@@ -456,7 +503,8 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message)
result.writeShort(CPMSG_LIST_CHANNELS_RESPONSE);
short numberOfPublicChannels;
- std::istringstream channels(chatChannelManager->getPublicChannelNames(&numberOfPublicChannels));
+ std::istringstream channels(chatChannelManager->getPublicChannelNames(
+ &numberOfPublicChannels));
for(int i = 0; i < numberOfPublicChannels; ++i)
{
@@ -468,6 +516,27 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message)
}
}
break;
+
+ case PCMSG_LIST_CHANNELUSERS:
+ {
+ result.writeShort(CPMSG_LIST_CHANNELUSERS_RESPONSE);
+
+ std::string channelName = message.readString();
+
+ result.writeString(channelName);
+
+ // get user list
+ std::vector<std::string> channelList;
+ channelList = chatChannelManager->getUserListInChannel(
+ chatChannelManager->getChannelId(channelName));
+
+ // add a user at a time
+ for(int i = 0; i < channelList.size(); ++i)
+ {
+ result.writeString(channelList[i]);
+ }
+
+ } break;
case PCMSG_DISCONNECT:
{
@@ -597,3 +666,75 @@ void ChatHandler::sendInChannel(short channelId, MessageOut &msg)
}
}
}
+
+void ChatHandler::sendGuildEnterChannel(const MessageOut &msg, const std::string &name)
+{
+ for (NetComputers::iterator i = clients.begin(), i_end = clients.end();
+ i != i_end; ++i) {
+ if (static_cast< ChatClient * >(*i)->characterName == name)
+ {
+ (*i)->send(msg);
+ break;
+ }
+ }
+}
+
+void ChatHandler::sendGuildInvite(const std::string &invitedName, const std::string &inviterName,
+ const std::string &guildName)
+{
+ MessageOut msg(CPMSG_GUILD_INVITED);
+ msg.writeString(inviterName);
+ msg.writeString(guildName);
+ for (NetComputers::iterator i = clients.begin(), i_end = clients.end();
+ i != i_end; ++i) {
+ if (static_cast< ChatClient * >(*i)->characterName == invitedName)
+ {
+ (*i)->send(msg);
+ break;
+ }
+ }
+}
+
+void ChatHandler::sendGuildRejoin(ChatClient &computer)
+{
+ // Get character based on name.
+ CharacterPtr character = serverHandler->getCharacter(computer.characterName);
+
+ // Get list of guilds and check what rights they have.
+ std::vector<std::string> guilds = character->getGuilds();
+ for(unsigned int i = 0; i != guilds.size(); ++i)
+ {
+ Guild *guild = guildManager->findByName(guilds[i]);
+ short leader = 0;
+ if(!guild)
+ {
+ return;
+ }
+ if(guild->checkLeader(character.get()))
+ {
+ leader = 1;
+ }
+ MessageOut msg(CPMSG_GUILD_REJOIN);
+ msg.writeString(guild->getName());
+ msg.writeShort(guild->getId());
+ msg.writeShort(leader);
+ computer.send(msg);
+ serverHandler->enterChannel(guild->getName(), character.get());
+ }
+}
+
+void ChatHandler::sendUserJoined(short channelId, const std::string &name)
+{
+ MessageOut msg(CPMSG_USERJOINED);
+ msg.writeShort(channelId);
+ msg.writeString(name);
+ sendInChannel(channelId, msg);
+}
+
+void ChatHandler::sendUserLeft(short channelId, const std::string &name)
+{
+ MessageOut msg(CPMSG_USERLEFT);
+ msg.writeShort(channelId);
+ msg.writeString(name);
+ sendInChannel(channelId, msg);
+}
diff --git a/src/chat-server/chathandler.hpp b/src/chat-server/chathandler.hpp
index 19c5f464..cda3f27e 100644
--- a/src/chat-server/chathandler.hpp
+++ b/src/chat-server/chathandler.hpp
@@ -49,6 +49,25 @@ class ChatHandler : public ConnectionHandler
*/
bool
startListen(enet_uint16 port);
+
+ /**
+ * Tell a list of user about an event in a chatchannel about a player.
+ */
+ void warnUsersAboutPlayerEventInChat(short channelId,
+ std::string const &userName,
+ char eventId);
+
+ /**
+ * Send Chat and Guild Info to chat client, so that they can
+ * join the correct channels.
+ */
+ void sendGuildEnterChannel(const MessageOut &msg, const std::string &name);
+
+ /**
+ * Send guild invite.
+ */
+ void sendGuildInvite(const std::string &invitedName, const std::string &inviterName,
+ const std::string &guildName);
protected:
/**
@@ -57,6 +76,11 @@ class ChatHandler : public ConnectionHandler
void processMessage(NetComputer *computer, MessageIn &message);
NetComputer *computerConnected(ENetPeer *);
void computerDisconnected(NetComputer *);
+
+ /**
+ * Send messages for each guild the character belongs to.
+ */
+ void sendGuildRejoin(ChatClient &computer);
private:
/**
@@ -92,17 +116,20 @@ class ChatHandler : public ConnectionHandler
void sendInChannel(short channelId, MessageOut &);
/**
- * Tell a list of user about an event in a chatchannel about a player.
- */
- void warnUsersAboutPlayerEventInChat(short channelId,
- std::string const &userName,
- char eventId);
-
- /**
* Removes outdated pending logins. These are connected clients that
* still haven't sent in their magic token.
*/
void removeOutdatedPending();
+
+ /**
+ * Send user joined message.
+ */
+ void sendUserJoined(short channelId, const std::string &name);
+
+ /**
+ * Send user left message.
+ */
+ void sendUserLeft(short channelId, const std::string &name);
};
/**
@@ -110,4 +137,6 @@ class ChatHandler : public ConnectionHandler
*/
void registerChatClient(std::string const &, std::string const &, int);
+extern ChatHandler *chatHandler;
+
#endif