// SPDX-FileCopyrightText: 2024 Yury Gubich <blue@macaw.me> // SPDX-License-Identifier: GPL-3.0-or-later #include "router.h" #include "module/module.h" Router::Router(): actors(), defaultGroup("Stranger") {} void Router::registerModule(const std::string& key, const std::shared_ptr<Module::Module>& 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, std::make_shared<Actor>(key, group)); else act->second->setGroup(group); } void Router::routeMessage(const std::string& sender, const std::string& body) { Actors::iterator aItr = actors.find(sender); if (aItr == actors.end()) aItr = actors.emplace(sender, std::make_shared<Actor>(sender, defaultGroup)).first; std::vector<std::string> args = Module::Module::split(body); Modules::iterator mItr = modules.find(args[0]); if (mItr == modules.end()) return; std::shared_ptr<Module::Module> module = mItr->second.lock(); if (!module) return; args.erase(args.begin()); module->message(aItr->second, args); } std::map<std::string, std::string> Router::getActors() const { std::map<std::string, std::string> result; for (const std::pair<const std::string, std::shared_ptr<Actor>>& pair : actors) result.emplace(pair.first, pair.second->getGroup()); return result; }