summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--accountserver.cbp2
-rw-r--r--src/account-server/accounthandler.cpp28
-rw-r--r--src/account-server/dalstorage.cpp79
-rw-r--r--src/account-server/dalstorage.hpp16
-rw-r--r--src/account-server/dalstoragesql.hpp6
-rw-r--r--src/account-server/transaction.hpp48
-rw-r--r--src/chat-server/chathandler.cpp80
-rw-r--r--src/chat-server/guildmanager.cpp3
-rw-r--r--src/sql/sqlite/createTables.sql8
-rw-r--r--src/sql/sqlite/updates/update_2_to_3.sql17
10 files changed, 281 insertions, 6 deletions
diff --git a/accountserver.cbp b/accountserver.cbp
index 6b6f548..1cfd0bb 100644
--- a/accountserver.cbp
+++ b/accountserver.cbp
@@ -68,6 +68,8 @@
<Unit filename="src/account-server/main-account.cpp" />
<Unit filename="src/account-server/serverhandler.cpp" />
<Unit filename="src/account-server/serverhandler.hpp" />
+ <Unit filename="src/account-server/transaction.cpp" />
+ <Unit filename="src/account-server/transaction.hpp" />
<Unit filename="src/chat-server/chatchannel.cpp" />
<Unit filename="src/chat-server/chatchannel.hpp" />
<Unit filename="src/chat-server/chatchannelmanager.cpp" />
diff --git a/src/account-server/accounthandler.cpp b/src/account-server/accounthandler.cpp
index a036920..a1280e3 100644
--- a/src/account-server/accounthandler.cpp
+++ b/src/account-server/accounthandler.cpp
@@ -28,6 +28,7 @@
#include "account-server/character.hpp"
#include "account-server/dalstorage.hpp"
#include "account-server/serverhandler.hpp"
+#include "account-server/transaction.hpp"
#include "chat-server/chathandler.hpp"
#include "common/configuration.hpp"
#include "net/connectionhandler.hpp"
@@ -494,8 +495,8 @@ static void handleCharacterCreateMessage(AccountClient &computer, MessageIn &msg
int hairStyle = msg.readByte();
int hairColor = msg.readByte();
int gender = msg.readByte();
- int numHairStyles = Configuration::getValue("char_numHairStyles", 15);
- int numHairColors = Configuration::getValue("char_numHairColors", 9);
+ int numHairStyles = Configuration::getValue("char_numHairStyles", 17);
+ int numHairColors = Configuration::getValue("char_numHairColors", 11);
int numGenders = Configuration::getValue("char_numGenders", 2);
unsigned minNameLength = Configuration::getValue("char_minNameLength", 4);
unsigned maxNameLength = Configuration::getValue("char_maxNameLength", 25);
@@ -604,6 +605,14 @@ static void handleCharacterCreateMessage(AccountClient &computer, MessageIn &msg
LOG_INFO("Character " << name << " was created for "
<< acc->getName() << "'s account.");
+ // log transaction
+ Transaction trans;
+ trans.mCharacterId = newCharacter->getDatabaseID();
+ trans.mAction = TRANS_CHAR_CREATE;
+ trans.mMessage = acc->getName() + " created character ";
+ trans.mMessage.append(" called " + name);
+ storage->addTransaction(trans);
+
storage->flush(acc); // flush changes
reply.writeByte(ERRMSG_OK);
computer.send(reply);
@@ -674,6 +683,13 @@ static void handleCharacterSelectMessage(AccountClient &computer, MessageIn &msg
registerChatClient(magic_token, selectedChar->getName(), acc->getLevel());
computer.send(reply);
+
+ // log transaction
+ Transaction trans;
+ trans.mCharacterId = selectedChar->getDatabaseID();
+ trans.mAction = TRANS_CHAR_SELECTED;
+ trans.mMessage = "";
+ storage->addTransaction(trans);
}
static void handleCharacterDeleteMessage(AccountClient &computer, MessageIn &msg)
@@ -707,6 +723,14 @@ static void handleCharacterDeleteMessage(AccountClient &computer, MessageIn &msg
reply.writeByte(ERRMSG_OK);
computer.send(reply);
+
+ // log transaction
+ Transaction trans;
+ trans.mCharacterId = chars[charNum]->getDatabaseID();
+ trans.mAction = TRANS_CHAR_DELETED;
+ trans.mMessage = chars[charNum]->getName() + " deleted by ";
+ trans.mMessage.append(acc->getName());
+ storage->addTransaction(trans);
}
void
diff --git a/src/account-server/dalstorage.cpp b/src/account-server/dalstorage.cpp
index 55a31d3..eac9f40 100644
--- a/src/account-server/dalstorage.cpp
+++ b/src/account-server/dalstorage.cpp
@@ -41,7 +41,7 @@
// defines the supported db version
#define DB_VERSION_PARAMETER "database_version"
-#define SUPPORTED_DB_VERSION "2"
+#define SUPPORTED_DB_VERSION "3"
/**
@@ -1006,6 +1006,7 @@ void DALStorage::setMemberRights(int guildId, int memberId, int rights)
<< " set rights = '" << rights << "'"
<< " where member_id = \""
<< memberId << "\";";
+ mDb->execSql(sql.str());
}
catch (const dal::DbSqlQueryExecFailure& e)
{
@@ -1627,3 +1628,79 @@ void DALStorage::setOnlineStatus(int charId, bool online)
LOG_ERROR("(DALStorage::setOnlineStatus) SQL query failure: " << e.what());
}
}
+
+void DALStorage::addTransaction(const Transaction &trans)
+{
+ try
+ {
+ std::stringstream sql;
+ sql << "INSERT INTO " << TRANSACTION_TBL_NAME
+ << " VALUES (NULL, " << trans.mCharacterId << ", " << trans.mAction
+ << ", '" << trans.mMessage << "', " << time(NULL) << ")";
+ mDb->execSql(sql.str());
+ }
+ catch (dal::DbSqlQueryExecFailure const &e)
+ {
+ LOG_ERROR("(DALStorage::addTransaction) SQL query failure: " << e.what());
+ }
+}
+
+std::vector<Transaction> DALStorage::getTransactions(unsigned int num)
+{
+ std::vector<Transaction> transactions;
+ string_to<unsigned int> toUint;
+
+ try
+ {
+ std::stringstream sql;
+ sql << "SELECT * FROM " << TRANSACTION_TBL_NAME;
+ dal::RecordSet const &rec = mDb->execSql(sql.str());
+
+ int size = rec.rows();
+ int start = size - num;
+ // Get the last <num> records and store them in transactions
+ for (int i = start; i < size; ++i)
+ {
+ Transaction trans;
+ trans.mCharacterId = toUint(rec(i, 1));
+ trans.mAction = toUint(rec(i, 2));
+ trans.mMessage = rec(i, 3);
+ transactions.push_back(trans);
+ }
+ }
+ catch (dal::DbSqlQueryExecFailure const &e)
+ {
+ LOG_ERROR("(DALStorage::getTransactions) SQL query failure: " << e.what());
+ }
+
+ return transactions;
+}
+
+std::vector<Transaction> DALStorage::getTransactions(time_t date)
+{
+ std::vector<Transaction> transactions;
+ string_to<unsigned int> toUint;
+
+ try
+ {
+ std::stringstream sql;
+ sql << "SELECT * FROM " << TRANSACTION_TBL_NAME << " WHERE time > "
+ << date;
+ dal::RecordSet const &rec = mDb->execSql(sql.str());
+
+ for (int i = 0; i < rec.rows(); ++i)
+ {
+ Transaction trans;
+ trans.mCharacterId = toUint(rec(i, 1));
+ trans.mAction = toUint(rec(i, 2));
+ trans.mMessage = rec(i, 3);
+ transactions.push_back(trans);
+ }
+ }
+ catch (dal::DbSqlQueryExecFailure const &e)
+ {
+ LOG_ERROR("(DALStorage::getTransactions) SQL query failure: " << e.what());
+ }
+
+ return transactions;
+}
diff --git a/src/account-server/dalstorage.hpp b/src/account-server/dalstorage.hpp
index fb8ae13..131cf81 100644
--- a/src/account-server/dalstorage.hpp
+++ b/src/account-server/dalstorage.hpp
@@ -23,9 +23,12 @@
#include <list>
#include <map>
+#include <vector>
#include "dal/dataprovider.h"
+#include "transaction.hpp"
+
class Account;
class Character;
class ChatChannel;
@@ -365,6 +368,19 @@ class DALStorage
*/
void setOnlineStatus(int charId, bool online);
+ /**
+ * Store a transaction
+ */
+ void addTransaction(const Transaction &trans);
+
+ /**
+ * Retrieve a series of transactions
+ * Either based on number of transactions last saved
+ * or by all transactions since a date
+ */
+ std::vector<Transaction> getTransactions(unsigned int num);
+ std::vector<Transaction> getTransactions(time_t date);
+
private:
/**
* Copy constructor.
diff --git a/src/account-server/dalstoragesql.hpp b/src/account-server/dalstoragesql.hpp
index 4b9d27d..34cdec5 100644
--- a/src/account-server/dalstoragesql.hpp
+++ b/src/account-server/dalstoragesql.hpp
@@ -137,4 +137,10 @@ static char const *AUCTION_BIDS_TBL_NAME = "tmw_auction_bids";
*/
static char const *ONLINE_USERS_TBL_NAME = "tmw_online_list";
+/**
+ * TABLE: tmw_transactions
+ * Stores all transactions
+ */
+static char const *TRANSACTION_TBL_NAME = "tmw_transactions";
+
#endif // _TMWSERV_DALSTORAGE_SQL_H_
diff --git a/src/account-server/transaction.hpp b/src/account-server/transaction.hpp
new file mode 100644
index 0000000..fa007df
--- /dev/null
+++ b/src/account-server/transaction.hpp
@@ -0,0 +1,48 @@
+/*
+ * The Mana World Server
+ * Copyright 2009 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or any later version.
+ *
+ * The Mana World is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with The Mana World; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef _TMWSERV_TRANSACTION_H_
+#define _TMWSERV_TRANSACTION_H_
+
+struct Transaction
+{
+ unsigned int mAction;
+ unsigned int mCharacterId;
+ std::string mMessage;
+};
+
+enum
+{
+ TRANS_CHAR_CREATE = 1,
+ TRANS_CHAR_SELECTED,
+ TRANS_CHAR_DELETED,
+ TRANS_MSG_PUBLIC,
+ TRANS_MSG_ANNOUNCE,
+ TRANS_MSG_PRIVATE,
+ TRANS_CHANNEL_JOIN,
+ TRANS_CHANNEL_KICK,
+ TRANS_CHANNEL_MODE,
+ TRANS_CHANNEL_QUIT,
+ TRANS_CHANNEL_LIST,
+ TRANS_CHANNEL_USERLIST,
+ TRANS_CHANNEL_TOPIC,
+};
+
+#endif
diff --git a/src/chat-server/chathandler.cpp b/src/chat-server/chathandler.cpp
index 9240d95..555c1a0 100644
--- a/src/chat-server/chathandler.cpp
+++ b/src/chat-server/chathandler.cpp
@@ -27,6 +27,7 @@
#include "defines.h"
#include "account-server/character.hpp"
#include "account-server/dalstorage.hpp"
+#include "account-server/transaction.hpp"
#include "chat-server/guildmanager.hpp"
#include "chat-server/chatchannelmanager.hpp"
#include "chat-server/chatclient.hpp"
@@ -291,6 +292,13 @@ ChatHandler::handleChatMessage(ChatClient &client, MessageIn &msg)
result.writeString(text);
sendInChannel(channel, result);
}
+
+ // log transaction
+ Transaction trans;
+ trans.mCharacterId = client.characterId;
+ trans.mAction = TRANS_MSG_PUBLIC;
+ trans.mMessage = "User said " + text;
+ storage->addTransaction(trans);
}
void
@@ -314,6 +322,13 @@ ChatHandler::handleAnnounceMessage(ChatClient &client, MessageIn &msg)
// We send the message to all players in the default channel as it is
// an announcement.
sendToEveryone(result);
+
+ // log transaction
+ Transaction trans;
+ trans.mCharacterId = client.characterId;
+ trans.mAction = TRANS_MSG_ANNOUNCE;
+ trans.mMessage = "User announced " + text;
+ storage->addTransaction(trans);
}
else
{
@@ -323,6 +338,7 @@ ChatHandler::handleAnnounceMessage(ChatClient &client, MessageIn &msg)
LOG_INFO(client.characterName <<
" couldn't make an announcement due to insufficient rights.");
}
+
}
void
@@ -339,6 +355,14 @@ ChatHandler::handlePrivMsgMessage(ChatClient &client, MessageIn &msg)
// We seek the player to whom the message is told and send it to her/him.
sayToPlayer(client, user, text);
+
+ // log transaction
+ Transaction trans;
+ trans.mCharacterId = client.characterId;
+ trans.mAction = TRANS_MSG_PRIVATE;
+ trans.mMessage = "User said " + text;
+ trans.mMessage.append(" to " + user);
+ storage->addTransaction(trans);
}
void ChatHandler::handleEnterChannelMessage(ChatClient &client, MessageIn &msg)
@@ -392,6 +416,13 @@ void ChatHandler::handleEnterChannelMessage(ChatClient &client, MessageIn &msg)
warnUsersAboutPlayerEventInChat(channel,
client.characterName,
CHAT_EVENT_NEW_PLAYER);
+
+ // log transaction
+ Transaction trans;
+ trans.mCharacterId = client.characterId;
+ trans.mAction = TRANS_CHANNEL_JOIN;
+ trans.mMessage = "User joined " + channelName;
+ storage->addTransaction(trans);
}
else
{
@@ -414,7 +445,7 @@ ChatHandler::handleModeChangeMessage(ChatClient &client, MessageIn &msg)
return;
}
- if (channel->getUserMode(&client).find('o') != std::string::npos)
+ if (channel->getUserMode(&client).find('o') == std::string::npos)
{
// invalid permissions
return;
@@ -434,6 +465,14 @@ ChatHandler::handleModeChangeMessage(ChatClient &client, MessageIn &msg)
warnUsersAboutPlayerEventInChat(channel,
info.str(),
CHAT_EVENT_MODE_CHANGE);
+
+ // log transaction
+ Transaction trans;
+ trans.mCharacterId = client.characterId;
+ trans.mAction = TRANS_CHANNEL_MODE;
+ trans.mMessage = "User mode " + mode;
+ trans.mMessage.append(" set on " + user);
+ storage->addTransaction(trans);
}
void
@@ -448,7 +487,7 @@ ChatHandler::handleKickUserMessage(ChatClient &client, MessageIn &msg)
return;
}
- if (channel->getUserMode(&client).find('o') != std::string::npos)
+ if (channel->getUserMode(&client).find('o') == std::string::npos)
{
// invalid permissions
return;
@@ -465,6 +504,13 @@ ChatHandler::handleKickUserMessage(ChatClient &client, MessageIn &msg)
ss.str(),
CHAT_EVENT_KICKED_PLAYER);
}
+
+ // log transaction
+ Transaction trans;
+ trans.mCharacterId = client.characterId;
+ trans.mAction = TRANS_CHANNEL_KICK;
+ trans.mMessage = "User kicked " + user;
+ storage->addTransaction(trans);
}
void
@@ -493,6 +539,14 @@ ChatHandler::handleQuitChannelMessage(ChatClient &client, MessageIn &msg)
warnUsersAboutPlayerEventInChat(channel,
client.characterName,
CHAT_EVENT_LEAVING_PLAYER);
+
+ // log transaction
+ Transaction trans;
+ trans.mCharacterId = client.characterId;
+ trans.mAction = TRANS_CHANNEL_QUIT;
+ trans.mMessage = "User left " + channel->getName();
+ storage->addTransaction(trans);
+
if(channel->getUserList().empty())
{
chatChannelManager->removeChannel(channel->getId());
@@ -519,6 +573,13 @@ ChatHandler::handleListChannelsMessage(ChatClient &client, MessageIn &msg)
}
client.send(reply);
+
+ // log transaction
+ Transaction trans;
+ trans.mCharacterId = client.characterId;
+ trans.mAction = TRANS_CHANNEL_LIST;
+ trans.mMessage = "";
+ storage->addTransaction(trans);
}
void
@@ -544,6 +605,13 @@ ChatHandler::handleListChannelUsersMessage(ChatClient &client, MessageIn &msg)
client.send(reply);
}
+
+ // log transaction
+ Transaction trans;
+ trans.mCharacterId = client.characterId;
+ trans.mAction = TRANS_CHANNEL_USERLIST;
+ trans.mMessage = "";
+ storage->addTransaction(trans);
}
void
@@ -561,6 +629,14 @@ ChatHandler::handleTopicChange(ChatClient &client, MessageIn &msg)
{
guildChannelTopicChange(channel, client.characterId, topic);
}
+
+ // log transaction
+ Transaction trans;
+ trans.mCharacterId = client.characterId;
+ trans.mAction = TRANS_CHANNEL_TOPIC;
+ trans.mMessage = "User changed topic to " + topic;
+ trans.mMessage.append(" in " + channel->getName());
+ storage->addTransaction(trans);
}
void
diff --git a/src/chat-server/guildmanager.cpp b/src/chat-server/guildmanager.cpp
index cf4ceef..b275ee8 100644
--- a/src/chat-server/guildmanager.cpp
+++ b/src/chat-server/guildmanager.cpp
@@ -195,12 +195,13 @@ bool GuildManager::alreadyOwner(int playerId)
std::list<int>::iterator itr = mOwners.begin();
std::list<int>::iterator itr_end = mOwners.end();
- for (itr; itr != itr_end; ++itr)
+ while (itr != itr_end)
{
if ((*itr) == playerId)
{
return true;
}
+ ++itr;
}
return false;
diff --git a/src/sql/sqlite/createTables.sql b/src/sql/sqlite/createTables.sql
index 68d4ed5..11478d9 100644
--- a/src/sql/sqlite/createTables.sql
+++ b/src/sql/sqlite/createTables.sql
@@ -212,6 +212,14 @@ CREATE TABLE tmw_post_attachments
CREATE INDEX tmw_post_attachments_ltr ON tmw_post_attachments ( letter_id );
CREATE INDEX tmw_post_attachments_itm ON tmw_post_attachments ( item_id );
+CREATE TABLE tmw_transactions
+(
+ id INTEGER PRIMARY KEY,
+ char_id INTEGER NOT NULL,
+ action INTEGER NOT NULL,
+ message TEXT,
+ time INTEGER NOT NULL,
+);
CREATE TABLE tmw_online_list
(
diff --git a/src/sql/sqlite/updates/update_2_to_3.sql b/src/sql/sqlite/updates/update_2_to_3.sql
new file mode 100644
index 0000000..f8fdfc9
--- /dev/null
+++ b/src/sql/sqlite/updates/update_2_to_3.sql
@@ -0,0 +1,17 @@
+
+-- add table tmw_transactions to store transactional history
+CREATE TABLE tmw_transactions
+(
+ id INTEGER PRIMARY KEY,
+ char_id INTEGER NOT NULL,
+ action INTEGER NOT NULL,
+ message TEXT,
+ time INTEGER NOT NULL,
+);
+
+-- update the database version, and set date of update
+UPDATE tmw_world_states
+ SET value = '3',
+ moddate = strftime('%s','now')
+ WHERE state_name = 'database_version';
+