more name checks and add proper soft deletes to bots

This commit is contained in:
nytmyr
2024-12-22 00:05:45 -06:00
parent 600376274f
commit 2460f78015
3 changed files with 37 additions and 21 deletions
@@ -349,14 +349,25 @@ public:
int bot_data_id int bot_data_id
) )
{ {
auto results = db.QueryDatabase( std::string query;
fmt::format(
if (RuleB(Bots, BotSoftDeletes)) {
query = fmt::format(
"UPDATE {} SET name = SUBSTRING(CONCAT(name, '-deleted-', UNIX_TIMESTAMP()), 1, 64) WHERE {} = {}",
TableName(),
PrimaryKey(),
bot_data_id
);
}
else {
query = fmt::format(
"DELETE FROM {} WHERE {} = {}", "DELETE FROM {} WHERE {} = {}",
TableName(), TableName(),
PrimaryKey(), PrimaryKey(),
bot_data_id bot_data_id
)
); );
}
auto results = db.QueryDatabase(query);
return (results.Success() ? results.RowsAffected() : 0); return (results.Success() ? results.RowsAffected() : 0);
} }
+11 -9
View File
@@ -1328,25 +1328,27 @@ bool Bot::IsValidName()
bool Bot::IsValidName(std::string& name) bool Bot::IsValidName(std::string& name)
{ {
if (name.empty() || name.length() < 4 || name.length() > 15) { if (name.empty()) { // can't be empty
return false; return false;
} }
if (!isupper(name[0])) { if (islower(name[0])) { // capitalize first letter if not
name[0] = toupper(name[0]);
}
if (!EQ::ValueWithin(name.size(), 4, 15)) { // must be between 4 and 15 characters
return false; return false;
} }
for (char c : name.substr(1)) { if (std::any_of(name.begin(), name.end(), [](char c) { return c == ' ' || c == '_'; })) { // cannot contain spaces or _
if (c == '_') {
return false; return false;
} }
if (!isalpha(c)) { if (!RuleB(Bots, AllowCamelCaseNames)) {
for (int i = 1; i < name.size(); ++i) {
if (isupper(name[i])) {
return false; return false;
} }
if (!RuleB(Bots, AllowCamelCaseNames) && !islower(c)) {
return false;
} }
} }
@@ -1450,11 +1452,11 @@ bool Bot::DeleteBot()
if (!database.botdb.DeleteBotBlockedBuffs(GetBotID())) { if (!database.botdb.DeleteBotBlockedBuffs(GetBotID())) {
return false; return false;
} }
}
if (!database.botdb.DeleteBot(GetBotID())) { if (!database.botdb.DeleteBot(GetBotID())) {
return false; return false;
} }
}
return true; return true;
} }
+5 -2
View File
@@ -186,6 +186,7 @@ bool BotDatabase::QueryNameAvailablity(const std::string& bot_name, bool& availa
if ( if (
bot_name.empty() || bot_name.empty() ||
bot_name.size() > 60 || bot_name.size() > 60 ||
!database.CheckNameFilter(bot_name) ||
database.IsNameUsed(bot_name) database.IsNameUsed(bot_name)
) { ) {
return false; return false;
@@ -246,6 +247,8 @@ bool BotDatabase::LoadBotsList(const uint32 owner_id, std::list<BotsAvailableLis
SELECT `account_id` FROM `character_data` WHERE `id` = {} SELECT `account_id` FROM `character_data` WHERE `id` = {}
) )
) )
AND
`name` NOT LIKE '%-deleted-%'
), ),
owner_id owner_id
) )
@@ -272,7 +275,7 @@ bool BotDatabase::LoadBotsList(const uint32 owner_id, std::list<BotsAvailableLis
const auto& l = BotDataRepository::GetWhere( const auto& l = BotDataRepository::GetWhere(
database, database,
fmt::format( fmt::format(
"`owner_id` = {}", "`owner_id` = {} AND `name` NOT LIKE '%-deleted-%'",
owner_id owner_id
) )
); );
@@ -319,7 +322,7 @@ bool BotDatabase::LoadBotID(const std::string& bot_name, uint32& bot_id, uint8&
const auto& l = BotDataRepository::GetWhere( const auto& l = BotDataRepository::GetWhere(
database, database,
fmt::format( fmt::format(
"`name` = '{}' LIMIT 1", "`name` = '{}' AND `name` NOT LIKE '%-deleted-%' LIMIT 1",
Strings::Escape(bot_name) Strings::Escape(bot_name)
) )
); );