From 67cb713c0fcd65f9f842c589c7e1c08f9af597f0 Mon Sep 17 00:00:00 2001 From: David Athay Date: Wed, 13 Aug 2008 15:31:48 +0000 Subject: Added permission levels to guilds, and operator permissions to channels. --- src/chat-server/chatchannel.cpp | 51 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) (limited to 'src/chat-server/chatchannel.cpp') diff --git a/src/chat-server/chatchannel.cpp b/src/chat-server/chatchannel.cpp index 96de7335..a0317df9 100644 --- a/src/chat-server/chatchannel.cpp +++ b/src/chat-server/chatchannel.cpp @@ -22,6 +22,7 @@ */ #include +#include #include "chat-server/chatchannel.hpp" #include "chat-server/chatclient.hpp" @@ -41,12 +42,31 @@ ChatChannel::ChatChannel(int id, bool ChatChannel::addUser(ChatClient *user) { + // First user is the channel owner + if (mRegisteredUsers.size() < 1) + { + mOwner = user->characterName; + setUserMode(user, 'o'); + } + // Check if the user already exists in the channel ChannelUsers::const_iterator i = mRegisteredUsers.begin(), i_end = mRegisteredUsers.end(); - if (std::find(i, i_end, user) != i_end) return false; + if (std::find(i, i_end, user) != i_end) + return false; + mRegisteredUsers.push_back(user); user->channels.push_back(this); + + // set user as logged in + setUserMode(user, 'l'); + + // if owner has rejoined, give them ops + if (user->characterName == mOwner) + { + setUserMode(user, 'o'); + } + return true; } @@ -58,6 +78,8 @@ bool ChatChannel::removeUser(ChatClient *user) mRegisteredUsers.erase(i); std::vector< ChatChannel * > &channels = user->channels; channels.erase(std::find(channels.begin(), channels.end(), this)); + std::map &modes = user->userModes; + modes.erase(modes.begin(), modes.end()); return true; } @@ -68,6 +90,8 @@ void ChatChannel::removeAllUsers() { std::vector< ChatChannel * > &channels = (*i)->channels; channels.erase(std::find(channels.begin(), channels.end(), this)); + std::map &modes = (*i)->userModes; + modes.erase(modes.begin(), modes.end()); } mRegisteredUsers.clear(); } @@ -76,3 +100,28 @@ bool ChatChannel::canJoin() const { return mJoinable; } + +void ChatChannel::setUserMode(ChatClient *user, unsigned char mode) +{ + std::map::iterator itr = user->userModes.find(this); + if (itr != user->userModes.end()) + { + itr->second += mode; + } + else + { + std::stringstream ss; ss << mode; + user->userModes.insert(std::pair(this, ss.str())); + } +} + +std::string ChatChannel::getUserMode(ChatClient *user) +{ + std::map::iterator itr = user->userModes.find(this); + if (itr != user->userModes.end()) + { + return itr->second; + } + + return 0; +} -- cgit v1.2.3-60-g2f50