summaryrefslogtreecommitdiff
path: root/src/chat-server/chathandler.cpp
diff options
context:
space:
mode:
authorDavid Athay <ko2fan@gmail.com>2008-08-13 15:31:48 +0000
committerDavid Athay <ko2fan@gmail.com>2008-08-13 15:31:48 +0000
commit67cb713c0fcd65f9f842c589c7e1c08f9af597f0 (patch)
tree408d79af670e143211deb311dc6aa291fbda9034 /src/chat-server/chathandler.cpp
parent4e800b21494755958b0e30bba9045cee204b1a76 (diff)
downloadmanaserv-67cb713c0fcd65f9f842c589c7e1c08f9af597f0.tar.gz
manaserv-67cb713c0fcd65f9f842c589c7e1c08f9af597f0.tar.bz2
manaserv-67cb713c0fcd65f9f842c589c7e1c08f9af597f0.tar.xz
manaserv-67cb713c0fcd65f9f842c589c7e1c08f9af597f0.zip
Added permission levels to guilds, and operator permissions to channels.
Diffstat (limited to 'src/chat-server/chathandler.cpp')
-rw-r--r--src/chat-server/chathandler.cpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/chat-server/chathandler.cpp b/src/chat-server/chathandler.cpp
index 946be36a..43a917ff 100644
--- a/src/chat-server/chathandler.cpp
+++ b/src/chat-server/chathandler.cpp
@@ -23,6 +23,8 @@
#include <list>
#include <algorithm>
+#include <string>
+#include <sstream>
#include "defines.h"
#include "account-server/dalstorage.hpp"
@@ -157,6 +159,13 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message)
handleEnterChannelMessage(computer, message);
break;
+ case PCMSG_USER_MODE:
+ handleModeChangeMessage(computer, message);
+ break;
+
+ case PCMSG_KICK_USER:
+ handleKickUserMessage(computer, message);
+
case PCMSG_QUIT_CHANNEL:
handleQuitChannelMessage(computer, message);
break;
@@ -193,6 +202,10 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message)
handleGuildRetrieveMembers(computer, message);
break;
+ case PCMSG_GUILD_PROMOTE_MEMBER:
+ handleGuildMemberLevelChange(computer, message);
+ break;
+
case PCMSG_GUILD_QUIT:
handleGuildQuit(computer, message);
break;
@@ -361,6 +374,7 @@ void ChatHandler::handleEnterChannelMessage(ChatClient &client, MessageIn &msg)
i != i_end; ++i)
{
reply.writeString((*i)->characterName);
+ reply.writeString(channel->getUserMode((*i)));
}
// Send an CPMSG_UPDATE_CHANNEL to warn other clients a user went
// in the channel.
@@ -378,6 +392,71 @@ void ChatHandler::handleEnterChannelMessage(ChatClient &client, MessageIn &msg)
}
void
+ChatHandler::handleModeChangeMessage(ChatClient &client, MessageIn &msg)
+{
+ short channelId = msg.readShort();
+ ChatChannel *channel = chatChannelManager->getChannel(channelId);
+
+ if (channelId == 0 || !channel)
+ {
+ // invalid channel
+ return;
+ }
+
+ if (channel->getUserMode(&client).find('o') != std::string::npos)
+ {
+ // invalid permissions
+ return;
+ }
+
+ // get the user whos mode has been changed
+ std::string user = msg.readString();
+
+ // get the mode to change to
+ unsigned char mode = msg.readByte();
+ channel->setUserMode(getClient(user), mode);
+
+ // set the info to pass to all channel clients
+ std::stringstream info;
+ info << client.characterName << ":" << user << ":" << mode;
+
+ warnUsersAboutPlayerEventInChat(channel,
+ info.str(),
+ CHAT_EVENT_MODE_CHANGE);
+}
+
+void
+ChatHandler::handleKickUserMessage(ChatClient &client, MessageIn &msg)
+{
+ short channelId = msg.readShort();
+ ChatChannel *channel = chatChannelManager->getChannel(channelId);
+
+ if (channelId == 0 || !channel)
+ {
+ // invalid channel
+ return;
+ }
+
+ if (channel->getUserMode(&client).find('o') != std::string::npos)
+ {
+ // invalid permissions
+ return;
+ }
+
+ // get the user whos being kicked
+ std::string user = msg.readString();
+
+ if (channel->removeUser(getClient(user)))
+ {
+ std::stringstream ss;
+ ss << client.characterName << ":" << user;
+ warnUsersAboutPlayerEventInChat(channel,
+ ss.str(),
+ CHAT_EVENT_KICKED_PLAYER);
+ }
+}
+
+void
ChatHandler::handleQuitChannelMessage(ChatClient &client, MessageIn &msg)
{
MessageOut reply(CPMSG_QUIT_CHANNEL_RESPONSE);
@@ -449,6 +528,7 @@ ChatHandler::handleListChannelUsersMessage(ChatClient &client, MessageIn &msg)
i = users.begin(), i_end = users.end(); i != i_end; ++i)
{
reply.writeString((*i)->characterName);
+ reply.writeString(channel->getUserMode((*i)));
}
client.send(reply);
@@ -632,6 +712,28 @@ ChatHandler::handleGuildRetrieveMembers(ChatClient &client, MessageIn &msg)
}
void
+ChatHandler::handleGuildMemberLevelChange(ChatClient &client, MessageIn &msg)
+{
+ MessageOut reply(CPMSG_GUILD_PROMOTE_MEMBER_RESPONSE);
+ short guildId = msg.readShort();
+ std::string user = msg.readString();
+ short level = msg.readByte();
+ Guild *guild = guildManager->findById(guildId);
+
+ if (guild)
+ {
+ if (guildManager->changeMemberLevel(&client, guild, user, level) == 0)
+ {
+ reply.writeByte(ERRMSG_OK);
+ client.send(reply);
+ }
+ }
+
+ reply.writeByte(ERRMSG_FAILURE);
+ client.send(reply);
+}
+
+void
ChatHandler::handleGuildQuit(ChatClient &client, MessageIn &msg)
{
MessageOut reply(CPMSG_GUILD_QUIT_RESPONSE);