diff options
author | Philipp Sehmisch <crush@themanaworld.org> | 2009-03-05 19:40:40 +0100 |
---|---|---|
committer | Philipp Sehmisch <crush@themanaworld.org> | 2009-03-05 19:40:40 +0100 |
commit | 6f60667b2671104365c7fcfa7866064e04d50156 (patch) | |
tree | 2161adc2f40bcc0fc61baf2b92508eda160e1a6f | |
parent | 8abc32b07bd86a45be9863ec9ae8ca1fdb4d3e75 (diff) | |
parent | 7ae5cf4b6d17a85a010c1eb3262d340e94f44e77 (diff) | |
download | manaserv-6f60667b2671104365c7fcfa7866064e04d50156.tar.gz manaserv-6f60667b2671104365c7fcfa7866064e04d50156.tar.xz manaserv-6f60667b2671104365c7fcfa7866064e04d50156.zip |
Merge branch 'master' of git@gitorious.org:tmwserv/mainline
-rw-r--r-- | accountserver.cbp | 2 | ||||
-rw-r--r-- | src/account-server/accounthandler.cpp | 28 | ||||
-rw-r--r-- | src/account-server/dalstorage.cpp | 79 | ||||
-rw-r--r-- | src/account-server/dalstorage.hpp | 16 | ||||
-rw-r--r-- | src/account-server/dalstoragesql.hpp | 6 | ||||
-rw-r--r-- | src/account-server/transaction.hpp | 48 | ||||
-rw-r--r-- | src/chat-server/chathandler.cpp | 80 | ||||
-rw-r--r-- | src/chat-server/guildmanager.cpp | 3 | ||||
-rw-r--r-- | src/sql/sqlite/createTables.sql | 8 | ||||
-rw-r--r-- | src/sql/sqlite/updates/update_2_to_3.sql | 17 |
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'; + |