Mercurial > irccd
changeset 209:f8612b08aa81
Irccd: get rid of server-event.(cpp|hpp)
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 21 Jun 2016 21:56:04 +0200 |
parents | b9c3a58d193b |
children | 2d10d7e661a0 |
files | lib/irccd/CMakeSources.cmake lib/irccd/server-event.cpp lib/irccd/server-event.hpp lib/irccd/service-server.cpp |
diffstat | 4 files changed, 145 insertions(+), 258 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/irccd/CMakeSources.cmake Tue Jun 21 21:23:28 2016 +0200 +++ b/lib/irccd/CMakeSources.cmake Tue Jun 21 21:56:04 2016 +0200 @@ -56,7 +56,6 @@ ${CMAKE_CURRENT_LIST_DIR}/plugin-js.hpp ${CMAKE_CURRENT_LIST_DIR}/rule.hpp ${CMAKE_CURRENT_LIST_DIR}/server.hpp - ${CMAKE_CURRENT_LIST_DIR}/server-event.hpp ${CMAKE_CURRENT_LIST_DIR}/server-private.hpp ${CMAKE_CURRENT_LIST_DIR}/server-state.hpp ${CMAKE_CURRENT_LIST_DIR}/server-state-connected.hpp @@ -133,7 +132,6 @@ ${CMAKE_CURRENT_LIST_DIR}/plugin-js.cpp ${CMAKE_CURRENT_LIST_DIR}/rule.cpp ${CMAKE_CURRENT_LIST_DIR}/server.cpp - ${CMAKE_CURRENT_LIST_DIR}/server-event.cpp ${CMAKE_CURRENT_LIST_DIR}/server-state-connected.cpp ${CMAKE_CURRENT_LIST_DIR}/server-state-connecting.cpp ${CMAKE_CURRENT_LIST_DIR}/server-state-disconnected.cpp
--- a/lib/irccd/server-event.cpp Tue Jun 21 21:23:28 2016 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/* - * server-event.cpp -- server event - * - * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include "irccd.hpp" -#include "logger.hpp" -#include "plugin-js.hpp" -#include "server-event.hpp" -#include "service-plugin.hpp" -#include "service-rule.hpp" - -namespace irccd { - -ServerEvent::ServerEvent(std::string server, - std::string origin, - std::string target, - std::function<std::string (Plugin &)> functionName, - std::function<void (Plugin &)> exec) - : m_server(std::move(server)) - , m_origin(std::move(origin)) - , m_target(std::move(target)) - , m_functionName(std::move(functionName)) - , m_exec(std::move(exec)) -{ -} - -void ServerEvent::operator()(Irccd &irccd) const -{ - for (auto &plugin : irccd.pluginService().plugins()) { - auto eventname = m_functionName(*plugin); - auto allowed = irccd.ruleService().solve(m_server, m_target, m_origin, plugin->name(), eventname); - - if (!allowed) { - log::debug() << "rule: event skipped on match" << std::endl; - continue; - } else - log::debug() << "rule: event allowed" << std::endl; - - // TODO: server-event must not know which type of plugin. - // TODO: get generic error. - try { - m_exec(*plugin); - } catch (const Exception &info) { - log::warning() << "plugin " << plugin->name() << ": error: " << info.what() << std::endl; - - if (!info.fileName.empty()) - log::warning() << " " << info.fileName << ":" << info.lineNumber << std::endl; - if (!info.stack.empty()) - log::warning() << " " << info.stack << std::endl; - } - } -} - -} // !irccd
--- a/lib/irccd/server-event.hpp Tue Jun 21 21:23:28 2016 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -/* - * server-event.hpp -- server event - * - * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef IRCCD_SERVER_EVENT_HPP -#define IRCCD_SERVER_EVENT_HPP - -/** - * \file server-event.hpp - * \brief IRC events. - */ - -#include <functional> -#include <string> - -#include <sysconfig.hpp> - -#if defined(WITH_JS) - -namespace irccd { - -class Irccd; -class Plugin; - -/** - * \brief Dispatch IRC event to plugins. - * - * This event will iterate all plugins and check if no rules blocks this event, otherwise the plugin function - * will be called. - */ -class ServerEvent { -private: - std::string m_server; - std::string m_origin; - std::string m_target; - std::function<std::string (Plugin &)> m_functionName; - std::function<void (Plugin &)> m_exec; - -public: - /** - * Constructor. - * - * \param server the server name - * \param origin the origin - * \param target the target (channel or nickname) - * \param functionName the function to call (only for rules) - * \param exec the plugin executor - */ - IRCCD_EXPORT ServerEvent(std::string server, - std::string origin, - std::string target, - std::function<std::string (Plugin &)> functionName, - std::function<void (Plugin &)> exec); - - /** - * Execute the event. - * - * \param irccd the irccd instance - */ - IRCCD_EXPORT void operator()(Irccd &irccd) const; -}; - -} // !irccd - -#endif // !WITH_JS - -#endif // !IRCCD_SERVER_EVENT_HPP
--- a/lib/irccd/service-server.cpp Tue Jun 21 21:23:28 2016 +0200 +++ b/lib/irccd/service-server.cpp Tue Jun 21 21:56:04 2016 +0200 @@ -25,7 +25,8 @@ #include "logger.hpp" #include "plugin.hpp" #include "server.hpp" -#include "server-event.hpp" +#include "service-plugin.hpp" +#include "service-rule.hpp" #include "service-server.hpp" #include "service-transport.hpp" #include "util.hpp" @@ -34,6 +35,44 @@ namespace irccd { +class EventHandler { +public: + std::string server; + std::string origin; + std::string target; + std::function<std::string (Plugin &)> functionName; + std::function<void (Plugin &)> functionExec; + + void operator()(Irccd &irccd) const + { + for (auto &plugin : irccd.pluginService().plugins()) { + auto eventname = functionName(*plugin); + auto allowed = irccd.ruleService().solve(server, target, origin, plugin->name(), eventname); + + if (!allowed) { + log::debug() << "rule: event skipped on match" << std::endl; + continue; + } else + log::debug() << "rule: event allowed" << std::endl; + + // TODO: server-event must not know which type of plugin. + // TODO: get generic error. + try { + functionExec(*plugin); + } catch (const Exception &info) { + log::warning() << "plugin " << plugin->name() << ": error: " << info.what() << std::endl; + + if (!info.fileName.empty()) + log::warning() << " " << info.fileName << ":" << info.lineNumber << std::endl; + if (!info.stack.empty()) + log::warning() << " " << info.stack << std::endl; + } catch (const std::exception &ex) { + log::warning() << "plugin " << plugin->name() << ": error: " << ex.what() << std::endl; + } + } + } +}; + void ServerService::handleChannelMode(std::weak_ptr<Server> ptr, std::string origin, std::string channel, std::string mode, std::string arg) { std::shared_ptr<Server> server = ptr.lock(); @@ -48,23 +87,22 @@ log::debug() << " argument: " << arg << std::endl; m_irccd.transportService().broadcast(json::object({ - { "event", "onChannelMode" }, - { "server", server->name() }, - { "origin", origin }, - { "channel", channel }, - { "mode", mode }, - { "argument", arg } + { "event", "onChannelMode" }, + { "server", server->name() }, + { "origin", origin }, + { "channel", channel }, + { "mode", mode }, + { "argument", arg } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), origin, channel, + m_irccd.post(EventHandler{server->name(), origin, channel, [=] (Plugin &) -> std::string { return "onChannelMode"; }, [=] (Plugin &plugin) { - plugin.onChannelMode(m_irccd, std::move(server), std::move(origin), std::move(channel), std::move(mode), - std::move(arg)); + plugin.onChannelMode(m_irccd, std::move(server), std::move(origin), std::move(channel), std::move(mode), std::move(arg)); } - )); + }); } void ServerService::handleChannelNotice(std::weak_ptr<Server> ptr, std::string origin, std::string channel, std::string message) @@ -80,21 +118,21 @@ log::debug() << " message: " << message << std::endl; m_irccd.transportService().broadcast(json::object({ - { "event", "onChannelNotice" }, - { "server", server->name() }, - { "origin", origin }, - { "channel", channel }, - { "message", message } + { "event", "onChannelNotice" }, + { "server", server->name() }, + { "origin", origin }, + { "channel", channel }, + { "message", message } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), origin, channel, + m_irccd.post(EventHandler{server->name(), origin, channel, [=] (Plugin &) -> std::string { return "onChannelNotice"; }, [=] (Plugin &plugin) { plugin.onChannelNotice(m_irccd, std::move(server), std::move(origin), std::move(channel), std::move(message)); } - )); + }); } void ServerService::handleConnect(std::weak_ptr<Server> ptr) @@ -107,18 +145,18 @@ log::debug() << "server " << server->name() << ": event onConnect" << std::endl; m_irccd.transportService().broadcast(json::object({ - { "event", "onConnect" }, - { "server", server->name() } + { "event", "onConnect" }, + { "server", server->name() } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), /* origin */ "", /* channel */ "", + m_irccd.post(EventHandler{server->name(), /* origin */ "", /* channel */ "", [=] (Plugin &) -> std::string { return "onConnect"; }, [=] (Plugin &plugin) { plugin.onConnect(m_irccd, std::move(server)); } - )); + }); } void ServerService::handleInvite(std::weak_ptr<Server> ptr, std::string origin, std::string channel, std::string target) @@ -134,20 +172,20 @@ log::debug() << " target: " << target << std::endl; m_irccd.transportService().broadcast(json::object({ - { "event", "onInvite" }, - { "server", server->name() }, - { "origin", origin }, - { "channel", channel } + { "event", "onInvite" }, + { "server", server->name() }, + { "origin", origin }, + { "channel", channel } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), origin, channel, + m_irccd.post(EventHandler{server->name(), origin, channel, [=] (Plugin &) -> std::string { return "onInvite"; }, [=] (Plugin &plugin) { plugin.onInvite(m_irccd, std::move(server), std::move(origin), std::move(channel)); } - )); + }); } void ServerService::handleJoin(std::weak_ptr<Server> ptr, std::string origin, std::string channel) @@ -162,20 +200,20 @@ log::debug() << " channel: " << channel << std::endl; m_irccd.transportService().broadcast(json::object({ - { "event", "onJoin" }, - { "server", server->name() }, - { "origin", origin }, - { "channel", channel } + { "event", "onJoin" }, + { "server", server->name() }, + { "origin", origin }, + { "channel", channel } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), origin, channel, + m_irccd.post(EventHandler{server->name(), origin, channel, [=] (Plugin &) -> std::string { return "onJoin"; }, [=] (Plugin &plugin) { plugin.onJoin(m_irccd, std::move(server), std::move(origin), std::move(channel)); } - )); + }); } void ServerService::handleKick(std::weak_ptr<Server> ptr, std::string origin, std::string channel, std::string target, std::string reason) @@ -192,22 +230,22 @@ log::debug() << " reason: " << reason << std::endl; m_irccd.transportService().broadcast(json::object({ - { "event", "onKick" }, - { "server", server->name() }, - { "origin", origin }, - { "channel", channel }, - { "target", target }, - { "reason", reason } + { "event", "onKick" }, + { "server", server->name() }, + { "origin", origin }, + { "channel", channel }, + { "target", target }, + { "reason", reason } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), origin, channel, + m_irccd.post(EventHandler{server->name(), origin, channel, [=] (Plugin &) -> std::string { return "onKick"; }, [=] (Plugin &plugin) { plugin.onKick(m_irccd, std::move(server), std::move(origin), std::move(channel), std::move(target), std::move(reason)); } - )); + }); } void ServerService::handleMessage(std::weak_ptr<Server> ptr, std::string origin, std::string channel, std::string message) @@ -223,14 +261,14 @@ log::debug() << " message: " << message << std::endl; m_irccd.transportService().broadcast(json::object({ - { "event", "onMessage" }, - { "server", server->name() }, - { "origin", origin }, - { "channel", channel }, - { "message", message } + { "event", "onMessage" }, + { "server", server->name() }, + { "origin", origin }, + { "channel", channel }, + { "message", message } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), origin, channel, + m_irccd.post(EventHandler{server->name(), origin, channel, [=] (Plugin &plugin) -> std::string { return util::parseMessage(message, server->settings().command, plugin.name()).second == util::MessageType::Command ? "onCommand" : "onMessage"; }, @@ -242,7 +280,7 @@ else plugin.onMessage(m_irccd, std::move(server), std::move(origin), std::move(channel), std::move(pack.first)); } - )); + }); } void ServerService::handleMe(std::weak_ptr<Server> ptr, std::string origin, std::string target, std::string message) @@ -258,21 +296,21 @@ log::debug() << " message: " << message << std::endl; m_irccd.transportService().broadcast(json::object({ - { "event", "onMe" }, - { "server", server->name() }, - { "origin", origin }, - { "target", target }, - { "message", message } + { "event", "onMe" }, + { "server", server->name() }, + { "origin", origin }, + { "target", target }, + { "message", message } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), origin, target, + m_irccd.post(EventHandler{server->name(), origin, target, [=] (Plugin &) -> std::string { return "onMe"; }, [=] (Plugin &plugin) { plugin.onMe(m_irccd, std::move(server), std::move(origin), std::move(target), std::move(message)); } - )); + }); } void ServerService::handleMode(std::weak_ptr<Server> ptr, std::string origin, std::string mode) @@ -287,20 +325,20 @@ log::debug() << " mode: " << mode << std::endl; m_irccd.transportService().broadcast(json::object({ - { "event", "onMode" }, - { "server", server->name() }, - { "origin", origin }, - { "mode", mode } + { "event", "onMode" }, + { "server", server->name() }, + { "origin", origin }, + { "mode", mode } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), origin, /* channel */ "", + m_irccd.post(EventHandler{server->name(), origin, /* channel */ "", [=] (Plugin &) -> std::string { return "onMode"; }, [=] (Plugin &plugin) { plugin.onMode(m_irccd, std::move(server), std::move(origin), std::move(mode)); } - )); + }); } void ServerService::handleNames(std::weak_ptr<Server> ptr, std::string channel, std::set<std::string> nicknames) @@ -317,20 +355,20 @@ json::Value names(std::vector<json::Value>(nicknames.begin(), nicknames.end())); m_irccd.transportService().broadcast(json::object({ - { "event", "onNames" }, - { "server", server->name() }, - { "channel", channel }, - { "names", std::move(names) } + { "event", "onNames" }, + { "server", server->name() }, + { "channel", channel }, + { "names", std::move(names) } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), /* origin */ "", channel, + m_irccd.post(EventHandler{server->name(), /* origin */ "", channel, [=] (Plugin &) -> std::string { return "onNames"; }, [=] (Plugin &plugin) { plugin.onNames(m_irccd, std::move(server), std::move(channel), std::vector<std::string>(nicknames.begin(), nicknames.end())); } - )); + }); } void ServerService::handleNick(std::weak_ptr<Server> ptr, std::string origin, std::string nickname) @@ -345,20 +383,20 @@ log::debug() << " nickname: " << nickname << std::endl; m_irccd.transportService().broadcast(json::object({ - { "event", "onNick" }, - { "server", server->name() }, - { "origin", origin }, - { "nickname", nickname } + { "event", "onNick" }, + { "server", server->name() }, + { "origin", origin }, + { "nickname", nickname } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), origin, /* channel */ "", + m_irccd.post(EventHandler{server->name(), origin, /* channel */ "", [=] (Plugin &) -> std::string { return "onNick"; }, [=] (Plugin &plugin) { plugin.onNick(m_irccd, std::move(server), std::move(origin), std::move(nickname)); } - )); + }); } void ServerService::handleNotice(std::weak_ptr<Server> ptr, std::string origin, std::string message) @@ -373,20 +411,20 @@ log::debug() << " message: " << message << std::endl; m_irccd.transportService().broadcast(json::object({ - { "event", "onNotice" }, - { "server", server->name() }, - { "origin", origin }, - { "message", message } + { "event", "onNotice" }, + { "server", server->name() }, + { "origin", origin }, + { "message", message } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), origin, /* channel */ "", + m_irccd.post(EventHandler{server->name(), origin, /* channel */ "", [=] (Plugin &) -> std::string { return "onNotice"; }, [=] (Plugin &plugin) { plugin.onNotice(m_irccd, std::move(server), std::move(origin), std::move(message)); } - )); + }); } void ServerService::handlePart(std::weak_ptr<Server> ptr, std::string origin, std::string channel, std::string reason) @@ -402,21 +440,21 @@ log::debug() << " reason: " << reason << std::endl; m_irccd.transportService().broadcast(json::object({ - { "event", "onPart" }, - { "server", server->name() }, - { "origin", origin }, - { "channel", channel }, - { "reason", reason } + { "event", "onPart" }, + { "server", server->name() }, + { "origin", origin }, + { "channel", channel }, + { "reason", reason } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), origin, channel, + m_irccd.post(EventHandler{server->name(), origin, channel, [=] (Plugin &) -> std::string { return "onPart"; }, [=] (Plugin &plugin) { plugin.onPart(m_irccd, std::move(server), std::move(origin), std::move(channel), std::move(reason)); } - )); + }); } void ServerService::handleQuery(std::weak_ptr<Server> ptr, std::string origin, std::string message) @@ -431,13 +469,13 @@ log::debug() << " message: " << message << std::endl; m_irccd.transportService().broadcast(json::object({ - { "event", "onQuery" }, - { "server", server->name() }, - { "origin", origin }, - { "message", message } + { "event", "onQuery" }, + { "server", server->name() }, + { "origin", origin }, + { "message", message } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), origin, /* channel */ "", + m_irccd.post(EventHandler{server->name(), origin, /* channel */ "", [=] (Plugin &plugin) -> std::string { return util::parseMessage(message, server->settings().command, plugin.name()).second == util::MessageType::Command ? "onQueryCommand" : "onQuery"; }, @@ -449,7 +487,7 @@ else plugin.onQuery(m_irccd, std::move(server), std::move(origin), std::move(pack.first)); } - )); + }); } void ServerService::handleTopic(std::weak_ptr<Server> ptr, std::string origin, std::string channel, std::string topic) @@ -465,21 +503,21 @@ log::debug() << " topic: " << topic << std::endl; m_irccd.transportService().broadcast(json::object({ - { "event", "onTopic" }, - { "server", server->name() }, - { "origin", origin }, - { "channel", channel }, - { "topic", topic } + { "event", "onTopic" }, + { "server", server->name() }, + { "origin", origin }, + { "channel", channel }, + { "topic", topic } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), origin, channel, + m_irccd.post(EventHandler{server->name(), origin, channel, [=] (Plugin &) -> std::string { return "onTopic"; }, [=] (Plugin &plugin) { plugin.onTopic(m_irccd, std::move(server), std::move(origin), std::move(channel), std::move(topic)); } - )); + }); } void ServerService::handleWhois(std::weak_ptr<Server> ptr, ServerWhois whois) @@ -497,21 +535,21 @@ log::debug() << " channels: " << util::join(whois.channels.begin(), whois.channels.end()) << std::endl; m_irccd.transportService().broadcast(json::object({ - { "server", server->name() }, - { "nickname", whois.nick }, - { "username", whois.user }, - { "host", whois.host }, - { "realname", whois.realname } + { "server", server->name() }, + { "nickname", whois.nick }, + { "username", whois.user }, + { "host", whois.host }, + { "realname", whois.realname } }).toJson(0)); - m_irccd.post(ServerEvent(server->name(), /* origin */ "", /* channel */ "", + m_irccd.post(EventHandler{server->name(), /* origin */ "", /* channel */ "", [=] (Plugin &) -> std::string { return "onWhois"; }, [=] (Plugin &plugin) { plugin.onWhois(m_irccd, std::move(server), std::move(whois)); } - )); + }); } ServerService::ServerService(Irccd &irccd)