From 20778ad7d9c05ec48bd3675f01f71ddb79dfa0dd Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Sun, 7 Jan 2024 01:25:58 -0500 Subject: [PATCH] [Character] Convert NoRentExpired to Repositories (#3860) * [Character] Convert NoRentExpired to Repositories - Create a custom `GetSecondsSinceLastLogin` repository method to use in `NoRentExpired`. * Update character_data_repository.h --- .../repositories/character_data_repository.h | 18 ++++++++++++++++++ zone/client_process.cpp | 8 +++++--- zone/zonedb.cpp | 17 +++++------------ zone/zonedb.h | 2 +- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/common/repositories/character_data_repository.h b/common/repositories/character_data_repository.h index c029b14ea..6facc720b 100644 --- a/common/repositories/character_data_repository.h +++ b/common/repositories/character_data_repository.h @@ -46,6 +46,24 @@ public: */ // Custom extended repository methods here + static uint32 GetSecondsSinceLastLogin(Database &db, const std::string& name) + { + auto results = db.QueryDatabase( + fmt::format( + "SELECT (UNIX_TIMESTAMP(NOW()) - last_login) FROM {} WHERE name = '{}'", + TableName(), + Strings::Escape(name) + ) + ); + + if (!results.RowCount() || !results.Success()) { + return 0; + } + + auto row = results.begin(); + + return Strings::ToUnsignedInt(row[0]); + } }; #endif //EQEMU_CHARACTER_DATA_REPOSITORY_H diff --git a/zone/client_process.cpp b/zone/client_process.cpp index d31ca8548..57a7e05b2 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -763,10 +763,12 @@ void Client::BulkSendInventoryItems() } } - bool deletenorent = database.NoRentExpired(GetName()); - if (deletenorent) { //client was offline for more than 30 minutes, delete no rent items - if (RuleB(Inventory, TransformSummonedBags)) + const bool delete_no_rent = database.NoRentExpired(GetName()); + if (delete_no_rent) { //client was offline for more than 30 minutes, delete no rent items + if (RuleB(Inventory, TransformSummonedBags)) { DisenchantSummonedBags(false); + } + RemoveNoRent(false); } diff --git a/zone/zonedb.cpp b/zone/zonedb.cpp index cddbcac28..5995d28a2 100755 --- a/zone/zonedb.cpp +++ b/zone/zonedb.cpp @@ -37,6 +37,7 @@ #include "../common/repositories/character_alt_currency_repository.h" #include "../common/repositories/character_item_recast_repository.h" #include "../common/repositories/account_repository.h" +#include "../common/repositories/character_data_repository.h" #include #include @@ -1389,19 +1390,11 @@ bool ZoneDatabase::DeleteCharacterMemorizedSpell(uint32 character_id, uint32 slo ); } -bool ZoneDatabase::NoRentExpired(const char* name){ - std::string query = StringFormat("SELECT (UNIX_TIMESTAMP(NOW()) - last_login) FROM `character_data` WHERE name = '%s'", name); - auto results = QueryDatabase(query); - if (!results.Success()) - return false; +bool ZoneDatabase::NoRentExpired(const std::string& name) +{ + const uint32 seconds = CharacterDataRepository::GetSecondsSinceLastLogin(*this, name); - if (results.RowCount() != 1) - return false; - - auto& row = results.begin(); - uint32 seconds = Strings::ToInt(row[0]); - - return (seconds>1800); + return seconds > 1800; } bool ZoneDatabase::SaveCharacterInvSnapshot(uint32 character_id) { diff --git a/zone/zonedb.h b/zone/zonedb.h index 61cf4836c..bf0746c03 100644 --- a/zone/zonedb.h +++ b/zone/zonedb.h @@ -464,7 +464,7 @@ public: void SetEXPModifier(uint32 character_id, uint32 zone_id, double exp_modifier, int16 instance_version = -1); /* Character Inventory */ - bool NoRentExpired(const char* name); + bool NoRentExpired(const std::string& name); bool SaveCharacterInvSnapshot(uint32 character_id); int CountCharacterInvSnapshots(uint32 character_id); void ClearCharacterInvSnapshots(uint32 character_id, bool from_now = false);