From 88b39a7ed47dd29d82a8ec2586243979204b96d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo?= Date: Wed, 1 Jan 2025 08:53:49 -0300 Subject: [PATCH 1/6] [FEATTURE] log players statements --- config.lua.dist | 1 + data/migrations/47.lua | 16 +++++++++++++- data/migrations/48.lua | 3 +++ schema.sql | 14 ++++++++++++- src/config/config_enums.hpp | 1 + src/config/configmanager.cpp | 1 + src/game/game.cpp | 5 +++++ src/io/functions/iologindata_save_player.cpp | 22 ++++++++++++++++++++ src/io/functions/iologindata_save_player.hpp | 1 + 9 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 data/migrations/48.lua diff --git a/config.lua.dist b/config.lua.dist index d739a078..2d7b8eba 100644 --- a/config.lua.dist +++ b/config.lua.dist @@ -448,6 +448,7 @@ disableMonsterArmor = false minElementalResistance = -200 maxElementalResistance = 200 maxDamageReflection = 200 +logPlayersStatements = true -- Chain system -- NOTE: combatChainDelay: set to minimum 50 miliseconds diff --git a/data/migrations/47.lua b/data/migrations/47.lua index 86a6d8ff..6433ddae 100644 --- a/data/migrations/47.lua +++ b/data/migrations/47.lua @@ -1,3 +1,17 @@ function onUpdateDatabase() - return false -- true = There are others migrations file | false = this is the last migration file + logger.info("Updating database to version 48 (player statements)") + + db.query([[ + CREATE TABLE IF NOT EXISTS `player_statements`( + `id` INT NOT NULL AUTO_INCREMENT, + `player_id` INT NOT NULL, + `receiver` TEXT NOT NULL, + `channel_id` INT NOT NULL DEFAULT 0, + `text` VARCHAR (255) NOT NULL, + `date` BIGINT NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), KEY (`player_id`), KEY (`channel_id`), + FOREIGN KEY (`player_id`) REFERENCES `players`(`id`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + ]]) + return true end diff --git a/data/migrations/48.lua b/data/migrations/48.lua new file mode 100644 index 00000000..86a6d8ff --- /dev/null +++ b/data/migrations/48.lua @@ -0,0 +1,3 @@ +function onUpdateDatabase() + return false -- true = There are others migrations file | false = this is the last migration file +end diff --git a/schema.sql b/schema.sql index 76beafec..da1a542d 100644 --- a/schema.sql +++ b/schema.sql @@ -5,7 +5,7 @@ CREATE TABLE IF NOT EXISTS `server_config` ( CONSTRAINT `server_config_pk` PRIMARY KEY (`config`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -INSERT INTO `server_config` (`config`, `value`) VALUES ('db_version', '46'), ('motd_hash', ''), ('motd_num', '0'), ('players_record', '0'); +INSERT INTO `server_config` (`config`, `value`) VALUES ('db_version', '47'), ('motd_hash', ''), ('motd_num', '0'), ('players_record', '0'); -- Table structure `accounts` CREATE TABLE IF NOT EXISTS `accounts` ( @@ -572,6 +572,18 @@ CREATE TABLE IF NOT EXISTS `player_charms` ( `tracker list` BLOB NULL ) ENGINE = InnoDB DEFAULT CHARSET=utf8; +-- Table structure `player_statements` +CREATE TABLE IF NOT EXISTS `player_statements` ( + `id` INT NOT NULL AUTO_INCREMENT, + `player_id` INT NOT NULL, + `receiver` TEXT NOT NULL, + `channel_id` INT NOT NULL DEFAULT 0, + `text` VARCHAR (255) NOT NULL, + `date` BIGINT NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), KEY (`player_id`), KEY (`channel_id`), + FOREIGN KEY (`player_id`) REFERENCES `players`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + -- Table structure `player_deaths` CREATE TABLE IF NOT EXISTS `player_deaths` ( `player_id` int(11) NOT NULL, diff --git a/src/config/config_enums.hpp b/src/config/config_enums.hpp index e860bc4a..b17c774f 100644 --- a/src/config/config_enums.hpp +++ b/src/config/config_enums.hpp @@ -351,4 +351,5 @@ enum ConfigKey_t : uint16_t { BEDS_ONLY_PREMIUM, LOGIN_PROTECTION, SPELL_NAME_INSTEAD_WORDS, + LOG_PLAYERS_STATEMENTS, }; diff --git a/src/config/configmanager.cpp b/src/config/configmanager.cpp index a5e34c99..3529dfc8 100644 --- a/src/config/configmanager.cpp +++ b/src/config/configmanager.cpp @@ -172,6 +172,7 @@ bool ConfigManager::load() { loadBoolConfig(L, CHAIN_SYSTEM_VIP_ONLY, "chainSystemVipOnly", false); loadBoolConfig(L, BEDS_ONLY_PREMIUM, "bedsOnlyPremium", true); loadBoolConfig(L, SPELL_NAME_INSTEAD_WORDS, "spellNameInsteadOfWords", false); + loadBoolConfig(L, LOG_PLAYERS_STATEMENTS, "logPlayersStatements", false); loadFloatConfig(L, BESTIARY_RATE_CHARM_SHOP_PRICE, "bestiaryRateCharmShopPrice", 1.0); loadFloatConfig(L, COMBAT_CHAIN_SKILL_FORMULA_AXE, "combatChainSkillFormulaAxe", 0.9); diff --git a/src/game/game.cpp b/src/game/game.cpp index 6d3ab41e..59404875 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -46,6 +46,7 @@ #include "io/iobestiary.hpp" #include "io/ioguild.hpp" #include "io/iologindata.hpp" +#include "io/functions/iologindata_save_player.hpp" #include "io/iomarket.hpp" #include "io/ioprey.hpp" #include "items/bed.hpp" @@ -6232,6 +6233,10 @@ void Game::playerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type, c player->removeMessageBuffer(); } + uint32_t statementId = 0; + if(g_configManager().getBoolean(LOG_PLAYERS_STATEMENTS)) + IOLoginDataSave::savePlayerStatement(player, receiver, channelId, text, statementId); + switch (type) { case TALKTYPE_SAY: internalCreatureSay(player, TALKTYPE_SAY, text, false); diff --git a/src/io/functions/iologindata_save_player.cpp b/src/io/functions/iologindata_save_player.cpp index fc417901..fcc85f2b 100644 --- a/src/io/functions/iologindata_save_player.cpp +++ b/src/io/functions/iologindata_save_player.cpp @@ -808,3 +808,25 @@ bool IOLoginDataSave::savePlayerStorage(const std::shared_ptr &player) { } return true; } + +bool IOLoginDataSave::savePlayerStatement(const std::shared_ptr &player, const std::string& receiver, uint16_t channelId, const std::string& text, uint32_t& statementId) { + if (!player) { + g_logger().warn("[IOLoginData::savePlayerStatement] - Player nullptr: {}", __FUNCTION__); + return false; + } + + Database &db = Database::getInstance(); + std::ostringstream query; + + query << "INSERT INTO `player_statements` (`player_id`, `receiver`, `channel_id`, `text`, `date`) VALUES (" + << player->getGUID() << ", " << db.escapeString(receiver) << ", " << channelId << ", " + << db.escapeString(text) << ", " << time(nullptr) << ")"; + + if (!db.executeQuery(query.str())) { + return false; + } + + statementId = db.getLastInsertId(); + return true; +} + diff --git a/src/io/functions/iologindata_save_player.hpp b/src/io/functions/iologindata_save_player.hpp index 5f5e57d6..cc15138e 100644 --- a/src/io/functions/iologindata_save_player.hpp +++ b/src/io/functions/iologindata_save_player.hpp @@ -38,6 +38,7 @@ class IOLoginDataSave : public IOLoginData { static bool savePlayerForgeHistory(const std::shared_ptr &player); static bool savePlayerBosstiary(const std::shared_ptr &player); static bool savePlayerStorage(const std::shared_ptr &player); + static bool savePlayerStatement(const std::shared_ptr &player, const std::string& receiver, uint16_t channelId, const std::string& text, uint32_t& statementId); protected: using ItemBlockList = std::list>>; From f35f3972d6e1b950274e28b70d36039eecc5a35a Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Wed, 1 Jan 2025 11:54:30 +0000 Subject: [PATCH 2/6] Code format - (Clang-format) --- src/game/game.cpp | 3 ++- src/io/functions/iologindata_save_player.cpp | 7 +++---- src/io/functions/iologindata_save_player.hpp | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/game/game.cpp b/src/game/game.cpp index 59404875..c1ee8231 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -6234,8 +6234,9 @@ void Game::playerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type, c } uint32_t statementId = 0; - if(g_configManager().getBoolean(LOG_PLAYERS_STATEMENTS)) + if (g_configManager().getBoolean(LOG_PLAYERS_STATEMENTS)) { IOLoginDataSave::savePlayerStatement(player, receiver, channelId, text, statementId); + } switch (type) { case TALKTYPE_SAY: diff --git a/src/io/functions/iologindata_save_player.cpp b/src/io/functions/iologindata_save_player.cpp index fcc85f2b..f78fafc0 100644 --- a/src/io/functions/iologindata_save_player.cpp +++ b/src/io/functions/iologindata_save_player.cpp @@ -809,7 +809,7 @@ bool IOLoginDataSave::savePlayerStorage(const std::shared_ptr &player) { return true; } -bool IOLoginDataSave::savePlayerStatement(const std::shared_ptr &player, const std::string& receiver, uint16_t channelId, const std::string& text, uint32_t& statementId) { +bool IOLoginDataSave::savePlayerStatement(const std::shared_ptr &player, const std::string &receiver, uint16_t channelId, const std::string &text, uint32_t &statementId) { if (!player) { g_logger().warn("[IOLoginData::savePlayerStatement] - Player nullptr: {}", __FUNCTION__); return false; @@ -819,8 +819,8 @@ bool IOLoginDataSave::savePlayerStatement(const std::shared_ptr &player, std::ostringstream query; query << "INSERT INTO `player_statements` (`player_id`, `receiver`, `channel_id`, `text`, `date`) VALUES (" - << player->getGUID() << ", " << db.escapeString(receiver) << ", " << channelId << ", " - << db.escapeString(text) << ", " << time(nullptr) << ")"; + << player->getGUID() << ", " << db.escapeString(receiver) << ", " << channelId << ", " + << db.escapeString(text) << ", " << time(nullptr) << ")"; if (!db.executeQuery(query.str())) { return false; @@ -829,4 +829,3 @@ bool IOLoginDataSave::savePlayerStatement(const std::shared_ptr &player, statementId = db.getLastInsertId(); return true; } - diff --git a/src/io/functions/iologindata_save_player.hpp b/src/io/functions/iologindata_save_player.hpp index cc15138e..73d6adfa 100644 --- a/src/io/functions/iologindata_save_player.hpp +++ b/src/io/functions/iologindata_save_player.hpp @@ -38,7 +38,7 @@ class IOLoginDataSave : public IOLoginData { static bool savePlayerForgeHistory(const std::shared_ptr &player); static bool savePlayerBosstiary(const std::shared_ptr &player); static bool savePlayerStorage(const std::shared_ptr &player); - static bool savePlayerStatement(const std::shared_ptr &player, const std::string& receiver, uint16_t channelId, const std::string& text, uint32_t& statementId); + static bool savePlayerStatement(const std::shared_ptr &player, const std::string &receiver, uint16_t channelId, const std::string &text, uint32_t &statementId); protected: using ItemBlockList = std::list>>; From 3cab8a6bd54362c27cd0d42cf0bed15c889d4e0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo?= Date: Wed, 1 Jan 2025 09:16:55 -0300 Subject: [PATCH 3/6] * Save sender name instead of id --- data/migrations/47.lua | 8 ++++---- schema.sql | 8 ++++---- src/io/functions/iologindata_save_player.cpp | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/data/migrations/47.lua b/data/migrations/47.lua index 6433ddae..6d7fead8 100644 --- a/data/migrations/47.lua +++ b/data/migrations/47.lua @@ -4,13 +4,13 @@ function onUpdateDatabase() db.query([[ CREATE TABLE IF NOT EXISTS `player_statements`( `id` INT NOT NULL AUTO_INCREMENT, - `player_id` INT NOT NULL, - `receiver` TEXT NOT NULL, + `sender` VARCHAR (255) NOT NULL, + `receiver` VARCHAR (255) NOT NULL, `channel_id` INT NOT NULL DEFAULT 0, `text` VARCHAR (255) NOT NULL, `date` BIGINT NOT NULL DEFAULT 0, - PRIMARY KEY (`id`), KEY (`player_id`), KEY (`channel_id`), - FOREIGN KEY (`player_id`) REFERENCES `players`(`id`) ON DELETE CASCADE + PRIMARY KEY (`id`), + KEY (`channel_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ]]) return true diff --git a/schema.sql b/schema.sql index da1a542d..1dc58170 100644 --- a/schema.sql +++ b/schema.sql @@ -575,13 +575,13 @@ CREATE TABLE IF NOT EXISTS `player_charms` ( -- Table structure `player_statements` CREATE TABLE IF NOT EXISTS `player_statements` ( `id` INT NOT NULL AUTO_INCREMENT, - `player_id` INT NOT NULL, - `receiver` TEXT NOT NULL, + `sender` VARCHAR (255) NOT NULL, + `receiver` VARCHAR (255) NOT NULL, `channel_id` INT NOT NULL DEFAULT 0, `text` VARCHAR (255) NOT NULL, `date` BIGINT NOT NULL DEFAULT 0, - PRIMARY KEY (`id`), KEY (`player_id`), KEY (`channel_id`), - FOREIGN KEY (`player_id`) REFERENCES `players`(`id`) ON DELETE CASCADE + PRIMARY KEY (`id`), + KEY (`channel_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- Table structure `player_deaths` diff --git a/src/io/functions/iologindata_save_player.cpp b/src/io/functions/iologindata_save_player.cpp index f78fafc0..5a7be508 100644 --- a/src/io/functions/iologindata_save_player.cpp +++ b/src/io/functions/iologindata_save_player.cpp @@ -818,8 +818,8 @@ bool IOLoginDataSave::savePlayerStatement(const std::shared_ptr &player, Database &db = Database::getInstance(); std::ostringstream query; - query << "INSERT INTO `player_statements` (`player_id`, `receiver`, `channel_id`, `text`, `date`) VALUES (" - << player->getGUID() << ", " << db.escapeString(receiver) << ", " << channelId << ", " + query << "INSERT INTO `player_statements` (`sender`, `receiver`, `channel_id`, `text`, `date`) VALUES (" + << db.escapeString(player->getName()) << ", " << db.escapeString(receiver) << ", " << channelId << ", " << db.escapeString(text) << ", " << time(nullptr) << ")"; if (!db.executeQuery(query.str())) { From 2eb9cc06d1efca659b549100bce06ed0c2c23fb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo?= Date: Wed, 1 Jan 2025 09:24:06 -0300 Subject: [PATCH 4/6] * Update docs and set logPlayersStatements to false --- config.lua.dist | 3 ++- markdowns/CHANGELOG.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/config.lua.dist b/config.lua.dist index 2d7b8eba..c4db7e9d 100644 --- a/config.lua.dist +++ b/config.lua.dist @@ -422,6 +422,7 @@ resetSessionsOnStartup = false -- Misc. -- NOTE: experienceDisplayRates: set to false to ignore exp rate or true to include exp rate -- NOTE: disableLegacyRaids: set to true to disable legacy XML raids +-- NOTE: logPlayersStatements will log all player statements. allowChangeOutfit = true freePremium = false kickIdlePlayerAfterMinutes = 15 @@ -448,7 +449,7 @@ disableMonsterArmor = false minElementalResistance = -200 maxElementalResistance = 200 maxDamageReflection = 200 -logPlayersStatements = true +logPlayersStatements = false -- Chain system -- NOTE: combatChainDelay: set to minimum 50 miliseconds diff --git a/markdowns/CHANGELOG.md b/markdowns/CHANGELOG.md index f76eb729..e7d793b7 100644 --- a/markdowns/CHANGELOG.md +++ b/markdowns/CHANGELOG.md @@ -8,7 +8,7 @@ - Protocol 14.05 support. ([Tryller](https://github.com/jprzimba)) - New protocol 14.05 assets. ([Tryller](https://github.com/jprzimba)) - Optimized the `onPlayerSellAllLoot` code to prevent prolonged freezes. ([Tryller](https://github.com/jprzimba)) -- Add new configurable featurees in `config.lua`: `chainSystemVipOnly`, `fieldOwnershipDuration`, `bedsOnlyPremium`, `loginProtectionPeriod`, `chainSystemModifyMagic`. ([Tryller](https://github.com/jprzimba)) +- Add new configurable featurees in `config.lua`: `chainSystemVipOnly`, `fieldOwnershipDuration`, `bedsOnlyPremium`, `loginProtectionPeriod`, `chainSystemModifyMagic`, `logPlayersStatements`. ([Tryller](https://github.com/jprzimba)) - Added a new commands for players: `!randomoutfit`, `!spellwords`. ([Tryller](https://github.com/jprzimba)) - Moved emote spells to `kv` instead of `storage`. ([Tryller](https://github.com/jprzimba)) From 8c9d1a16185e48a33042d0e4c5cb90fe8d4e27e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo?= Date: Wed, 1 Jan 2025 09:49:52 -0300 Subject: [PATCH 5/6] Revert "* Save sender name instead of id" This reverts commit 3cab8a6bd54362c27cd0d42cf0bed15c889d4e0b. --- data/migrations/47.lua | 8 ++++---- schema.sql | 8 ++++---- src/io/functions/iologindata_save_player.cpp | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/data/migrations/47.lua b/data/migrations/47.lua index 6d7fead8..6433ddae 100644 --- a/data/migrations/47.lua +++ b/data/migrations/47.lua @@ -4,13 +4,13 @@ function onUpdateDatabase() db.query([[ CREATE TABLE IF NOT EXISTS `player_statements`( `id` INT NOT NULL AUTO_INCREMENT, - `sender` VARCHAR (255) NOT NULL, - `receiver` VARCHAR (255) NOT NULL, + `player_id` INT NOT NULL, + `receiver` TEXT NOT NULL, `channel_id` INT NOT NULL DEFAULT 0, `text` VARCHAR (255) NOT NULL, `date` BIGINT NOT NULL DEFAULT 0, - PRIMARY KEY (`id`), - KEY (`channel_id`) + PRIMARY KEY (`id`), KEY (`player_id`), KEY (`channel_id`), + FOREIGN KEY (`player_id`) REFERENCES `players`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ]]) return true diff --git a/schema.sql b/schema.sql index 1dc58170..da1a542d 100644 --- a/schema.sql +++ b/schema.sql @@ -575,13 +575,13 @@ CREATE TABLE IF NOT EXISTS `player_charms` ( -- Table structure `player_statements` CREATE TABLE IF NOT EXISTS `player_statements` ( `id` INT NOT NULL AUTO_INCREMENT, - `sender` VARCHAR (255) NOT NULL, - `receiver` VARCHAR (255) NOT NULL, + `player_id` INT NOT NULL, + `receiver` TEXT NOT NULL, `channel_id` INT NOT NULL DEFAULT 0, `text` VARCHAR (255) NOT NULL, `date` BIGINT NOT NULL DEFAULT 0, - PRIMARY KEY (`id`), - KEY (`channel_id`) + PRIMARY KEY (`id`), KEY (`player_id`), KEY (`channel_id`), + FOREIGN KEY (`player_id`) REFERENCES `players`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- Table structure `player_deaths` diff --git a/src/io/functions/iologindata_save_player.cpp b/src/io/functions/iologindata_save_player.cpp index 5a7be508..f78fafc0 100644 --- a/src/io/functions/iologindata_save_player.cpp +++ b/src/io/functions/iologindata_save_player.cpp @@ -818,8 +818,8 @@ bool IOLoginDataSave::savePlayerStatement(const std::shared_ptr &player, Database &db = Database::getInstance(); std::ostringstream query; - query << "INSERT INTO `player_statements` (`sender`, `receiver`, `channel_id`, `text`, `date`) VALUES (" - << db.escapeString(player->getName()) << ", " << db.escapeString(receiver) << ", " << channelId << ", " + query << "INSERT INTO `player_statements` (`player_id`, `receiver`, `channel_id`, `text`, `date`) VALUES (" + << player->getGUID() << ", " << db.escapeString(receiver) << ", " << channelId << ", " << db.escapeString(text) << ", " << time(nullptr) << ")"; if (!db.executeQuery(query.str())) { From b6a10e4a2cd4efbb01054edbc2c29ad9d661b7d8 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Wed, 1 Jan 2025 14:58:28 +0000 Subject: [PATCH 6/6] Code format - (Clang-format) --- src/database/databasemanager.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/database/databasemanager.hpp b/src/database/databasemanager.hpp index 13303cb1..54776f0d 100644 --- a/src/database/databasemanager.hpp +++ b/src/database/databasemanager.hpp @@ -32,4 +32,3 @@ class DatabaseManager { static bool getDatabaseConfig(const std::string &config, int32_t &value); static void registerDatabaseConfig(const std::string &config, int32_t value); }; -