summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog14
-rw-r--r--src/account-server/dalstorage.cpp11
-rw-r--r--src/account-server/dalstoragesql.hpp11
-rw-r--r--src/chat-server/chatchannel.cpp14
-rw-r--r--src/chat-server/chatchannel.hpp13
-rw-r--r--src/chat-server/chatchannelmanager.cpp37
-rw-r--r--src/chat-server/chatchannelmanager.hpp29
-rw-r--r--src/chat-server/chathandler.cpp38
-rw-r--r--src/dal/mysqldataprovider.cpp4
-rw-r--r--src/dal/pqdataprovider.cpp2
-rw-r--r--src/dal/sqlitedataprovider.cpp5
-rw-r--r--src/defines.h9
12 files changed, 151 insertions, 36 deletions
diff --git a/ChangeLog b/ChangeLog
index 8f07e732..28e5da2b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 }*