diff options
author | Philipp Sehmisch <tmw@crushnet.org> | 2007-02-27 16:39:07 +0000 |
---|---|---|
committer | Philipp Sehmisch <tmw@crushnet.org> | 2007-02-27 16:39:07 +0000 |
commit | ea7d7df0e8b9e6c148ea9dfb8a56e113b50e008d (patch) | |
tree | e30ee08b4ff4659205d0bcbb1ab2b3db5f71f650 /src/chat-server | |
parent | 8bbaf323aef0c4f124b1a35680c323f833d2d58f (diff) | |
download | manaserv-ea7d7df0e8b9e6c148ea9dfb8a56e113b50e008d.tar.gz manaserv-ea7d7df0e8b9e6c148ea9dfb8a56e113b50e008d.tar.bz2 manaserv-ea7d7df0e8b9e6c148ea9dfb8a56e113b50e008d.tar.xz manaserv-ea7d7df0e8b9e6c148ea9dfb8a56e113b50e008d.zip |
Implementation of chat channels by Trapdoor.
Diffstat (limited to 'src/chat-server')
-rw-r--r-- | src/chat-server/chatchannel.cpp | 14 | ||||
-rw-r--r-- | src/chat-server/chatchannel.hpp | 13 | ||||
-rw-r--r-- | src/chat-server/chatchannelmanager.cpp | 37 | ||||
-rw-r--r-- | src/chat-server/chatchannelmanager.hpp | 29 | ||||
-rw-r--r-- | src/chat-server/chathandler.cpp | 38 |
5 files changed, 107 insertions, 24 deletions
diff --git a/src/chat-server/chatchannel.cpp b/src/chat-server/chatchannel.cpp index 9f2bd607..b358934f 100644 --- a/src/chat-server/chatchannel.cpp +++ b/src/chat-server/chatchannel.cpp @@ -25,10 +25,12 @@ ChatChannel::ChatChannel(const std::string &channelName, const std::string &channelAnnouncement = "None", - const std::string &channelPassword = "None"): + const std::string &channelPassword = "None", + bool channelPrivacy = true): mChannelName(channelName), mChannelAnnouncement(channelAnnouncement), - mChannelPassword(channelPassword) + mChannelPassword(channelPassword), + mChannelPrivate(channelPrivacy) { if (channelAnnouncement == "") mChannelAnnouncement = "None"; @@ -61,6 +63,12 @@ ChatChannel::getPassword() const return mChannelPassword; } +bool +ChatChannel::getPrivacy() const +{ + return mChannelPrivate; +} + void ChatChannel::setName(const std::string &channelName) { @@ -96,7 +104,7 @@ bool ChatChannel::addUserInChannel(std::string const &user) // 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); return true; } diff --git a/src/chat-server/chatchannel.hpp b/src/chat-server/chatchannel.hpp index 0fd6d4be..268f1355 100644 --- a/src/chat-server/chatchannel.hpp +++ b/src/chat-server/chatchannel.hpp @@ -36,7 +36,8 @@ class ChatChannel { */ ChatChannel(const std::string &channelName, const std::string &channelAnnouncement, - const std::string &channelPassword); + const std::string &channelPassword, + bool channelPrivacy); /** * Destructor @@ -59,6 +60,11 @@ class ChatChannel { const std::string& getPassword() const; /** + * Get the password of the channel + */ + bool getPrivacy() const; + + /** * Set the name of the channel */ void setName(const std::string &channelName); @@ -114,6 +120,11 @@ class ChatChannel { */ ChannelUsers mRegisteredUsers; + /** + * Whether the channel is private + */ + bool mChannelPrivate; + }; #endif diff --git a/src/chat-server/chatchannelmanager.cpp b/src/chat-server/chatchannelmanager.cpp index 9944681e..531a0094 100644 --- a/src/chat-server/chatchannelmanager.cpp +++ b/src/chat-server/chatchannelmanager.cpp @@ -59,7 +59,7 @@ ChatChannelManager::registerPublicChannel(const std::string& channelName, // Register Channel mChatChannels.insert(std::make_pair(channelId,ChatChannel(channelName, - channelAnnouncement, channelPassword))); + channelAnnouncement, channelPassword, false))); return channelId; } @@ -74,7 +74,7 @@ ChatChannelManager::registerPrivateChannel(const std::string& channelName, { if ( i->second.getName() == channelName ) return 0; // We seek the highest channelId in the private range - if (channelId <= i->first) + if (channelId <= i->first) channelId = i->first + 1; } // Too much channels registered @@ -82,7 +82,7 @@ ChatChannelManager::registerPrivateChannel(const std::string& channelName, // Register Channel mChatChannels.insert(std::make_pair(channelId,ChatChannel(channelName, - channelAnnouncement, channelPassword))); + channelAnnouncement, channelPassword, true))); return channelId; } @@ -95,6 +95,27 @@ bool ChatChannelManager::removeChannel(short channelId) return true; } +std::string ChatChannelManager::getPublicChannelNames(short *numChannels) +{ + std::string channels; + for (std::map<short, ChatChannel>::const_iterator i = mChatChannels.begin(), i_end = mChatChannels.end(); + i != i_end; ++i) { + if(!i->second.getPrivacy()) + { + channels.append(i->second.getName()); + channels += " "; + (*numChannels)++; + } + } + return channels; +} + +short ChatChannelManager::getNumberOfChannelUsers(const std::string &channelName) +{ + ChatChannel channel = _getChannel(getChannelId(channelName)); + short size = channel.getUserList().size(); + return size; +} short ChatChannelManager::getChannelId(std::string const &channelName) { @@ -124,6 +145,12 @@ std::string ChatChannelManager::getChannelPassword(short channelId) return (i != mChatChannels.end()) ? i->second.getPassword() : std::string(); } +bool ChatChannelManager::getChannelPrivacy(short channelId) +{ + std::map<short, ChatChannel>::iterator i = mChatChannels.find(channelId); + return (i != mChatChannels.end()) ? i->second.getPrivacy() : true; +} + bool ChatChannelManager::setChannelAnnouncement(short channelId, std::string const &channelAnnouncement) { std::map<short, ChatChannel>::iterator i = mChatChannels.find(channelId); @@ -144,7 +171,7 @@ ChatChannel ChatChannelManager::_getChannel(short channelId) { std::map<short, ChatChannel>::iterator i = mChatChannels.find(channelId); if (i != mChatChannels.end()) return i->second; - return ChatChannel("", "", ""); + return ChatChannel("", "", "", true); } @@ -167,7 +194,7 @@ void ChatChannelManager::removeUserFromEveryChannels(std::string const &user) { for (std::map<short, ChatChannel>::iterator i = mChatChannels.begin(), i_end = mChatChannels.end(); i != i_end; ++i) { - i->second.removeUserFromChannel(user); + i->second.removeUserFromChannel(user); } } diff --git a/src/chat-server/chatchannelmanager.hpp b/src/chat-server/chatchannelmanager.hpp index fdb6d990..9134c83f 100644 --- a/src/chat-server/chatchannelmanager.hpp +++ b/src/chat-server/chatchannelmanager.hpp @@ -68,6 +68,20 @@ public: bool removeChannel(short channelId); /** + * Get all public channels + * + * @return a list of channel names + */ + std::string getPublicChannelNames(short *numChannels); + + /** + * Get the number of channels that have been registered + * + * @return the number of registered channels + */ + short getNumberOfChannelUsers(const std::string &channelName); + + /** * Get the id of a channel from its name. * * @return the id of the channel @@ -111,6 +125,13 @@ public: std::string getChannelPassword(short channelId); /** + * Get the privacy of the channel from its id. + * + * @return the privacy of the channel + */ + bool getChannelPrivacy(short channelId); + + /** * get the ChatChannel object from its id. * * @return the ChatChannel object @@ -146,10 +167,10 @@ public: private: /** - * The list keeping all the chat channels. - * - * The channel id must be unique. - */ + * The list keeping all the chat channels. + * + * The channel id must be unique. + */ std::map<short, ChatChannel> mChatChannels; }; diff --git a/src/chat-server/chathandler.cpp b/src/chat-server/chathandler.cpp index 589f1e43..ac5d3c5b 100644 --- a/src/chat-server/chathandler.cpp +++ b/src/chat-server/chathandler.cpp @@ -112,6 +112,8 @@ NetComputer *ChatHandler::computerConnected(ENetPeer *peer) void ChatHandler::computerDisconnected(NetComputer *computer) { + // Remove user from all channels + chatChannelManager->removeUserFromEveryChannels(((ChatClient*)computer)->characterName); ChatPendingClients::iterator i_end = pendingClients.end(); for (ChatPendingClients::iterator i = pendingClients.begin(); i != i_end; ++i) @@ -243,8 +245,9 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message) if (computer.accountLevel != AL_ADMIN && computer.accountLevel != AL_GM) { - result.writeByte(ERRMSG_INSUFFICIENT_RIGHTS); - break; + // Removed the need for admin/gm rights to create public channels + // result.writeByte(ERRMSG_INSUFFICIENT_RIGHTS); + // break; } } std::string channelName = message.readString(); @@ -302,6 +305,7 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message) result.writeByte(ERRMSG_OK); result.writeShort(channelId); + result.writeString(channelName); break; } else @@ -373,8 +377,9 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message) case PCMSG_ENTER_CHANNEL: { result.writeShort(CPMSG_ENTER_CHANNEL_RESPONSE); - short channelId = message.readShort(); + std::string channelName = message.readString(); std::string givenPassword = message.readString(); + short channelId = chatChannelManager->getChannelId(channelName); if (channelId != 0 && chatChannelManager->isChannelRegistered(channelId)) { std::string channelPassword = chatChannelManager->getChannelPassword(channelId); @@ -389,12 +394,12 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message) if (chatChannelManager->addUserInChannel(computer.characterName, channelId)) { result.writeByte(ERRMSG_OK); - // The user entered the channel, now give him the announcement string + // The user entered the channel, now give him the channel id, the announcement string // and the user list. + result.writeShort(channelId); + result.writeString(channelName); result.writeString(chatChannelManager->getChannelAnnouncement(channelId)); - std::vector< std::string > const &userList = - chatChannelManager->getUserListInChannel(channelId); - result.writeShort(userList.size()); + 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); @@ -426,6 +431,7 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message) if (chatChannelManager->removeUserFromChannel(computer.characterName, channelId)) { result.writeByte(ERRMSG_OK); + result.writeShort(channelId); // Send an CPMSG_UPDATE_CHANNEL to warn other clients a // user left the channel. warnUsersAboutPlayerEventInChat(channelId, @@ -444,11 +450,21 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message) } break; - case PCMSG_DISCONNECT: + case PCMSG_LIST_CHANNELS: { - result.writeShort(CPMSG_DISCONNECT_RESPONSE); - result.writeByte(ERRMSG_OK); - chatChannelManager->removeUserFromEveryChannels(computer.characterName); + result.writeShort(CPMSG_LIST_CHANNELS_RESPONSE); + + short numberOfPublicChannels; + std::istringstream channels(chatChannelManager->getPublicChannelNames(&numberOfPublicChannels)); + + for(int i = 0; i < numberOfPublicChannels; ++i) + { + std::string channel; + channels >> channel; + // Send only public channels + result.writeString(channel); + result.writeShort(chatChannelManager->getNumberOfChannelUsers(channel)); + } } break; |