A bit better module config
This commit is contained in:
parent
647b8f3072
commit
98bfab4ba5
@ -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>());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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
22
jay.cpp
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 {}
|
||||||
|
@ -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;
|
||||||
|
@ -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 {
|
||||||
|
@ -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;
|
||||||
|
@ -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 {}
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user