diff options
author | Yohann Ferreira <bertram@cegetel.net> | 2006-01-20 23:17:19 +0000 |
---|---|---|
committer | Yohann Ferreira <bertram@cegetel.net> | 2006-01-20 23:17:19 +0000 |
commit | d318b2428878bd0e35b189b3e6d3bffd825da25c (patch) | |
tree | dc61bd08aec87a5293e1ca072079652ad6047423 /src | |
parent | 7960ff184f15a3b6029fef8e5100d24a6c556afe (diff) | |
download | manaserv-d318b2428878bd0e35b189b3e6d3bffd825da25c.tar.gz manaserv-d318b2428878bd0e35b189b3e6d3bffd825da25c.tar.bz2 manaserv-d318b2428878bd0e35b189b3e6d3bffd825da25c.tar.xz manaserv-d318b2428878bd0e35b189b3e6d3bffd825da25c.zip |
Chat channeling commit part 3. Is now linked with the connection handler to chat in a specific channel. Also made some fixes on the chat channeling.
Diffstat (limited to 'src')
-rw-r--r-- | src/chatchannel.cpp | 26 | ||||
-rw-r--r-- | src/chatchannel.h | 12 | ||||
-rw-r--r-- | src/chatchannelmanager.cpp | 23 | ||||
-rw-r--r-- | src/chatchannelmanager.h | 7 | ||||
-rw-r--r-- | src/chathandler.cpp | 11 | ||||
-rw-r--r-- | src/connectionhandler.cpp | 19 | ||||
-rw-r--r-- | src/connectionhandler.h | 5 | ||||
-rw-r--r-- | src/dalstorage.cpp | 44 | ||||
-rw-r--r-- | src/dalstorage.h | 2 | ||||
-rw-r--r-- | src/main.cpp | 9 | ||||
-rw-r--r-- | src/netcomputer.cpp | 24 | ||||
-rw-r--r-- | src/netcomputer.h | 8 | ||||
-rw-r--r-- | src/storage.h | 2 |
13 files changed, 131 insertions, 61 deletions
diff --git a/src/chatchannel.cpp b/src/chatchannel.cpp index 8f5e22a8..3f0dffda 100644 --- a/src/chatchannel.cpp +++ b/src/chatchannel.cpp @@ -23,13 +23,17 @@ #include "chatchannel.h" -ChatChannel::ChatChannel(const std::string channelName, - const std::string channelAnnouncement = "", - const std::string channelPassword = ""): +ChatChannel::ChatChannel(const std::string &channelName, + const std::string &channelAnnouncement = "None", + const std::string &channelPassword = "None"): mChannelName(channelName), mChannelAnnouncement(channelAnnouncement), mChannelPassword(channelPassword) { + if (channelAnnouncement == "") + mChannelAnnouncement = "None"; + if (channelPassword == "") + mChannelPassword = "None"; mRegisteredUsers.clear(); } @@ -58,21 +62,27 @@ ChatChannel::getPassword() const } void -ChatChannel::setName(const std::string channelName) +ChatChannel::setName(const std::string &channelName) { mChannelName = channelName; } void -ChatChannel::setAnnouncement(const std::string channelAnnouncement) +ChatChannel::setAnnouncement(const std::string &channelAnnouncement) { - mChannelAnnouncement = channelAnnouncement; + if (channelAnnouncement == "") + mChannelAnnouncement = "None"; + else + mChannelAnnouncement = channelAnnouncement; } void -ChatChannel::setPassword(const std::string channelPassword) +ChatChannel::setPassword(const std::string &channelPassword) { - mChannelPassword = channelPassword; + if (channelPassword == "") + mChannelPassword = "None"; + else + mChannelPassword = channelPassword; } std::vector<tmwserv::BeingPtr> diff --git a/src/chatchannel.h b/src/chatchannel.h index 4baf0933..43b722b8 100644 --- a/src/chatchannel.h +++ b/src/chatchannel.h @@ -36,9 +36,9 @@ class ChatChannel { /** * Constructors */ - ChatChannel(const std::string channelName, - const std::string ChannelAnnouncement, - const std::string ChannelPassword); + ChatChannel(const std::string &channelName, + const std::string &channelAnnouncement, + const std::string &channelPassword); /** * Destructor @@ -63,17 +63,17 @@ class ChatChannel { /** * Set the name of the channel */ - void setName(const std::string channelName); + void setName(const std::string &channelName); /** * Set the Announcement string of the channel */ - void setAnnouncement(const std::string channelAnnouncement); + void setAnnouncement(const std::string &channelAnnouncement); /** * Set the password of the channel */ - void setPassword(const std::string channelPassword); + void setPassword(const std::string &channelPassword); /** * Get the list of the users registered in the channel diff --git a/src/chatchannelmanager.cpp b/src/chatchannelmanager.cpp index f7f0a181..280090bb 100644 --- a/src/chatchannelmanager.cpp +++ b/src/chatchannelmanager.cpp @@ -57,7 +57,7 @@ ChatChannelManager::registerPublicChannel(const std::string& channelName) if ( channelId >= (signed)MAX_PRIVATE_CHANNELS_RANGE ) return 0; // Register Channel - mChatChannels.insert(std::make_pair(channelId,ChatChannel(channelName, "", ""))); + mChatChannels.insert(std::make_pair(channelId,ChatChannel(channelName, "None", "None"))); return channelId; } @@ -78,7 +78,7 @@ ChatChannelManager::registerPrivateChannel(const std::string& channelName) if ( channelId >= (signed)MAX_PUBLIC_CHANNELS_RANGE ) return 0; // Register Channel - mChatChannels.insert(std::make_pair(channelId, ChatChannel(channelName, "", ""))); + mChatChannels.insert(std::make_pair(channelId, ChatChannel(channelName, "None", "None"))); return channelId; } @@ -130,7 +130,7 @@ ChatChannelManager::getChannelAnnouncement(const short channelId) if ( i->first == channelId ) return i->second.getAnnouncement(); ++i; } - return ""; + return "None"; } const std::string @@ -141,7 +141,7 @@ ChatChannelManager::getChannelPassword(const short channelId) if ( i->first == channelId ) return i->second.getPassword(); ++i; } - return ""; + return "None"; } const ChatChannel @@ -194,3 +194,18 @@ ChatChannelManager::removeUserFromEveryChannels(tmwserv::BeingPtr beingPtr) ++i; } } + +std::vector<tmwserv::BeingPtr> +ChatChannelManager::getUserListInChannel(const short channelId) +{ + for (std::map<short, ChatChannel>::iterator i = mChatChannels.begin(); i != mChatChannels.end();) + { + if ( i->first == channelId ) + { + return i->second.getUserList(); + } + ++i; + } + std::vector<tmwserv::BeingPtr> emptyList; + return emptyList; +} diff --git a/src/chatchannelmanager.h b/src/chatchannelmanager.h index 668b1401..cbc340a9 100644 --- a/src/chatchannelmanager.h +++ b/src/chatchannelmanager.h @@ -118,6 +118,11 @@ public: */ void removeUserFromEveryChannels(tmwserv::BeingPtr beingPtr); + /** + * Get the list of the users registered in a channel + */ + std::vector<tmwserv::BeingPtr> getUserListInChannel(const short channelId); + private: /** @@ -129,4 +134,6 @@ private: }; +extern ChatChannelManager *chatChannelManager; + #endif diff --git a/src/chathandler.cpp b/src/chathandler.cpp index e2f17c89..d57fe8d4 100644 --- a/src/chathandler.cpp +++ b/src/chathandler.cpp @@ -28,12 +28,6 @@ #include "utils/logger.h" #include "utils/slangsfilter.h" -ChatHandler::ChatHandler() -{ - // TODO: Implement loading public chat channels from db. - // That require adding a table for that. -} - void ChatHandler::receiveMessage(NetComputer &computer, MessageIn &message) { // If not logged in... @@ -84,7 +78,7 @@ void ChatHandler::receiveMessage(NetComputer &computer, MessageIn &message) // to the characters around him in the map. // We, then, look for every characters around him and // send the message to them. - // By 'around', let's say 10 tiles square wide for now. + // By 'around', let's say AROUND_AREA_IN_TILES tiles square wide. sayAround(computer, text); } } @@ -215,12 +209,13 @@ void ChatHandler::sayInChannel(NetComputer &computer, short channel, std::string MessageOut result; LOG_INFO( computer.getCharacter()->getName() << " says in channel " << channel << ": " << text, 2) - // TODO: Send it to every beings in channel + // Send it to every beings in channel result.writeShort(SMSG_CHAT); result.writeShort(channel); std::string say = computer.getCharacter()->getName(); say += ": "; say += text; result.writeString(say); + connectionHandler->sendInChannel(channel, result); } diff --git a/src/connectionhandler.cpp b/src/connectionhandler.cpp index 9ce663df..38233a6a 100644 --- a/src/connectionhandler.cpp +++ b/src/connectionhandler.cpp @@ -27,6 +27,7 @@ #include "connectionhandler.h" #include "netsession.h" +#include "chatchannelmanager.h" #include "utils/logger.h" #ifdef SCRIPT_SUPPORT @@ -294,6 +295,24 @@ void ConnectionHandler::sendAround(tmwserv::BeingPtr beingPtr, MessageOut &msg) } } +void ConnectionHandler::sendInChannel(short channelId, MessageOut &msg) +{ + for (NetComputers::iterator i = clients.begin(); i != clients.end();i++) + { + const std::vector<tmwserv::BeingPtr> beingList = + chatChannelManager->getUserListInChannel(channelId); + // If the being is in the channel, send it + for (std::vector<tmwserv::BeingPtr>::const_iterator j = beingList.begin(); + j != beingList.end(); j++) + { + if ((*i)->getCharacter().get() == (*j).get() ) + { + (*i)->send(msg.getPacket()); + } + } + } +} + unsigned int ConnectionHandler::getClientNumber() { return clients.size(); diff --git a/src/connectionhandler.h b/src/connectionhandler.h index 9b0938e1..08965a6a 100644 --- a/src/connectionhandler.h +++ b/src/connectionhandler.h @@ -124,6 +124,11 @@ class ConnectionHandler void sendAround(tmwserv::BeingPtr, MessageOut &); /** + * Send packet to every client in a registered channel. + */ + void sendInChannel(short channelId, MessageOut &); + + /** * Return the number of connected clients. */ unsigned int getClientNumber(); diff --git a/src/dalstorage.cpp b/src/dalstorage.cpp index 22b3d74a..4fb245fd 100644 --- a/src/dalstorage.cpp +++ b/src/dalstorage.cpp @@ -444,7 +444,7 @@ DALStorage::getSameEmailNumber(const std::string &email) * @return true if character's name exists. */ bool -DALStorage::doesCharacterNameExists(std::string name) +DALStorage::doesCharacterNameExists(const std::string& name) { // If not opened already open(); @@ -544,6 +544,10 @@ DALStorage::getChannelList() return channels; } + // We use this to handle correctly empty lines + std::string channelName; + std::string channelAnnouncement; + std::string channelPassword; for ( unsigned int i = 0; i < channelInfo.rows(); ++i) { channels.insert(std::make_pair(toShort(channelInfo(0,0)), @@ -551,8 +555,8 @@ DALStorage::getChannelList() channelInfo(0,2), channelInfo(0,3)))); - LOG_DEBUG("Channel loaded: " << channelInfo(0,1) - << ":" << channelInfo(0,2), 5) + LOG_DEBUG("Channel (" << channelInfo(0,0) << ") loaded: " << channelInfo(0,1) + << ": " << channelInfo(0,2), 5) } return channels; @@ -568,7 +572,11 @@ DALStorage::getChannelList() void DALStorage::updateChannels(std::map<short, ChatChannel>& channelList) { - // If not opened already +#if defined (SQLITE_SUPPORT) + // Reopen the db in this thread for sqlite, to avoid + // Library Call out of sequence problem due to thread safe. + close(); +#endif open(); try { @@ -580,24 +588,28 @@ DALStorage::updateChannels(std::map<short, ChatChannel>& channelList) mDb->execSql(sql.str()); + // TODO: See if ' don't make the SQL query fail. for ( std::map<short, ChatChannel>::iterator i = channelList.begin(); i != channelList.end();) { // insert registered channel if id < MAX_PUBLIC_CHANNELS_RANGE; if ( i->first < (signed)MAX_PUBLIC_CHANNELS_RANGE ) { - sql.str(""); - sql << "insert into " - << CHANNELS_TBL_NAME - << " (id, name, announcement, password)" - << " values (" - << i->first << ", '" - << i->second.getName() << "', '" - << i->second.getAnnouncement() << "', '" - << i->second.getPassword() << "');"; - - LOG_DEBUG("Channel saved: " << i->second.getName() - << ":" << i->second.getAnnouncement(), 5) + if (i->second.getName() != "") + { + sql.str(""); + sql << "insert into " + << CHANNELS_TBL_NAME + << " (id, name, announcement, password)" + << " values (" + << i->first << ", '" + << i->second.getName() << "', '" + << i->second.getAnnouncement() << "', '" + << i->second.getPassword() << "');"; + + LOG_DEBUG("Channel (" << i->first << ") saved: " << i->second.getName() + << ": " << i->second.getAnnouncement(), 5) + } mDb->execSql(sql.str()); } diff --git a/src/dalstorage.h b/src/dalstorage.h index f633527d..4e2768ab 100644 --- a/src/dalstorage.h +++ b/src/dalstorage.h @@ -111,7 +111,7 @@ class DALStorage: public Storage * @return true if character's name exists. */ bool - doesCharacterNameExists(std::string name); + doesCharacterNameExists(const std::string &name); /** * Tells the map name from the map id diff --git a/src/main.cpp b/src/main.cpp index 6088654f..fef59d3d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -36,6 +36,7 @@ #endif #include "accounthandler.h" +#include "chatchannelmanager.h" #include "chathandler.h" #include "configuration.h" #include "connectionhandler.h" @@ -94,6 +95,8 @@ AccountHandler *accountHandler; /** Communications (chat) message handler */ ChatHandler *chatHandler; +/** Chat Channels Manager */ +ChatChannelManager *chatChannelManager; /** Core game message handler */ GameHandler *gameHandler; @@ -175,8 +178,10 @@ void initialize() // Initialize the global handlers // FIXME: Make the global handlers global vars or part of a bigger // singleton or a local vatiable in the event-loop - accountHandler = new AccountHandler(); + chatChannelManager = new ChatChannelManager(); + chatHandler = new ChatHandler(); + accountHandler = new AccountHandler(); gameHandler = new GameHandler(); connectionHandler = new ConnectionHandler(); @@ -270,6 +275,8 @@ void deinitialize() delete gameHandler; delete connectionHandler; + delete chatChannelManager; + // Get rid of persistent data storage tmwserv::Storage::destroy(); diff --git a/src/netcomputer.cpp b/src/netcomputer.cpp index 40685b51..777610b4 100644 --- a/src/netcomputer.cpp +++ b/src/netcomputer.cpp @@ -22,15 +22,14 @@ */ #include "netcomputer.h" +#include "chatchannelmanager.h" #include "state.h" -#include <cstdlib> -#include <iostream> NetComputer::NetComputer(ConnectionHandler *handler, TCPsocket sock): handler(handler), socket(sock), - accountPtr(NULL), - characterPtr(NULL) + mAccountPtr(NULL), + mCharacterPtr(NULL) { } @@ -52,32 +51,33 @@ void NetComputer::send(const Packet *p) void NetComputer::setAccount(tmwserv::AccountPtr acc) { - accountPtr = acc; + mAccountPtr = acc; } void NetComputer::setCharacter(tmwserv::BeingPtr ch) { tmwserv::State &state = tmwserv::State::instance(); - if (characterPtr.get() != NULL) + if (mCharacterPtr.get() != NULL) { // Remove being from the world. - state.removeBeing(characterPtr); + unsetCharacter(); } - characterPtr = ch; - state.addBeing(characterPtr, characterPtr->getMapId()); + mCharacterPtr = ch; + state.addBeing(mCharacterPtr, mCharacterPtr->getMapId()); } void NetComputer::unsetAccount() { unsetCharacter(); - accountPtr = tmwserv::AccountPtr(NULL); + mAccountPtr = tmwserv::AccountPtr(NULL); } void NetComputer::unsetCharacter() { // remove being from world tmwserv::State &state = tmwserv::State::instance(); - state.removeBeing(characterPtr); - characterPtr = tmwserv::BeingPtr(NULL); + state.removeBeing(mCharacterPtr); + chatChannelManager->removeUserFromEveryChannels(mCharacterPtr); + mCharacterPtr = tmwserv::BeingPtr(NULL); } diff --git a/src/netcomputer.h b/src/netcomputer.h index 2d4b5cf5..c6f2c5fc 100644 --- a/src/netcomputer.h +++ b/src/netcomputer.h @@ -91,7 +91,7 @@ class NetComputer /** * Get account associated with the connection */ - tmwserv::AccountPtr getAccount() { return accountPtr; } + tmwserv::AccountPtr getAccount() { return mAccountPtr; } /** * Set the selected character associated with connection @@ -107,7 +107,7 @@ class NetComputer /** * Get character associated with the connection */ - tmwserv::BeingPtr getCharacter() { return characterPtr; } + tmwserv::BeingPtr getCharacter() { return mCharacterPtr; } private: ConnectionHandler *handler; @@ -115,8 +115,8 @@ class NetComputer std::queue<Packet*> queue; /**< Message Queue (FIFO) */ TCPsocket socket; /**< Client socket */ - tmwserv::AccountPtr accountPtr; /**< Account associated with connection */ - tmwserv::BeingPtr characterPtr; /**< Selected character */ + tmwserv::AccountPtr mAccountPtr; /**< Account associated with connection */ + tmwserv::BeingPtr mCharacterPtr; /**< Selected character */ }; #endif diff --git a/src/storage.h b/src/storage.h index 23e58312..eb410139 100644 --- a/src/storage.h +++ b/src/storage.h @@ -305,7 +305,7 @@ class Storage * @return true if character's name exists. */ virtual bool - doesCharacterNameExists(std::string name) = 0; + doesCharacterNameExists(const std::string &name) = 0; /** * Tells the map name from the map id |