From 30a6139d35938d9e86b33e32d5e5b111a16db937 Mon Sep 17 00:00:00 2001 From: Philipp Sehmisch Date: Mon, 2 Mar 2009 16:27:29 +0100 Subject: Fixed default values of numHairStyles und numHairColors --- src/account-server/accounthandler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/account-server/accounthandler.cpp b/src/account-server/accounthandler.cpp index a0369201..27d96176 100644 --- a/src/account-server/accounthandler.cpp +++ b/src/account-server/accounthandler.cpp @@ -494,8 +494,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); -- cgit v1.2.3-60-g2f50 From be548ff54b8fa60a8a778714cd8fa5326722c0aa Mon Sep 17 00:00:00 2001 From: David Athay Date: Thu, 5 Mar 2009 14:30:19 +0000 Subject: Added transactional history --- accountserver.cbp | 2 + src/account-server/accounthandler.cpp | 24 ++++++++++ src/account-server/dalstorage.cpp | 79 +++++++++++++++++++++++++++++++- src/account-server/dalstorage.hpp | 16 +++++++ src/account-server/dalstoragesql.hpp | 6 +++ src/account-server/transaction.hpp | 38 +++++++++++++++ src/sql/sqlite/createTables.sql | 8 ++++ src/sql/sqlite/updates/update_2_to_3.sql | 17 +++++++ 8 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 src/account-server/transaction.hpp create mode 100644 src/sql/sqlite/updates/update_2_to_3.sql (limited to 'src') diff --git a/accountserver.cbp b/accountserver.cbp index 6b6f5487..1cfd0bb8 100644 --- a/accountserver.cbp +++ b/accountserver.cbp @@ -68,6 +68,8 @@ + + diff --git a/src/account-server/accounthandler.cpp b/src/account-server/accounthandler.cpp index 27d96176..a1280e35 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" @@ -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 55a31d30..a524fc35 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 (" << 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 DALStorage::getTransactions(unsigned int num) +{ + std::vector transactions; + string_to 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 records and store them in transactions + for (int i = start; i < size; ++i) + { + Transaction trans; + trans.mCharacterId = toUint(rec(i, 0)); + trans.mAction = toUint(rec(i, 1)); + trans.mMessage = rec(i, 2); + transactions.push_back(trans); + } + } + catch (dal::DbSqlQueryExecFailure const &e) + { + LOG_ERROR("(DALStorage::getTransactions) SQL query failure: " << e.what()); + } + + return transactions; +} + +std::vector DALStorage::getTransactions(time_t date) +{ + std::vector transactions; + string_to 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, 0)); + trans.mAction = toUint(rec(i, 1)); + trans.mMessage = rec(i, 2); + 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 fb8ae138..131cf819 100644 --- a/src/account-server/dalstorage.hpp +++ b/src/account-server/dalstorage.hpp @@ -23,9 +23,12 @@ #include #include +#include #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 getTransactions(unsigned int num); + std::vector getTransactions(time_t date); + private: /** * Copy constructor. diff --git a/src/account-server/dalstoragesql.hpp b/src/account-server/dalstoragesql.hpp index 4b9d27db..34cdec5b 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 00000000..8aa1b340 --- /dev/null +++ b/src/account-server/transaction.hpp @@ -0,0 +1,38 @@ +/* + * 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 = 2, + TRANS_CHAR_DELETED = 3, +}; + +#endif diff --git a/src/sql/sqlite/createTables.sql b/src/sql/sqlite/createTables.sql index 68d4ed58..11478d9b 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 00000000..b2e4834d --- /dev/null +++ b/src/sql/sqlite/updates/update_2_to_3.sql @@ -0,0 +1,17 @@ + +-- add table tmw_online_list to store online users +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'; + -- cgit v1.2.3-60-g2f50 From 7ae5cf4b6d17a85a010c1eb3262d340e94f44e77 Mon Sep 17 00:00:00 2001 From: David Athay Date: Thu, 5 Mar 2009 15:37:06 +0000 Subject: Added transactions for chat events. --- src/account-server/dalstorage.cpp | 14 +++--- src/account-server/transaction.hpp | 14 +++++- src/chat-server/chathandler.cpp | 80 +++++++++++++++++++++++++++++++- src/chat-server/guildmanager.cpp | 3 +- src/sql/sqlite/updates/update_2_to_3.sql | 2 +- 5 files changed, 100 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/account-server/dalstorage.cpp b/src/account-server/dalstorage.cpp index a524fc35..eac9f409 100644 --- a/src/account-server/dalstorage.cpp +++ b/src/account-server/dalstorage.cpp @@ -1635,7 +1635,7 @@ void DALStorage::addTransaction(const Transaction &trans) { std::stringstream sql; sql << "INSERT INTO " << TRANSACTION_TBL_NAME - << " VALUES (" << trans.mCharacterId << ", " << trans.mAction + << " VALUES (NULL, " << trans.mCharacterId << ", " << trans.mAction << ", '" << trans.mMessage << "', " << time(NULL) << ")"; mDb->execSql(sql.str()); } @@ -1662,9 +1662,9 @@ std::vector DALStorage::getTransactions(unsigned int num) for (int i = start; i < size; ++i) { Transaction trans; - trans.mCharacterId = toUint(rec(i, 0)); - trans.mAction = toUint(rec(i, 1)); - trans.mMessage = rec(i, 2); + trans.mCharacterId = toUint(rec(i, 1)); + trans.mAction = toUint(rec(i, 2)); + trans.mMessage = rec(i, 3); transactions.push_back(trans); } } @@ -1691,9 +1691,9 @@ std::vector DALStorage::getTransactions(time_t date) for (int i = 0; i < rec.rows(); ++i) { Transaction trans; - trans.mCharacterId = toUint(rec(i, 0)); - trans.mAction = toUint(rec(i, 1)); - trans.mMessage = rec(i, 2); + trans.mCharacterId = toUint(rec(i, 1)); + trans.mAction = toUint(rec(i, 2)); + trans.mMessage = rec(i, 3); transactions.push_back(trans); } } diff --git a/src/account-server/transaction.hpp b/src/account-server/transaction.hpp index 8aa1b340..fa007dfb 100644 --- a/src/account-server/transaction.hpp +++ b/src/account-server/transaction.hpp @@ -31,8 +31,18 @@ struct Transaction enum { TRANS_CHAR_CREATE = 1, - TRANS_CHAR_SELECTED = 2, - TRANS_CHAR_DELETED = 3, + 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 9240d957..555c1a06 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 cf4ceef6..b275ee8c 100644 --- a/src/chat-server/guildmanager.cpp +++ b/src/chat-server/guildmanager.cpp @@ -195,12 +195,13 @@ bool GuildManager::alreadyOwner(int playerId) std::list::iterator itr = mOwners.begin(); std::list::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/updates/update_2_to_3.sql b/src/sql/sqlite/updates/update_2_to_3.sql index b2e4834d..f8fdfc91 100644 --- a/src/sql/sqlite/updates/update_2_to_3.sql +++ b/src/sql/sqlite/updates/update_2_to_3.sql @@ -1,5 +1,5 @@ --- add table tmw_online_list to store online users +-- add table tmw_transactions to store transactional history CREATE TABLE tmw_transactions ( id INTEGER PRIMARY KEY, -- cgit v1.2.3-60-g2f50