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);