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)