summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--src/chatchannel.cpp26
-rw-r--r--src/chatchannel.h12
-rw-r--r--src/chatchannelmanager.cpp23
-rw-r--r--src/chatchannelmanager.h7
-rw-r--r--src/chathandler.cpp11
-rw-r--r--src/connectionhandler.cpp19
-rw-r--r--src/connectionhandler.h5
-rw-r--r--src/dalstorage.cpp44
-rw-r--r--src/dalstorage.h2
-rw-r--r--src/main.cpp9
-rw-r--r--src/netcomputer.cpp24
-rw-r--r--src/netcomputer.h8
-rw-r--r--src/storage.h2
14 files changed, 142 insertions, 61 deletions
diff --git a/ChangeLog b/ChangeLog
index 3c5cfd16..c83a4b9b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2006-01-21 Yohann Ferreira <bertram@cegetel.net>
+
+ * src/chatchannelmanager.h, src/chatchannelmanager.cpp,
+ src/chatchannel.h, src/chatchannel.cpp, src/dalstorage.cpp,
+ src/dalstorage.h, src/storage.h, src/chathandler.cpp,
+ src/netcomputer.h, src/netcomputer.cpp, src/main.cpp,
+ src/connectionhandler.h, src/connectionhandler.cpp: 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 and in
+ the channels load/save functions.
+
2006-01-18 Bjørn Lindeijer <bjorn@lindeijer.nl>
* src/mapmanager.cpp, src/mapmanager.h: Some insignificant changes to
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