Pre-seeding rule sets

This commit is contained in:
Chris Miles 2025-06-27 17:18:54 -05:00
parent 7d223ce6f2
commit cef1649e9c
5 changed files with 91 additions and 9 deletions

View File

@ -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<RuleValuesRepository::RuleValues> rules;
};
std::vector<RuleSet> 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<std::string> existing_rule_names;
for (const auto& r : existing_rules) {
existing_rule_names.insert(r.rule_name);
}
std::vector<RuleValuesRepository::RuleValues> 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()
);
}
}
}
}

View File

@ -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; }

View File

@ -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
},

View File

@ -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<uint8_t>(strtoul(row[0], nullptr, 10)) : 0;
e.ruleset_id = row[0] ? static_cast<int32_t>(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<uint8_t>(strtoul(row[0], nullptr, 10)) : 0;
e.ruleset_id = row[0] ? static_cast<int32_t>(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<uint8_t>(strtoul(row[0], nullptr, 10)) : 0;
e.ruleset_id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.name = row[1] ? row[1] : "";
e.zone_ids = row[2] ? row[2] : "";
e.instance_versions = row[3] ? row[3] : "";

View File

@ -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<uint8_t>(strtoul(row[0], nullptr, 10)) : 0;
e.ruleset_id = row[0] ? static_cast<int32_t>(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<uint8_t>(strtoul(row[0], nullptr, 10)) : 0;
e.ruleset_id = row[0] ? static_cast<int32_t>(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<uint8_t>(strtoul(row[0], nullptr, 10)) : 0;
e.ruleset_id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.rule_name = row[1] ? row[1] : "";
e.rule_value = row[2] ? row[2] : "";
e.notes = row[3] ? row[3] : "";