From dc48c45421c047bacaf7451490e6a3308d389df4 Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Tue, 2 Apr 2024 02:12:08 -0400 Subject: [PATCH] [Bug Fix] Fix Bot Creation Issue (#4235) # Notes - Creating bots was failing because were checking for `false` on `Database::CheckUsedName()` in `BotDatabase::QueryNameAvailability`. - `Database::CheckUsedName()` is now `Database::IsNameUsed()` and checks for both bots and character name usages. - We were checking for `false` which was always happening when there were no entries for the supplied name, meaning we were never allowed to create a bot. --- common/database.cpp | 23 ++++++++++++++++++++--- common/database.h | 2 +- zone/bot_database.cpp | 26 +------------------------- zone/client.cpp | 4 ++-- zone/client_packet.cpp | 4 ++-- zone/merc.cpp | 2 +- 6 files changed, 27 insertions(+), 34 deletions(-) diff --git a/common/database.cpp b/common/database.cpp index f9fd971bf..9619628b8 100644 --- a/common/database.cpp +++ b/common/database.cpp @@ -74,6 +74,7 @@ #include "repositories/zone_repository.h" #include "zone_store.h" #include "repositories/merchantlist_temp_repository.h" +#include "repositories/bot_data_repository.h" extern Client client; @@ -915,15 +916,31 @@ bool Database::UpdateName(const std::string& old_name, const std::string& new_na return CharacterDataRepository::UpdateOne(*this, e); } -bool Database::CheckUsedName(const std::string& name) +bool Database::IsNameUsed(const std::string& name) { - return !CharacterDataRepository::GetWhere( + if (RuleB(Bots, Enabled)) { + const auto& bot_data = BotDataRepository::GetWhere( + *this, + fmt::format( + "`name` = '{}'", + Strings::Escape(name) + ) + ); + + if (!bot_data.empty()) { + return true; + } + } + + const auto& character_data = CharacterDataRepository::GetWhere( *this, fmt::format( "`name` = '{}'", Strings::Escape(name) ) - ).empty(); + ); + + return !character_data.empty(); } uint32 Database::GetServerType() diff --git a/common/database.h b/common/database.h index 44406e8e9..bc43ac1ba 100644 --- a/common/database.h +++ b/common/database.h @@ -115,7 +115,7 @@ public: bool CheckBannedIPs(const std::string& login_ip); //Check incoming connection against banned IP table. bool CheckGMIPs(const std::string& login_ip, uint32 account_id); bool CheckNameFilter(const std::string& name, bool surname = false); - bool CheckUsedName(const std::string& name); + bool IsNameUsed(const std::string& name); uint32 GetAccountIDByChar(const std::string& name, uint32* character_id = 0); uint32 GetAccountIDByChar(uint32 character_id); diff --git a/zone/bot_database.cpp b/zone/bot_database.cpp index 2090c8100..29c669fbb 100644 --- a/zone/bot_database.cpp +++ b/zone/bot_database.cpp @@ -184,35 +184,11 @@ bool BotDatabase::QueryNameAvailablity(const std::string& bot_name, bool& availa if ( bot_name.empty() || bot_name.size() > 60 || - !database.CheckUsedName(bot_name) + database.IsNameUsed(bot_name) ) { return false; } - const auto& bot_data = BotDataRepository::GetWhere( - database, - fmt::format( - "`name` LIKE '{}' LIMIT 1", - bot_name - ) - ); - - if (!bot_data.empty()) { - return false; - } - - const auto& character_data = CharacterDataRepository::GetWhere( - database, - fmt::format( - "`name` LIKE '{}' LIMIT 1", - bot_name - ) - ); - - if (!character_data.empty()) { - return false; - } - available_flag = true; return true; diff --git a/zone/client.cpp b/zone/client.cpp index 1734c5799..cd0bd3fd6 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -2228,8 +2228,8 @@ void Client::ChangeLastName(std::string last_name) { bool Client::ChangeFirstName(const char* in_firstname, const char* gmname) { // check duplicate name - bool usedname = database.CheckUsedName((const char*) in_firstname); - if (!usedname) { + bool used_name = database.IsNameUsed((const char*) in_firstname); + if (used_name) { return false; } diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index e9da4fa12..c40977429 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -6875,7 +6875,7 @@ void Client::Handle_OP_GMNameChange(const EQApplicationPacket *app) Client *c = entity_list.GetClientByName(gmn->oldname); LogInfo("GM([{}]) changeing players name. Old:[{}] New:[{}]", GetName(), gmn->oldname, gmn->newname); - const bool used_name = database.CheckUsedName(gmn->newname); + const bool used_name = database.IsNameUsed(gmn->newname); if (!c) { Message(Chat::Red, fmt::format("{} not found for name change. Operation failed!", gmn->oldname).c_str()); return; @@ -6886,7 +6886,7 @@ void Client::Handle_OP_GMNameChange(const EQApplicationPacket *app) return; } - if (!used_name) { + if (used_name) { Message(Chat::Red, fmt::format("{} is already in use. Operation failed!", gmn->newname).c_str()); return; } diff --git a/zone/merc.cpp b/zone/merc.cpp index 76862645a..c1dcecb0b 100644 --- a/zone/merc.cpp +++ b/zone/merc.cpp @@ -4203,7 +4203,7 @@ const char* Merc::GetRandomName(){ //name must begin with an upper-case letter. valid = false; } - else if (database.CheckUsedName(rndname)) { + else if (!database.IsNameUsed(rndname)) { valid = true; } else {