From 98bfab4ba57ab9f06ba8e2bc1ce88ee009316f52 Mon Sep 17 00:00:00 2001 From: blue Date: Mon, 31 Mar 2025 13:02:45 +0300 Subject: [PATCH] A bit better module config --- component/config.cpp | 44 +++++++++++++++++++++++---------------- component/config.h | 4 +++- component/router.cpp | 5 +++-- component/router.h | 2 +- connection/connection.cpp | 4 +++- example.config.yml | 4 ++-- jay.cpp | 22 +++++++++++--------- module/actor.cpp | 4 ++-- module/actor.h | 2 +- module/module.cpp | 8 ++++--- module/module.h | 7 ++++++- module/publish.cpp | 4 ++-- module/publish.h | 2 +- 13 files changed, 67 insertions(+), 45 deletions(-) diff --git a/component/config.cpp b/component/config.cpp index 418544d..a3e06ff 100644 --- a/component/config.cpp +++ b/component/config.cpp @@ -69,28 +69,36 @@ bool Config::isValid() const { return !getBareJID().empty() && !getPassword().empty(); } -Config::Module Config::getModuleConfig(const std::string& name) const { +std::vector Config::getModules() const { + std::vector result; + YAML::Node modules = root["modules"]; - if (!modules || !modules.IsMap()) - return { false }; + if (!modules || !modules.IsSequence()) + return result; - YAML::Node conf = modules[name]; - if (!conf || !conf.IsMap()) - return { false }; + for (const YAML::Node& module : modules) { + if (!module.IsMap()) + continue; - Module result { - conf["enabled"].as(true), - conf["alias"].as(name) - }; + std::string type = module["type"].as(); + if (type.empty()) + continue; - YAML::Node prm = conf["permissions"]; - if (prm.IsMap()) { - for (const auto& node : prm) { - Shared::Strings& list = result.permissions.emplace(node.first.as(), Shared::Strings()).first->second; - YAML::Node lst = node.second; - if (lst.IsSequence()) - for (const YAML::Node& member : lst) - list.emplace_back(member.as()); + Module& conf = result.emplace_back( + module["enabled"].as(true), + type, + module["alias"].as(type) + ); + + YAML::Node prm = module["permissions"]; + if (prm.IsMap()) { + for (const auto& node : prm) { + Shared::Strings& list = conf.permissions.emplace(node.first.as(), Shared::Strings()).first->second; + YAML::Node lst = node.second; + if (lst.IsSequence()) + for (const YAML::Node& member : lst) + list.emplace_back(member.as()); + } } } diff --git a/component/config.h b/component/config.h index 86138c9..0efd1f3 100644 --- a/component/config.h +++ b/component/config.h @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -20,6 +21,7 @@ class Config { public: struct Module { bool enabled; + std::string type; std::string alias; Shared::Permissions permissions; }; @@ -36,7 +38,7 @@ public: std::map getActors() const; Shared::Logger::Level getLogLevel() const; gloox::TLSPolicy getTLSPolicy() const; - Module getModuleConfig(const std::string& name) const; + std::vector getModules() const; Shared::Responses getResponses() const; void setActors(const std::map& actors); diff --git a/component/router.cpp b/component/router.cpp index 5e265af..8069ef9 100644 --- a/component/router.cpp +++ b/component/router.cpp @@ -19,8 +19,9 @@ Router::Router(const Shared::Logger& logger): generator(std::random_device{}()) {} -void Router::registerModule(const std::string& key, const std::shared_ptr& module) { - modules[key] = module; +void Router::registerModule(const std::shared_ptr& module) { + info("Registering module " + module->name + " as " + module->alias); + modules[module->alias] = module; } void Router::registerActor(const std::string& key, const std::string& group) { diff --git a/component/router.h b/component/router.h index 583659a..0e2aa3a 100644 --- a/component/router.h +++ b/component/router.h @@ -24,7 +24,7 @@ class Router : private Shared::Loggable { public: Router(const Shared::Logger& logger); - void registerModule(const std::string& key, const std::shared_ptr& module); + void registerModule(const std::shared_ptr& module); void registerActor(const std::string& key, const std::string& group); void routeMessage(const std::string& sender, const std::string& body); diff --git a/connection/connection.cpp b/connection/connection.cpp index bbcd202..d04469b 100644 --- a/connection/connection.cpp +++ b/connection/connection.cpp @@ -99,9 +99,11 @@ std::string Connection::errorTypeToString(gloox::StanzaErrorType err) { return "Modify"; case gloox::StanzaErrorTypeWait: return "Wait"; - case gloox::StanzaErrorTypeUndefined: + case gloox::StanzaErrorTypeUndefined: return "Undefined"; } + + return "Unknown"; } void Connection::handleMessage(const gloox::Message& message, gloox::MessageSession* session) { diff --git a/example.config.yml b/example.config.yml index ba1eba9..ba46eeb 100644 --- a/example.config.yml +++ b/example.config.yml @@ -11,14 +11,14 @@ actors: default: Stranger modules: - actor: + - type: actor alias: actor enabled: true permissions: read: [Owner, User] write: [Owner] - publish: + - type: publish alias: publish enabled: true permissions: diff --git a/jay.cpp b/jay.cpp index a0b811b..476865e 100644 --- a/jay.cpp +++ b/jay.cpp @@ -11,18 +11,18 @@ static const std::map< std::function< std::shared_ptr( const std::shared_ptr&, - const Shared::Permissions& permissions + const Config::Module& conf ) > > moduleNames = { {"actor", []( const std::shared_ptr& core, - const Shared::Permissions& permissions - ) { return std::make_shared(core, permissions); }}, + const Config::Module& conf + ) { return std::make_shared(core, conf); }}, {"publish", []( const std::shared_ptr& core, - const Shared::Permissions& permissions - ) { return std::make_shared(core, permissions); }} + const Config::Module& conf + ) { return std::make_shared(core, conf); }} }; Jay::Jay(const std::string& configPath): @@ -51,13 +51,15 @@ void Jay::initialize() { } void Jay::createModules() { - for (const auto& pair : moduleNames) { - Config::Module conf = core->config.getModuleConfig(pair.first); + for (const Config::Module& conf : core->config.getModules()) { if (!conf.enabled) continue; - core->logger.log(Shared::Logger::info, "enabling module " + pair.first, {"Jay"}); - modules.emplace_back(pair.second(core, conf.permissions)); - core->router.registerModule(pair.first, modules.back()); + auto itr = moduleNames.find(conf.type); + if (itr == moduleNames.end()) + continue; + + modules.emplace_back(itr->second(core, conf)); + core->router.registerModule(modules.back()); } } diff --git a/module/actor.cpp b/module/actor.cpp index 22d3427..85f3ebd 100644 --- a/module/actor.cpp +++ b/module/actor.cpp @@ -3,8 +3,8 @@ #include "actor.h" -Module::Actor::Actor(const std::shared_ptr& core, const Shared::Permissions& permissions): - Module(core, permissions, "Actor") +Module::Actor::Actor(const std::shared_ptr& core, const Config::Module& conf): + Module(core, conf, "Actor") {} Module::Actor::~Actor() noexcept {} diff --git a/module/actor.h b/module/actor.h index fc6448b..5de3724 100644 --- a/module/actor.h +++ b/module/actor.h @@ -11,7 +11,7 @@ namespace Module { class Actor : public Module { public: - Actor(const std::shared_ptr& core, const Shared::Permissions& permissions); + Actor(const std::shared_ptr& core, const Config::Module& conf); ~Actor() noexcept; virtual Shared::Result message(const std::shared_ptr<::Actor>& actor, const Shared::Strings& args) override; diff --git a/module/module.cpp b/module/module.cpp index 6dc68ae..0503485 100644 --- a/module/module.cpp +++ b/module/module.cpp @@ -7,10 +7,12 @@ #include "gloox/message.h" -Module::Module::Module(const std::shared_ptr& core, const Shared::Permissions& permissions, const std::string& name): - Shared::Loggable(core->logger, {"Module", name}), +Module::Module::Module(const std::shared_ptr& core, const Config::Module& conf, const std::string& name): + Shared::Loggable(core->logger, {"Module", name, conf.alias}), + name(name), + alias(conf.alias), core(core), - permissions(permissions) + permissions(conf.permissions) {} bool Module::Module::hasPermission(const std::string& permission, const std::shared_ptr<::Actor>& actor) const { diff --git a/module/module.h b/module/module.h index e835b74..c05eb11 100644 --- a/module/module.h +++ b/module/module.h @@ -14,12 +14,13 @@ #include "shared/loggable.h" #include "component/core.h" #include "component/actor.h" +#include "component/config.h" namespace Module { class Module : protected Shared::Loggable { protected: - Module(const std::shared_ptr& core, const Shared::Permissions& permissions, const std::string& name); + Module(const std::shared_ptr& core, const Config::Module& conf, const std::string& name); bool hasPermission(const std::string& permission, const std::shared_ptr<::Actor>& actor) const; @@ -30,6 +31,10 @@ public: virtual Shared::Result message(const std::shared_ptr<::Actor>& actor, const Shared::Strings& args) = 0; +public: + const std::string name; + const std::string alias; + protected: std::shared_ptr core; Shared::Permissions permissions; diff --git a/module/publish.cpp b/module/publish.cpp index bb1af3d..75fcdd9 100644 --- a/module/publish.cpp +++ b/module/publish.cpp @@ -5,8 +5,8 @@ #include -Module::Publish::Publish(const std::shared_ptr& core, const Shared::Permissions& permissions): - Module(core, permissions, "Actor") +Module::Publish::Publish(const std::shared_ptr& core, const Config::Module& conf): + Module(core, conf, "Publish") {} Module::Publish::~Publish() noexcept {} diff --git a/module/publish.h b/module/publish.h index 463a393..ca75d27 100644 --- a/module/publish.h +++ b/module/publish.h @@ -13,7 +13,7 @@ namespace Module { class Publish : public Module { public: - Publish(const std::shared_ptr& core, const Shared::Permissions& permissions); + Publish(const std::shared_ptr& core, const Config::Module& conf); ~Publish() noexcept; virtual Shared::Result message(const std::shared_ptr<::Actor>& actor, const Shared::Strings& args) override;