diff options
author | David Athay <ko2fan@gmail.com> | 2008-08-13 15:31:48 +0000 |
---|---|---|
committer | David Athay <ko2fan@gmail.com> | 2008-08-13 15:31:48 +0000 |
commit | 67cb713c0fcd65f9f842c589c7e1c08f9af597f0 (patch) | |
tree | 408d79af670e143211deb311dc6aa291fbda9034 /src/chat-server/chathandler.cpp | |
parent | 4e800b21494755958b0e30bba9045cee204b1a76 (diff) | |
download | manaserv-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.cpp | 102 |
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); |