A bit better module config

This commit is contained in:
Blue 2025-03-31 13:02:45 +03:00
parent 647b8f3072
commit 98bfab4ba5
Signed by: blue
GPG Key ID: 9B203B252A63EE38
13 changed files with 67 additions and 45 deletions

View File

@ -69,28 +69,36 @@ bool Config::isValid() const {
return !getBareJID().empty() && !getPassword().empty(); return !getBareJID().empty() && !getPassword().empty();
} }
Config::Module Config::getModuleConfig(const std::string& name) const { std::vector<Config::Module> Config::getModules() const {
std::vector<Module> result;
YAML::Node modules = root["modules"]; YAML::Node modules = root["modules"];
if (!modules || !modules.IsMap()) if (!modules || !modules.IsSequence())
return { false }; return result;
YAML::Node conf = modules[name]; for (const YAML::Node& module : modules) {
if (!conf || !conf.IsMap()) if (!module.IsMap())
return { false }; continue;
Module result { std::string type = module["type"].as<std::string>();
conf["enabled"].as<bool>(true), if (type.empty())
conf["alias"].as<std::string>(name) continue;
};
YAML::Node prm = conf["permissions"]; Module& conf = result.emplace_back(
if (prm.IsMap()) { module["enabled"].as<bool>(true),
for (const auto& node : prm) { type,
Shared::Strings& list = result.permissions.emplace(node.first.as<std::string>(), Shared::Strings()).first->second; module["alias"].as<std::string>(type)
YAML::Node lst = node.second; );
if (lst.IsSequence())
for (const YAML::Node& member : lst) YAML::Node prm = module["permissions"];
list.emplace_back(member.as<std::string>()); if (prm.IsMap()) {
for (const auto& node : prm) {
Shared::Strings& list = conf.permissions.emplace(node.first.as<std::string>(), Shared::Strings()).first->second;
YAML::Node lst = node.second;
if (lst.IsSequence())
for (const YAML::Node& member : lst)
list.emplace_back(member.as<std::string>());
}
} }
} }

View File

@ -5,6 +5,7 @@
#include <string> #include <string>
#include <map> #include <map>
#include <vector>
#include <fstream> #include <fstream>
#include <filesystem> #include <filesystem>
@ -20,6 +21,7 @@ class Config {
public: public:
struct Module { struct Module {
bool enabled; bool enabled;
std::string type;
std::string alias; std::string alias;
Shared::Permissions permissions; Shared::Permissions permissions;
}; };
@ -36,7 +38,7 @@ public:
std::map<std::string, std::string> getActors() const; std::map<std::string, std::string> getActors() const;
Shared::Logger::Level getLogLevel() const; Shared::Logger::Level getLogLevel() const;
gloox::TLSPolicy getTLSPolicy() const; gloox::TLSPolicy getTLSPolicy() const;
Module getModuleConfig(const std::string& name) const; std::vector<Module> getModules() const;
Shared::Responses getResponses() const; Shared::Responses getResponses() const;
void setActors(const std::map<std::string, std::string>& actors); void setActors(const std::map<std::string, std::string>& actors);

View File

@ -19,8 +19,9 @@ Router::Router(const Shared::Logger& logger):
generator(std::random_device{}()) generator(std::random_device{}())
{} {}
void Router::registerModule(const std::string& key, const std::shared_ptr<Module::Module>& module) { void Router::registerModule(const std::shared_ptr<Module::Module>& module) {
modules[key] = module; info("Registering module " + module->name + " as " + module->alias);
modules[module->alias] = module;
} }
void Router::registerActor(const std::string& key, const std::string& group) { void Router::registerActor(const std::string& key, const std::string& group) {

View File

@ -24,7 +24,7 @@ class Router : private Shared::Loggable {
public: public:
Router(const Shared::Logger& logger); Router(const Shared::Logger& logger);
void registerModule(const std::string& key, const std::shared_ptr<Module::Module>& module); void registerModule(const std::shared_ptr<Module::Module>& module);
void registerActor(const std::string& key, const std::string& group); void registerActor(const std::string& key, const std::string& group);
void routeMessage(const std::string& sender, const std::string& body); void routeMessage(const std::string& sender, const std::string& body);

View File

@ -99,9 +99,11 @@ std::string Connection::errorTypeToString(gloox::StanzaErrorType err) {
return "Modify"; return "Modify";
case gloox::StanzaErrorTypeWait: case gloox::StanzaErrorTypeWait:
return "Wait"; return "Wait";
case gloox::StanzaErrorTypeUndefined: case gloox::StanzaErrorTypeUndefined:
return "Undefined"; return "Undefined";
} }
return "Unknown";
} }
void Connection::handleMessage(const gloox::Message& message, gloox::MessageSession* session) { void Connection::handleMessage(const gloox::Message& message, gloox::MessageSession* session) {

View File

@ -11,14 +11,14 @@ actors:
default: Stranger default: Stranger
modules: modules:
actor: - type: actor
alias: actor alias: actor
enabled: true enabled: true
permissions: permissions:
read: [Owner, User] read: [Owner, User]
write: [Owner] write: [Owner]
publish: - type: publish
alias: publish alias: publish
enabled: true enabled: true
permissions: permissions:

22
jay.cpp
View File

@ -11,18 +11,18 @@ static const std::map<
std::function< std::function<
std::shared_ptr<Module::Module>( std::shared_ptr<Module::Module>(
const std::shared_ptr<Core>&, const std::shared_ptr<Core>&,
const Shared::Permissions& permissions const Config::Module& conf
) )
> >
> moduleNames = { > moduleNames = {
{"actor", []( {"actor", [](
const std::shared_ptr<Core>& core, const std::shared_ptr<Core>& core,
const Shared::Permissions& permissions const Config::Module& conf
) { return std::make_shared<Module::Actor>(core, permissions); }}, ) { return std::make_shared<Module::Actor>(core, conf); }},
{"publish", []( {"publish", [](
const std::shared_ptr<Core>& core, const std::shared_ptr<Core>& core,
const Shared::Permissions& permissions const Config::Module& conf
) { return std::make_shared<Module::Publish>(core, permissions); }} ) { return std::make_shared<Module::Publish>(core, conf); }}
}; };
Jay::Jay(const std::string& configPath): Jay::Jay(const std::string& configPath):
@ -51,13 +51,15 @@ void Jay::initialize() {
} }
void Jay::createModules() { void Jay::createModules() {
for (const auto& pair : moduleNames) { for (const Config::Module& conf : core->config.getModules()) {
Config::Module conf = core->config.getModuleConfig(pair.first);
if (!conf.enabled) if (!conf.enabled)
continue; continue;
core->logger.log(Shared::Logger::info, "enabling module " + pair.first, {"Jay"}); auto itr = moduleNames.find(conf.type);
modules.emplace_back(pair.second(core, conf.permissions)); if (itr == moduleNames.end())
core->router.registerModule(pair.first, modules.back()); continue;
modules.emplace_back(itr->second(core, conf));
core->router.registerModule(modules.back());
} }
} }

View File

@ -3,8 +3,8 @@
#include "actor.h" #include "actor.h"
Module::Actor::Actor(const std::shared_ptr<Core>& core, const Shared::Permissions& permissions): Module::Actor::Actor(const std::shared_ptr<Core>& core, const Config::Module& conf):
Module(core, permissions, "Actor") Module(core, conf, "Actor")
{} {}
Module::Actor::~Actor() noexcept {} Module::Actor::~Actor() noexcept {}

View File

@ -11,7 +11,7 @@ namespace Module {
class Actor : public Module { class Actor : public Module {
public: public:
Actor(const std::shared_ptr<Core>& core, const Shared::Permissions& permissions); Actor(const std::shared_ptr<Core>& core, const Config::Module& conf);
~Actor() noexcept; ~Actor() noexcept;
virtual Shared::Result message(const std::shared_ptr<::Actor>& actor, const Shared::Strings& args) override; virtual Shared::Result message(const std::shared_ptr<::Actor>& actor, const Shared::Strings& args) override;

View File

@ -7,10 +7,12 @@
#include "gloox/message.h" #include "gloox/message.h"
Module::Module::Module(const std::shared_ptr<Core>& core, const Shared::Permissions& permissions, const std::string& name): Module::Module::Module(const std::shared_ptr<Core>& core, const Config::Module& conf, const std::string& name):
Shared::Loggable(core->logger, {"Module", name}), Shared::Loggable(core->logger, {"Module", name, conf.alias}),
name(name),
alias(conf.alias),
core(core), core(core),
permissions(permissions) permissions(conf.permissions)
{} {}
bool Module::Module::hasPermission(const std::string& permission, const std::shared_ptr<::Actor>& actor) const { bool Module::Module::hasPermission(const std::string& permission, const std::shared_ptr<::Actor>& actor) const {

View File

@ -14,12 +14,13 @@
#include "shared/loggable.h" #include "shared/loggable.h"
#include "component/core.h" #include "component/core.h"
#include "component/actor.h" #include "component/actor.h"
#include "component/config.h"
namespace Module { namespace Module {
class Module : protected Shared::Loggable { class Module : protected Shared::Loggable {
protected: protected:
Module(const std::shared_ptr<Core>& core, const Shared::Permissions& permissions, const std::string& name); Module(const std::shared_ptr<Core>& core, const Config::Module& conf, const std::string& name);
bool hasPermission(const std::string& permission, const std::shared_ptr<::Actor>& actor) const; 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; 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: protected:
std::shared_ptr<Core> core; std::shared_ptr<Core> core;
Shared::Permissions permissions; Shared::Permissions permissions;

View File

@ -5,8 +5,8 @@
#include <exception> #include <exception>
Module::Publish::Publish(const std::shared_ptr<Core>& core, const Shared::Permissions& permissions): Module::Publish::Publish(const std::shared_ptr<Core>& core, const Config::Module& conf):
Module(core, permissions, "Actor") Module(core, conf, "Publish")
{} {}
Module::Publish::~Publish() noexcept {} Module::Publish::~Publish() noexcept {}

View File

@ -13,7 +13,7 @@ namespace Module {
class Publish : public Module { class Publish : public Module {
public: public:
Publish(const std::shared_ptr<Core>& core, const Shared::Permissions& permissions); Publish(const std::shared_ptr<Core>& core, const Config::Module& conf);
~Publish() noexcept; ~Publish() noexcept;
virtual Shared::Result message(const std::shared_ptr<::Actor>& actor, const Shared::Strings& args) override; virtual Shared::Result message(const std::shared_ptr<::Actor>& actor, const Shared::Strings& args) override;