diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | src/account-server/dalstorage.cpp | 11 | ||||
-rw-r--r-- | src/account-server/dalstoragesql.hpp | 11 | ||||
-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 | ||||
-rw-r--r-- | src/dal/mysqldataprovider.cpp | 4 | ||||
-rw-r--r-- | src/dal/pqdataprovider.cpp | 2 | ||||
-rw-r--r-- | src/dal/sqlitedataprovider.cpp | 5 | ||||
-rw-r--r-- | src/defines.h | 9 |
12 files changed, 151 insertions, 36 deletions
@@ -1,3 +1,17 @@ +2007-02-27 Philipp Sehmisch <tmw@crushnet.org> + + * src/account-server/dalstorage.cpp, + src/account-server/dalstoragesql.hpp, + src/chat-server/chatchannel.cpp, + src/chat-server/chatchannel.hpp, + src/chat-server/chatchannelmanager.cpp, + src/chat-server/chatchannelmanager.hpp, + src/chat-server/chathandler.cpp, + src/dal/mysqldataprovider.cpp, + src/dal/pqdataprovider.cpp + src/dal/qulitedataprovider.cpp, + src/defines.h: Implementation of chat channels by Trapdoor. + 2007-02-25 Philipp Sehmisch <tmw@crushnet.org> * src/game-server/collision.cpp, src/game-server/collision.hpp, diff --git a/src/account-server/dalstorage.cpp b/src/account-server/dalstorage.cpp index 5cc8dd0f..4b1e7ea6 100644 --- a/src/account-server/dalstorage.cpp +++ b/src/account-server/dalstorage.cpp @@ -525,13 +525,14 @@ DALStorage::getChannelList() // specialize the string_to functor to convert // a string to a short. string_to<short> toShort; + string_to<bool> toBool; // The formatted datas std::map<short, ChatChannel> channels; try { std::stringstream sql; - sql << "select id, name, announcement, password from "; + sql << "select id, name, announcement, password, privacy from "; sql << CHANNELS_TBL_NAME; sql << ";"; @@ -547,7 +548,8 @@ DALStorage::getChannelList() channels.insert(std::make_pair(toShort(channelInfo(i,0)), ChatChannel(channelInfo(i,1), channelInfo(i,2), - channelInfo(i,3)))); + channelInfo(i,3), + toBool(channelInfo(i,4))))); LOG_DEBUG("Channel (" << channelInfo(i,0) << ") loaded: " << channelInfo(i,1) << ": " << channelInfo(i,2)); @@ -593,12 +595,13 @@ DALStorage::updateChannels(std::map<short, ChatChannel>& channelList) sql.str(""); sql << "insert into " << CHANNELS_TBL_NAME - << " (id, name, announcement, password)" + << " (id, name, announcement, password, privacy)" << " values (" << i->first << ", \"" << i->second.getName() << "\", \"" << i->second.getAnnouncement() << "\", \"" - << i->second.getPassword() << "\");"; + << i->second.getPassword() << "\", \"" + << i->second.getPrivacy() << "\");"; LOG_DEBUG("Channel (" << i->first << ") saved: " << i->second.getName() << ": " << i->second.getAnnouncement()); diff --git a/src/account-server/dalstoragesql.hpp b/src/account-server/dalstoragesql.hpp index 391b5572..1511e20b 100644 --- a/src/account-server/dalstoragesql.hpp +++ b/src/account-server/dalstoragesql.hpp @@ -240,7 +240,7 @@ const std::string SQL_WORLD_ITEMS_TABLE( "map_id TINYINT NOT NULL," // time to die (UNIX time) "deathtime INTEGER UNSIGNED NOT NULL," - "PRIMARY KEY (id, map_id)," + "PRIMARY KEY (id, map_id)," "FOREIGN KEY (id) REFERENCES tmw_items(id)," "FOREIGN KEY (map_id) REFERENCES tmw_maps(id)" #elif defined (SQLITE_SUPPORT) @@ -312,17 +312,20 @@ const std::string SQL_CHANNELS_TABLE( "id INTEGER PRIMARY KEY," "name VARCHAR(32) NOT NULL UNIQUE," "announcement VARCHAR(256) NOT NULL," - "password VARCHAR(32) NOT NULL" + "password VARCHAR(32) NOT NULL," + "privacy TINYINT NOT NULL" #elif defined (SQLITE_SUPPORT) "id INTEGER PRIMARY KEY," "name TEXT NOT NULL UNIQUE," "announcement TEXT NOT NULL," - "password TEXT NOT NULL" + "password TEXT NOT NULL," + "privacy INTEGER NOT NULL" #elif defined (POSTGRESQL_SUPPORT) "id SERIAL PRIMARY KEY," "name TEXT NOT NULL UNIQUE," "announcement TEXT NOT NULL," - "password TEXT NOT NULL" + "password TEXT NOT NULL," + "privacy INTEGER NOT NULL" #endif ");" ); 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; diff --git a/src/dal/mysqldataprovider.cpp b/src/dal/mysqldataprovider.cpp index 85084dc8..5c4af36f 100644 --- a/src/dal/mysqldataprovider.cpp +++ b/src/dal/mysqldataprovider.cpp @@ -20,6 +20,8 @@ * $Id$ */ +#if defined(MYSQL_SUPPORT) + #include "mysqldataprovider.h" #include "dalexcept.h" @@ -196,3 +198,5 @@ MySqlDataProvider::disconnect(void) } // namespace dal + +#endif diff --git a/src/dal/pqdataprovider.cpp b/src/dal/pqdataprovider.cpp index ee4f5e34..2c0b1ee6 100644 --- a/src/dal/pqdataprovider.cpp +++ b/src/dal/pqdataprovider.cpp @@ -22,6 +22,7 @@ #include "pqdataprovider.h" +#include "dalexcept.h" namespace dal { @@ -140,6 +141,7 @@ PqDataProvider::execSql(const std::string& sql, // clear results PQclear(res); } + return mRecordSet; } diff --git a/src/dal/sqlitedataprovider.cpp b/src/dal/sqlitedataprovider.cpp index 5c5e692f..ea16be90 100644 --- a/src/dal/sqlitedataprovider.cpp +++ b/src/dal/sqlitedataprovider.cpp @@ -20,7 +20,7 @@ * $Id$ */ - +#if defined(SQLITE_SUPPORT) #include "sqlitedataprovider.h" #include <stdexcept> @@ -197,3 +197,6 @@ SqLiteDataProvider::disconnect(void) } // namespace dal + +#endif + diff --git a/src/defines.h b/src/defines.h index b9f81b65..a452b9e0 100644 --- a/src/defines.h +++ b/src/defines.h @@ -164,6 +164,7 @@ enum { PGMSG_USE_ITEM = 0x0300, // L item id GPMSG_USE_RESPONSE = 0x0301, // B error GPMSG_BEINGS_DAMAGE = 0x0310, // { W being id, W amount }* + GPMSG_BEING_DEAD = 0xDEAD, // W being id // Chat CPMSG_ERROR = 0x0401, // B error @@ -175,14 +176,16 @@ enum { PCMSG_PRIVMSG = 0x0412, // S user, S text // -- Channeling PCMSG_REGISTER_CHANNEL = 0x0413, // B pub/priv, S name, S announcement, S password - CPMSG_REGISTER_CHANNEL_RESPONSE = 0x0414, // B error + CPMSG_REGISTER_CHANNEL_RESPONSE = 0x0414, // B error, W id PCMSG_UNREGISTER_CHANNEL = 0x0415, // W channel CPMSG_UNREGISTER_CHANNEL_RESPONSE = 0x0416, // B error CPMSG_CHANNEL_EVENT = 0x0418, // W channel, B event, S user - PCMSG_ENTER_CHANNEL = 0x0419, // W channel, S password - CPMSG_ENTER_CHANNEL_RESPONSE = 0x0420, // B error + PCMSG_ENTER_CHANNEL = 0x0419, // S channel, S password + CPMSG_ENTER_CHANNEL_RESPONSE = 0x0420, // B error, W channel PCMSG_QUIT_CHANNEL = 0x0421, // W channel CPMSG_QUIT_CHANNEL_RESPONSE = 0x0422, // B error + PCMSG_LIST_CHANNELS = 0x0423, // - + CPMSG_LIST_CHANNELS_RESPONSE = 0x0424, // W number of channels, S channels // Inter-server GAMSG_REGISTER = 0x500, // S address, W port, { W map id }* |