From cef1649e9c78c6f68b39ba0ce90c1fa7656b42b4 Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Fri, 27 Jun 2025 17:18:54 -0500 Subject: [PATCH] Pre-seeding rule sets --- common/content/world_content_service.cpp | 79 ++++++++++++++++++- common/content/world_content_service.h | 1 + common/database/database_update_manifest.cpp | 4 + .../base/base_rule_sets_repository.h | 8 +- .../base/base_rule_values_repository.h | 8 +- 5 files changed, 91 insertions(+), 9 deletions(-) diff --git a/common/content/world_content_service.cpp b/common/content/world_content_service.cpp index 2b1a0f807..06d0f9ac0 100644 --- a/common/content/world_content_service.cpp +++ b/common/content/world_content_service.cpp @@ -320,7 +320,81 @@ bool WorldContentService::DoesZonePassContentFiltering(const ZoneRepository::Zon return DoesPassContentFiltering(f); } +void WorldContentService::SeedDefaultRulesets() +{ + LogInfo("Seeding default rulesets"); + // uint8_t ruleset_id; + // std::string name; + // std::string zone_ids; + // std::string instance_versions; + // std::string content_flags; + // std::string content_flags_disabled; + // int8_t min_expansion; + // int8_t max_expansion; + // std::string notes; + + struct RuleSet { + RuleSetsRepository::RuleSets rule_set; + std::vector rules; + }; + + std::vector rulesets = { + { + .rule_set = { + .ruleset_id = 100, + .name = "Double Experience", + }, + .rules = { + {.rule_name = "Character:FinalExpMultiplier", .rule_value = "2" }, + } + }, + { + .rule_set = { + .ruleset_id = 1000, + .name = "Custom Boundary (Put your custom rulesets after here)", + .notes = "You may add your own rulesets above 1000+" + }, + } + }; + + for (const auto& entry : rulesets) { + auto existing_sets = RuleSetsRepository::GetWhere( + *m_database, + fmt::format("ruleset_id = {}", entry.rule_set.ruleset_id) + ); + + if (existing_sets.empty()) { + RuleSetsRepository::InsertOne(*m_database, entry.rule_set); + LogInfo("Inserted ruleset [{}] - {}", entry.rule_set.ruleset_id, entry.rule_set.name); + } + + if (!entry.rules.empty()) { + auto existing_rules = RuleValuesRepository::GetWhere( + *m_database, + fmt::format("ruleset_id = {}", entry.rule_set.ruleset_id) + ); + + std::unordered_set existing_rule_names; + for (const auto& r : existing_rules) { + existing_rule_names.insert(r.rule_name); + } + + std::vector new_rules; + for (auto r : entry.rules) { + if (existing_rule_names.count(r.rule_name)) { + continue; + } + new_rules.push_back(r); + } + + if (!new_rules.empty()) { + RuleValuesRepository::InsertMany(*m_database, new_rules); + LogInfo("Inserted [{}] rules into ruleset [{}]", new_rules.size(), entry.rule_set.ruleset_id); + } + } + } +} void WorldContentService::LoadTargetedRulesets() { @@ -329,6 +403,8 @@ void WorldContentService::LoadTargetedRulesets() return; } + SeedDefaultRulesets(); + LogInfo("Zone ID [{}] Instance Version [{}] - Loading targeted rulesets", m_zone_id, m_instance_version); constexpr int8 EXPANSION_ZERO_VALUE = -2; @@ -384,4 +460,5 @@ void WorldContentService::LoadTargetedRulesets() ); } } -} \ No newline at end of file +} + diff --git a/common/content/world_content_service.h b/common/content/world_content_service.h index 2ba58a4a9..f089a66b4 100644 --- a/common/content/world_content_service.h +++ b/common/content/world_content_service.h @@ -194,6 +194,7 @@ public: bool IsInPublicStaticInstance(uint32 instance_id); // targeted rulesets + void SeedDefaultRulesets(); void LoadTargetedRulesets(); inline void SetZoneId(int zone_id) { m_zone_id = zone_id; } inline void SetInstanceVersion(int instance_version) { m_instance_version = instance_version; } diff --git a/common/database/database_update_manifest.cpp b/common/database/database_update_manifest.cpp index 37c1925ea..2b5d80e40 100644 --- a/common/database/database_update_manifest.cpp +++ b/common/database/database_update_manifest.cpp @@ -7151,6 +7151,10 @@ ALTER TABLE `rule_sets` ADD COLUMN `min_expansion` TINYINT NOT NULL DEFAULT -2, ADD COLUMN `max_expansion` TINYINT NOT NULL DEFAULT -2, ADD COLUMN `notes` VARCHAR(255) NOT NULL DEFAULT ''; +ALTER TABLE `rule_sets` + CHANGE `ruleset_id` `ruleset_id` int NOT NULL auto_increment; +ALTER TABLE `rule_values` + CHANGE `ruleset_id` `ruleset_id` int NOT NULL DEFAULT 0; )", .content_schema_update = false }, diff --git a/common/repositories/base/base_rule_sets_repository.h b/common/repositories/base/base_rule_sets_repository.h index 128ec89c8..cd956ffee 100644 --- a/common/repositories/base/base_rule_sets_repository.h +++ b/common/repositories/base/base_rule_sets_repository.h @@ -19,7 +19,7 @@ class BaseRuleSetsRepository { public: struct RuleSets { - uint8_t ruleset_id; + int32_t ruleset_id; std::string name; std::string zone_ids; std::string instance_versions; @@ -147,7 +147,7 @@ public: if (results.RowCount() == 1) { RuleSets e{}; - e.ruleset_id = row[0] ? static_cast(strtoul(row[0], nullptr, 10)) : 0; + e.ruleset_id = row[0] ? static_cast(atoi(row[0])) : 0; e.name = row[1] ? row[1] : ""; e.zone_ids = row[2] ? row[2] : ""; e.instance_versions = row[3] ? row[3] : ""; @@ -298,7 +298,7 @@ public: for (auto row = results.begin(); row != results.end(); ++row) { RuleSets e{}; - e.ruleset_id = row[0] ? static_cast(strtoul(row[0], nullptr, 10)) : 0; + e.ruleset_id = row[0] ? static_cast(atoi(row[0])) : 0; e.name = row[1] ? row[1] : ""; e.zone_ids = row[2] ? row[2] : ""; e.instance_versions = row[3] ? row[3] : ""; @@ -331,7 +331,7 @@ public: for (auto row = results.begin(); row != results.end(); ++row) { RuleSets e{}; - e.ruleset_id = row[0] ? static_cast(strtoul(row[0], nullptr, 10)) : 0; + e.ruleset_id = row[0] ? static_cast(atoi(row[0])) : 0; e.name = row[1] ? row[1] : ""; e.zone_ids = row[2] ? row[2] : ""; e.instance_versions = row[3] ? row[3] : ""; diff --git a/common/repositories/base/base_rule_values_repository.h b/common/repositories/base/base_rule_values_repository.h index 6486e2b86..a1920eb05 100644 --- a/common/repositories/base/base_rule_values_repository.h +++ b/common/repositories/base/base_rule_values_repository.h @@ -19,7 +19,7 @@ class BaseRuleValuesRepository { public: struct RuleValues { - uint8_t ruleset_id; + int32_t ruleset_id; std::string rule_name; std::string rule_value; std::string notes; @@ -127,7 +127,7 @@ public: if (results.RowCount() == 1) { RuleValues e{}; - e.ruleset_id = row[0] ? static_cast(strtoul(row[0], nullptr, 10)) : 0; + e.ruleset_id = row[0] ? static_cast(atoi(row[0])) : 0; e.rule_name = row[1] ? row[1] : ""; e.rule_value = row[2] ? row[2] : ""; e.notes = row[3] ? row[3] : ""; @@ -259,7 +259,7 @@ public: for (auto row = results.begin(); row != results.end(); ++row) { RuleValues e{}; - e.ruleset_id = row[0] ? static_cast(strtoul(row[0], nullptr, 10)) : 0; + e.ruleset_id = row[0] ? static_cast(atoi(row[0])) : 0; e.rule_name = row[1] ? row[1] : ""; e.rule_value = row[2] ? row[2] : ""; e.notes = row[3] ? row[3] : ""; @@ -287,7 +287,7 @@ public: for (auto row = results.begin(); row != results.end(); ++row) { RuleValues e{}; - e.ruleset_id = row[0] ? static_cast(strtoul(row[0], nullptr, 10)) : 0; + e.ruleset_id = row[0] ? static_cast(atoi(row[0])) : 0; e.rule_name = row[1] ? row[1] : ""; e.rule_value = row[2] ? row[2] : ""; e.notes = row[3] ? row[3] : "";