Mercurial > irccd
changeset 553:c135001322a1
Irccd: remove post function, closes #733
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 24 Nov 2017 20:24:55 +0100 |
parents | bf6a1fb7c45a |
children | 6ff2172d2239 |
files | libirccd/irccd/irccd.hpp libirccd/irccd/server_service.cpp libirccd/irccd/transport_service.cpp |
diffstat | 3 files changed, 77 insertions(+), 93 deletions(-) [+] |
line wrap: on
line diff
--- a/libirccd/irccd/irccd.hpp Fri Nov 24 20:15:45 2017 +0100 +++ b/libirccd/irccd/irccd.hpp Fri Nov 24 20:24:55 2017 +0100 @@ -171,20 +171,6 @@ { return *plugin_service_; } - - /** - * Transient function for posting handlers. - * - * \param h the handler - * \deprecated do not use - */ - template <typename Handler> - inline void post(Handler h) - { - service_.post([this, h] () { - h(*this); - }); - } }; } // !irccd
--- a/libirccd/irccd/server_service.cpp Fri Nov 24 20:15:45 2017 +0100 +++ b/libirccd/irccd/server_service.cpp Fri Nov 24 20:24:55 2017 +0100 @@ -26,36 +26,36 @@ namespace irccd { -class event_handler { -public: - std::string server; - std::string origin; - std::string target; - std::function<std::string (plugin &)> function_name; - std::function<void (plugin &)> function_exec; - - void operator()(irccd& irccd) const - { - for (auto& plugin : irccd.plugins().list()) { - auto eventname = function_name(*plugin); - auto allowed = irccd.rules().solve(server, target, origin, plugin->name(), eventname); +namespace { - if (!allowed) { - log::debug() << "rule: event skipped on match" << std::endl; - continue; - } - - log::debug() << "rule: event allowed" << std::endl; +template <typename EventNameFunc, typename ExecFunc> +void dispatch(irccd& daemon, + const std::string& server, + const std::string& origin, + const std::string& target, + EventNameFunc&& name_func, + ExecFunc exec_func) +{ + for (auto& plugin : daemon.plugins().list()) { + auto eventname = name_func(*plugin); + auto allowed = daemon.rules().solve(server, target, origin, plugin->name(), eventname); - // TODO: this is the responsability of plugin_service. - try { - function_exec(*plugin); - } catch (const std::exception& ex) { - log::warning() << "plugin " << plugin->name() << ": error: " << ex.what() << std::endl; - } + if (!allowed) { + log::debug() << "rule: event skipped on match" << std::endl; + continue; + } + + log::debug() << "rule: event allowed" << std::endl; + + try { + exec_func(*plugin); + } catch (const std::exception& ex) { + log::warning() << "plugin " << plugin->name() << ": error: " << ex.what() << std::endl; } } -}; +} + +} // !namespace void server_service::handle_channel_mode(const channel_mode_event& ev) { @@ -74,14 +74,14 @@ { "argument", ev.argument } })); - irccd_.post(event_handler{ev.server->name(), ev.origin, ev.channel, + dispatch(irccd_, ev.server->name(), ev.origin, ev.channel, [=] (plugin&) -> std::string { return "onChannelMode"; }, [=] (plugin& plugin) { plugin.on_channel_mode(irccd_, ev); } - }); + ); } void server_service::handle_channel_notice(const channel_notice_event& ev) @@ -99,14 +99,14 @@ { "message", ev.message } })); - irccd_.post(event_handler{ev.server->name(), ev.origin, ev.channel, + dispatch(irccd_, ev.server->name(), ev.origin, ev.channel, [=] (plugin&) -> std::string { return "onChannelNotice"; }, [=] (plugin& plugin) { plugin.on_channel_notice(irccd_, ev); } - }); + ); } void server_service::handle_connect(const connect_event& ev) @@ -118,14 +118,14 @@ { "server", ev.server->name() } })); - irccd_.post(event_handler{ev.server->name(), /* origin */ "", /* channel */ "", + dispatch(irccd_, ev.server->name(), /* origin */ "", /* channel */ "", [=] (plugin&) -> std::string { return "onConnect"; }, [=] (plugin& plugin) { plugin.on_connect(irccd_, ev); } - }); + ); } void server_service::handle_invite(const invite_event& ev) @@ -142,14 +142,14 @@ { "channel", ev.channel } })); - irccd_.post(event_handler{ev.server->name(), ev.origin, ev.channel, + dispatch(irccd_, ev.server->name(), ev.origin, ev.channel, [=] (plugin&) -> std::string { return "onInvite"; }, [=] (plugin& plugin) { plugin.on_invite(irccd_, ev); } - }); + ); } void server_service::handle_join(const join_event& ev) @@ -165,14 +165,14 @@ { "channel", ev.channel } })); - irccd_.post(event_handler{ev.server->name(), ev.origin, ev.channel, + dispatch(irccd_, ev.server->name(), ev.origin, ev.channel, [=] (plugin&) -> std::string { return "onJoin"; }, [=] (plugin& plugin) { plugin.on_join(irccd_, ev); } - }); + ); } void server_service::handle_kick(const kick_event& ev) @@ -192,14 +192,14 @@ { "reason", ev.reason } })); - irccd_.post(event_handler{ev.server->name(), ev.origin, ev.channel, + dispatch(irccd_, ev.server->name(), ev.origin, ev.channel, [=] (plugin&) -> std::string { return "onKick"; }, [=] (plugin& plugin) { plugin.on_kick(irccd_, ev); } - }); + ); } void server_service::handle_message(const message_event& ev) @@ -217,7 +217,7 @@ { "message", ev.message } })); - irccd_.post(event_handler{ev.server->name(), ev.origin, ev.channel, + dispatch(irccd_, ev.server->name(), ev.origin, ev.channel, [=] (plugin& plugin) -> std::string { return string_util::parse_message( ev.message, @@ -236,7 +236,7 @@ else plugin.on_message(irccd_, copy); } - }); + ); } void server_service::handle_me(const me_event& ev) @@ -254,14 +254,14 @@ { "message", ev.message } })); - irccd_.post(event_handler{ev.server->name(), ev.origin, ev.channel, + dispatch(irccd_, ev.server->name(), ev.origin, ev.channel, [=] (plugin&) -> std::string { return "onMe"; }, [=] (plugin& plugin) { plugin.on_me(irccd_, ev); } - }); + ); } void server_service::handle_mode(const mode_event& ev) @@ -277,14 +277,14 @@ { "mode", ev.mode } })); - irccd_.post(event_handler{ev.server->name(), ev.origin, /* channel */ "", + dispatch(irccd_, ev.server->name(), ev.origin, /* channel */ "", [=] (plugin &) -> std::string { return "onMode"; }, [=] (plugin &plugin) { plugin.on_mode(irccd_, ev); } - }); + ); } void server_service::handle_names(const names_event& ev) @@ -305,14 +305,14 @@ { "names", std::move(names) } })); - irccd_.post(event_handler{ev.server->name(), /* origin */ "", ev.channel, + dispatch(irccd_, ev.server->name(), /* origin */ "", ev.channel, [=] (plugin&) -> std::string { return "onNames"; }, [=] (plugin& plugin) { plugin.on_names(irccd_, ev); } - }); + ); } void server_service::handle_nick(const nick_event& ev) @@ -328,14 +328,14 @@ { "nickname", ev.nickname } })); - irccd_.post(event_handler{ev.server->name(), ev.origin, /* channel */ "", + dispatch(irccd_, ev.server->name(), ev.origin, /* channel */ "", [=] (plugin&) -> std::string { return "onNick"; }, [=] (plugin& plugin) { plugin.on_nick(irccd_, ev); } - }); + ); } void server_service::handle_notice(const notice_event& ev) @@ -351,14 +351,14 @@ { "message", ev.message } })); - irccd_.post(event_handler{ev.server->name(), ev.origin, /* channel */ "", + dispatch(irccd_, ev.server->name(), ev.origin, /* channel */ "", [=] (plugin&) -> std::string { return "onNotice"; }, [=] (plugin& plugin) { plugin.on_notice(irccd_, ev); } - }); + ); } void server_service::handle_part(const part_event& ev) @@ -376,14 +376,14 @@ { "reason", ev.reason } })); - irccd_.post(event_handler{ev.server->name(), ev.origin, ev.channel, + dispatch(irccd_, ev.server->name(), ev.origin, ev.channel, [=] (plugin&) -> std::string { return "onPart"; }, [=] (plugin& plugin) { plugin.on_part(irccd_, ev); } - }); + ); } void server_service::handle_query(const query_event& ev) @@ -399,7 +399,7 @@ { "message", ev.message } })); - irccd_.post(event_handler{ev.server->name(), ev.origin, /* channel */ "", + dispatch(irccd_, ev.server->name(), ev.origin, /* channel */ "", [=] (plugin& plugin) -> std::string { return string_util::parse_message( ev.message, @@ -418,7 +418,7 @@ else plugin.on_query(irccd_, copy); } - }); + ); } void server_service::handle_topic(const topic_event& ev) @@ -436,14 +436,14 @@ { "topic", ev.topic } })); - irccd_.post(event_handler{ev.server->name(), ev.origin, ev.channel, + dispatch(irccd_, ev.server->name(), ev.origin, ev.channel, [=] (plugin&) -> std::string { return "onTopic"; }, [=] (plugin& plugin) { plugin.on_topic(irccd_, ev); } - }); + ); } void server_service::handle_whois(const whois_event& ev) @@ -464,14 +464,14 @@ { "realname", ev.whois.realname } })); - irccd_.post(event_handler{ev.server->name(), /* origin */ "", /* channel */ "", + dispatch(irccd_, ev.server->name(), /* origin */ "", /* channel */ "", [=] (plugin&) -> std::string { return "onWhois"; }, [=] (plugin& plugin) { plugin.on_whois(irccd_, ev); } - }); + ); } server_service::server_service(irccd &irccd) @@ -509,14 +509,12 @@ server->on_topic.connect(boost::bind(&server_service::handle_topic, this, _1)); server->on_whois.connect(boost::bind(&server_service::handle_whois, this, _1)); server->on_die.connect([this, ptr] () { - irccd_.post([=] (irccd&) { - auto server = ptr.lock(); + auto server = ptr.lock(); - if (server) { - log::info(string_util::sprintf("server %s: removed", server->name())); - servers_.erase(std::find(servers_.begin(), servers_.end(), server)); - } - }); + if (server) { + log::info(string_util::sprintf("server %s: removed", server->name())); + servers_.erase(std::find(servers_.begin(), servers_.end(), server)); + } }); server->connect();
--- a/libirccd/irccd/transport_service.cpp Fri Nov 24 20:15:45 2017 +0100 +++ b/libirccd/irccd/transport_service.cpp Fri Nov 24 20:24:55 2017 +0100 @@ -31,23 +31,21 @@ { assert(object.is_object()); - irccd_.post([=] (irccd&) { - auto name = object.find("command"); - if (name == object.end() || !name->is_string()) - return; + auto name = object.find("command"); + if (name == object.end() || !name->is_string()) + return; - auto cmd = irccd_.commands().find(*name); + auto cmd = irccd_.commands().find(*name); - if (!cmd) - tc->error(*name, "command does not exist"); - else { - try { - cmd->exec(irccd_, *tc, object); - } catch (const std::exception& ex) { - tc->error(cmd->name(), ex.what()); - } + if (!cmd) + tc->error(*name, "command does not exist"); + else { + try { + cmd->exec(irccd_, *tc, object); + } catch (const std::exception& ex) { + tc->error(cmd->name(), ex.what()); } - }); + } } void transport_service::do_accept(transport_server& ts) @@ -56,6 +54,8 @@ if (code) log::warning() << "transport: " << code.message() << std::endl; else { + log::info() << "transport: new client connected" << std::endl; + client->recv([this, client] (auto code, auto json) { if (code) log::warning() << "transport: " << code.message() << std::endl;