From bc2dc9bf07e239c79b0efb78ae4ba02fb00a7115 Mon Sep 17 00:00:00 2001 From: blue Date: Mon, 3 Mar 2025 21:36:02 +0200 Subject: [PATCH] Some more thoughts --- component/CMakeLists.txt | 2 ++ component/actor.cpp | 8 ++++++++ component/actor.h | 9 +++++++++ component/config.cpp | 12 ++++++------ component/config.h | 4 ++-- component/router.cpp | 30 ++++++++++++++++++++++++++++++ component/router.h | 28 ++++++++++++++++++++++++++++ example.config.yml | 7 ++++--- handler/message.cpp | 3 ++- handler/message.h | 8 +++++++- jay.cpp | 19 +++++++++++-------- jay.h | 6 ++---- module/CMakeLists.txt | 4 ++-- module/actor.cpp | 14 ++++++++++++++ module/{owner.h => actor.h} | 12 +++++++++--- module/module.cpp | 4 ++-- module/module.h | 8 ++++++++ module/owner.cpp | 10 ---------- 18 files changed, 146 insertions(+), 42 deletions(-) create mode 100644 component/router.cpp create mode 100644 component/router.h create mode 100644 module/actor.cpp rename module/{owner.h => actor.h} (50%) delete mode 100644 module/owner.cpp diff --git a/component/CMakeLists.txt b/component/CMakeLists.txt index fa0c995..b68f13c 100644 --- a/component/CMakeLists.txt +++ b/component/CMakeLists.txt @@ -2,12 +2,14 @@ set(SOURCES config.cpp logger.cpp actor.cpp + router.cpp ) set(HEADERS config.h logger.h actor.h + router.h ) target_sources(${EXEC_NAME} PRIVATE ${SOURCES}) diff --git a/component/actor.cpp b/component/actor.cpp index 7c21387..c03c5d3 100644 --- a/component/actor.cpp +++ b/component/actor.cpp @@ -2,3 +2,11 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "actor.h" + +Actor::Actor(const std::string& group) : + group(group) +{} + +void Actor::setGroup(const std::string& newGroup) { + group = newGroup; +} diff --git a/component/actor.h b/component/actor.h index 7f0ecd6..e733486 100644 --- a/component/actor.h +++ b/component/actor.h @@ -3,5 +3,14 @@ #pragma once +#include + class Actor { +public: + Actor(const std::string& group); + + void setGroup(const std::string& newGroup); + +private: + std::string group; }; diff --git a/component/config.cpp b/component/config.cpp index bdd7f30..c9c7f92 100644 --- a/component/config.cpp +++ b/component/config.cpp @@ -46,14 +46,14 @@ gloox::TLSPolicy Config::getTLSPolicy() const { } -std::set Config::getOwners() const { - std::set result; - YAML::Node owners = root["resource"]; - if (!owners.IsSequence()) +std::map Config::getOwners() const { + std::map result; + YAML::Node owners = root["actors"]; + if (!owners.IsMap()) return result; - for (const YAML::Node& node : owners) - result.insert(node.as()); + for (const auto& node : owners) + result.emplace(node.first.as(), node.second.as()); return result; } diff --git a/component/config.h b/component/config.h index 0c61043..e92637f 100644 --- a/component/config.h +++ b/component/config.h @@ -4,7 +4,7 @@ #pragma once #include -#include +#include #include "gloox/gloox.h" @@ -20,7 +20,7 @@ public: std::string getFullJID() const; std::string getPassword() const; std::string getResource() const; - std::set getOwners() const; + std::map getOwners() const; gloox::LogLevel getLogLevel() const; gloox::TLSPolicy getTLSPolicy() const; diff --git a/component/router.cpp b/component/router.cpp new file mode 100644 index 0000000..ea60f50 --- /dev/null +++ b/component/router.cpp @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: 2024 Yury Gubich +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "router.h" + +Router::Router(): + actors(), + defaultGroup("Stranger") +{} + +void Router::registerModule(const std::string& key, const std::shared_ptr& module) { + modules[key] = module; +} + + +void Router::registerActor(const std::string& key, const std::string& group) { + if (key == "default") { + defaultGroup = group; + return; + } + + Actors::iterator act = actors.find(key); + if (act == actors.end()) + actors.emplace(key, group); + else + act->second.setGroup(group); +} + +void Router::routeMessage(const std::string& sender, const std::string& body) { +} diff --git a/component/router.h b/component/router.h new file mode 100644 index 0000000..ff3ee92 --- /dev/null +++ b/component/router.h @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: 2024 Yury Gubich +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include +#include + +#include "actor.h" +#include "module/module.h" + +class Router { +public: + Router(); + + void registerModule(const std::string& key, 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); + +private: + typedef std::map> Modules; + typedef std::map Actors; + + Modules modules; + Actors actors; + std::string defaultGroup; +}; diff --git a/example.config.yml b/example.config.yml index f2e2ef9..12eb9aa 100644 --- a/example.config.yml +++ b/example.config.yml @@ -3,6 +3,7 @@ password: "supersecret" logLevel: debug tls: required resource: bot -owners: - - user1@xmpp.server - - user2@xmpp.server +actors: + user1@xmpp.server: Owner + user2@xmpp.server: User + default: Stranger diff --git a/handler/message.cpp b/handler/message.cpp index 0525884..f7eec78 100644 --- a/handler/message.cpp +++ b/handler/message.cpp @@ -5,7 +5,8 @@ #include -Message::Message(const std::shared_ptr& config, const std::shared_ptr& client): +Message::Message(const std::shared_ptr& config, const std::shared_ptr& client, const Callback& callback): + callback(callback), config(config), client(client) { diff --git a/handler/message.h b/handler/message.h index 2784394..60a64ed 100644 --- a/handler/message.h +++ b/handler/message.h @@ -3,7 +3,9 @@ #pragma once +#include #include +#include #include #include @@ -12,13 +14,17 @@ #include "component/config.h" class Message : public gloox::MessageHandler { +private: + typedef std::function Callback; + public: - Message(const std::shared_ptr& config, const std::shared_ptr& client); + Message(const std::shared_ptr& config, const std::shared_ptr& client, const Callback& callback); ~Message(); void handleMessage(const gloox::Message& message, gloox::MessageSession* session = 0) override; private: + Callback callback; std::weak_ptr config; std::weak_ptr client; }; diff --git a/jay.cpp b/jay.cpp index e445857..460fe6a 100644 --- a/jay.cpp +++ b/jay.cpp @@ -6,11 +6,11 @@ Jay::Jay(const std::string& configPath): runMutex(), config(std::make_shared(configPath)), + router(std::make_unique()), client(), messageHandler(), connectionHandler(), - loggers(), - actors() + loggers() {} Jay::~Jay() {} @@ -31,10 +31,16 @@ void Jay::initialize() { createClient(); if (!messageHandler) - messageHandler = std::make_unique(config, client); + messageHandler = std::make_unique( + config, + client, + std::bind(&Router::routeMessage, router.get(), std::placeholders::_1, std::placeholders::_2) + ); if (!connectionHandler) connectionHandler = std::make_unique(config, client); + + createActors(); } void Jay::createClient() { @@ -55,11 +61,8 @@ void Jay::createClient() { } void Jay::createActors() { - for (const std::string& jid : config->getOwners()) { - Actors::const_iterator act = actors.find(jid); - if (act == actors.end()) - actors.emplace(jid, std::make_unique()); - } + for (const std::pair& pair : config->getOwners()) + router->registerActor(pair.first, pair.second); } diff --git a/jay.h b/jay.h index afcd02c..ec4bc92 100644 --- a/jay.h +++ b/jay.h @@ -15,7 +15,7 @@ #include "component/logger.h" #include "component/config.h" -#include "component/actor.h" +#include "component/router.h" #include "handler/message.h" #include "handler/connection.h" @@ -35,13 +35,11 @@ private: void createActors(); private: - typedef std::map> Actors; - std::mutex runMutex; std::shared_ptr config; + std::unique_ptr router; std::shared_ptr client; std::unique_ptr messageHandler; std::unique_ptr connectionHandler; std::vector> loggers; - Actors actors; }; diff --git a/module/CMakeLists.txt b/module/CMakeLists.txt index 4d98992..ab70f89 100644 --- a/module/CMakeLists.txt +++ b/module/CMakeLists.txt @@ -1,11 +1,11 @@ set(SOURCES module.cpp - owner.cpp + actor.cpp ) set(HEADERS module.h - owner.h + actor.h ) target_sources(${EXEC_NAME} PRIVATE ${SOURCES}) diff --git a/module/actor.cpp b/module/actor.cpp new file mode 100644 index 0000000..7450e4c --- /dev/null +++ b/module/actor.cpp @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: 2024 Yury Gubich +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "actor.h" + +Module::Actor::Actor(): + Module() +{} + +Module::Actor::~Actor() noexcept {} + +void Module::Actor::message(const std::string& text) { + +} diff --git a/module/owner.h b/module/actor.h similarity index 50% rename from module/owner.h rename to module/actor.h index c6401eb..c7dca03 100644 --- a/module/owner.h +++ b/module/actor.h @@ -5,8 +5,14 @@ #include "module.h" -class Owner : public Module { +namespace Module { + +class Actor : public Module { public: - Owner(); - ~Owner() noexcept; + Actor(); + ~Actor() noexcept; + + virtual void message(const std::string & text) override; }; + +} diff --git a/module/module.cpp b/module/module.cpp index f9bb1a1..0d500db 100644 --- a/module/module.cpp +++ b/module/module.cpp @@ -3,7 +3,7 @@ #include "module.h" -Module::Module() +Module::Module::Module() {} -Module::~Module() noexcept {} +Module::Module::~Module() noexcept {} diff --git a/module/module.h b/module/module.h index 9c4e3ad..888b700 100644 --- a/module/module.h +++ b/module/module.h @@ -3,10 +3,18 @@ #pragma once +#include + +namespace Module { + class Module { protected: Module(); + virtual void message(const std::string& text) = 0; + public: virtual ~Module() noexcept; }; + +} diff --git a/module/owner.cpp b/module/owner.cpp deleted file mode 100644 index 339d082..0000000 --- a/module/owner.cpp +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-FileCopyrightText: 2024 Yury Gubich -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "owner.h" - -Owner::Owner(): - Module() -{} - -Owner::~Owner() noexcept {}