changeset 631:1fa9e5222e87

Irccd: move commands to command folder
author David Demelier <markand@malikania.fr>
date Wed, 07 Mar 2018 21:00:56 +0100
parents 711e0bd01eaf
children e5d0f4289e04
files irccd/main.cpp libirccd/CMakeLists.txt libirccd/irccd/daemon/command/plugin_config_command.cpp libirccd/irccd/daemon/command/plugin_config_command.hpp libirccd/irccd/daemon/command/plugin_info_command.cpp libirccd/irccd/daemon/command/plugin_info_command.hpp libirccd/irccd/daemon/command/plugin_list_command.cpp libirccd/irccd/daemon/command/plugin_list_command.hpp libirccd/irccd/daemon/command/plugin_load_command.cpp libirccd/irccd/daemon/command/plugin_load_command.hpp libirccd/irccd/daemon/command/plugin_reload_command.cpp libirccd/irccd/daemon/command/plugin_reload_command.hpp libirccd/irccd/daemon/command/plugin_unload_command.cpp libirccd/irccd/daemon/command/plugin_unload_command.hpp libirccd/irccd/daemon/command/rule_add_command.cpp libirccd/irccd/daemon/command/rule_add_command.hpp libirccd/irccd/daemon/command/rule_edit_command.cpp libirccd/irccd/daemon/command/rule_edit_command.hpp libirccd/irccd/daemon/command/rule_info_command.cpp libirccd/irccd/daemon/command/rule_info_command.hpp libirccd/irccd/daemon/command/rule_list_command.cpp libirccd/irccd/daemon/command/rule_list_command.hpp libirccd/irccd/daemon/command/rule_move_command.cpp libirccd/irccd/daemon/command/rule_move_command.hpp libirccd/irccd/daemon/command/rule_remove_command.cpp libirccd/irccd/daemon/command/rule_remove_command.hpp libirccd/irccd/daemon/command/server_connect_command.cpp libirccd/irccd/daemon/command/server_connect_command.hpp libirccd/irccd/daemon/command/server_disconnect_command.cpp libirccd/irccd/daemon/command/server_disconnect_command.hpp libirccd/irccd/daemon/command/server_info_command.cpp libirccd/irccd/daemon/command/server_info_command.hpp libirccd/irccd/daemon/command/server_invite_command.cpp libirccd/irccd/daemon/command/server_invite_command.hpp libirccd/irccd/daemon/command/server_join_command.cpp libirccd/irccd/daemon/command/server_join_command.hpp libirccd/irccd/daemon/command/server_kick_command.cpp libirccd/irccd/daemon/command/server_kick_command.hpp libirccd/irccd/daemon/command/server_list_command.cpp libirccd/irccd/daemon/command/server_list_command.hpp libirccd/irccd/daemon/command/server_me_command.cpp libirccd/irccd/daemon/command/server_me_command.hpp libirccd/irccd/daemon/command/server_message_command.cpp libirccd/irccd/daemon/command/server_message_command.hpp libirccd/irccd/daemon/command/server_mode_command.cpp libirccd/irccd/daemon/command/server_mode_command.hpp libirccd/irccd/daemon/command/server_nick_command.cpp libirccd/irccd/daemon/command/server_nick_command.hpp libirccd/irccd/daemon/command/server_notice_command.cpp libirccd/irccd/daemon/command/server_notice_command.hpp libirccd/irccd/daemon/command/server_part_command.cpp libirccd/irccd/daemon/command/server_part_command.hpp libirccd/irccd/daemon/command/server_reconnect_command.cpp libirccd/irccd/daemon/command/server_reconnect_command.hpp libirccd/irccd/daemon/command/server_topic_command.cpp libirccd/irccd/daemon/command/server_topic_command.hpp libirccd/irccd/daemon/plugin_config_command.cpp libirccd/irccd/daemon/plugin_config_command.hpp libirccd/irccd/daemon/plugin_info_command.cpp libirccd/irccd/daemon/plugin_info_command.hpp libirccd/irccd/daemon/plugin_list_command.cpp libirccd/irccd/daemon/plugin_list_command.hpp libirccd/irccd/daemon/plugin_load_command.cpp libirccd/irccd/daemon/plugin_load_command.hpp libirccd/irccd/daemon/plugin_reload_command.cpp libirccd/irccd/daemon/plugin_reload_command.hpp libirccd/irccd/daemon/plugin_unload_command.cpp libirccd/irccd/daemon/plugin_unload_command.hpp libirccd/irccd/daemon/rule_add_command.cpp libirccd/irccd/daemon/rule_add_command.hpp libirccd/irccd/daemon/rule_edit_command.cpp libirccd/irccd/daemon/rule_edit_command.hpp libirccd/irccd/daemon/rule_info_command.cpp libirccd/irccd/daemon/rule_info_command.hpp libirccd/irccd/daemon/rule_list_command.cpp libirccd/irccd/daemon/rule_list_command.hpp libirccd/irccd/daemon/rule_move_command.cpp libirccd/irccd/daemon/rule_move_command.hpp libirccd/irccd/daemon/rule_remove_command.cpp libirccd/irccd/daemon/rule_remove_command.hpp libirccd/irccd/daemon/server_connect_command.cpp libirccd/irccd/daemon/server_connect_command.hpp libirccd/irccd/daemon/server_disconnect_command.cpp libirccd/irccd/daemon/server_disconnect_command.hpp libirccd/irccd/daemon/server_info_command.cpp libirccd/irccd/daemon/server_info_command.hpp libirccd/irccd/daemon/server_invite_command.cpp libirccd/irccd/daemon/server_invite_command.hpp libirccd/irccd/daemon/server_join_command.cpp libirccd/irccd/daemon/server_join_command.hpp libirccd/irccd/daemon/server_kick_command.cpp libirccd/irccd/daemon/server_kick_command.hpp libirccd/irccd/daemon/server_list_command.cpp libirccd/irccd/daemon/server_list_command.hpp libirccd/irccd/daemon/server_me_command.cpp libirccd/irccd/daemon/server_me_command.hpp libirccd/irccd/daemon/server_message_command.cpp libirccd/irccd/daemon/server_message_command.hpp libirccd/irccd/daemon/server_mode_command.cpp libirccd/irccd/daemon/server_mode_command.hpp libirccd/irccd/daemon/server_nick_command.cpp libirccd/irccd/daemon/server_nick_command.hpp libirccd/irccd/daemon/server_notice_command.cpp libirccd/irccd/daemon/server_notice_command.hpp libirccd/irccd/daemon/server_part_command.cpp libirccd/irccd/daemon/server_part_command.hpp libirccd/irccd/daemon/server_reconnect_command.cpp libirccd/irccd/daemon/server_reconnect_command.hpp libirccd/irccd/daemon/server_topic_command.cpp libirccd/irccd/daemon/server_topic_command.hpp tests/src/libirccd/command-plugin-config/main.cpp tests/src/libirccd/command-plugin-info/main.cpp tests/src/libirccd/command-plugin-list/main.cpp tests/src/libirccd/command-plugin-load/main.cpp tests/src/libirccd/command-plugin-reload/main.cpp tests/src/libirccd/command-plugin-unload/main.cpp tests/src/libirccd/command-rule-add/main.cpp tests/src/libirccd/command-rule-edit/main.cpp tests/src/libirccd/command-rule-info/main.cpp tests/src/libirccd/command-rule-list/main.cpp tests/src/libirccd/command-rule-move/main.cpp tests/src/libirccd/command-rule-remove/main.cpp tests/src/libirccd/command-server-connect/main.cpp tests/src/libirccd/command-server-disconnect/main.cpp tests/src/libirccd/command-server-info/main.cpp tests/src/libirccd/command-server-invite/main.cpp tests/src/libirccd/command-server-join/main.cpp tests/src/libirccd/command-server-kick/main.cpp tests/src/libirccd/command-server-list/main.cpp tests/src/libirccd/command-server-me/main.cpp tests/src/libirccd/command-server-message/main.cpp tests/src/libirccd/command-server-mode/main.cpp tests/src/libirccd/command-server-nick/main.cpp tests/src/libirccd/command-server-notice/main.cpp tests/src/libirccd/command-server-part/main.cpp tests/src/libirccd/command-server-reconnect/main.cpp tests/src/libirccd/command-server-topic/main.cpp
diffstat 137 files changed, 2968 insertions(+), 2940 deletions(-) [+]
line wrap: on
line diff
--- a/irccd/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/irccd/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -40,34 +40,35 @@
 
 #include <irccd/daemon/irccd.hpp>
 #include <irccd/daemon/logger.hpp>
-#include <irccd/daemon/plugin_config_command.hpp>
-#include <irccd/daemon/plugin_info_command.hpp>
-#include <irccd/daemon/plugin_list_command.hpp>
-#include <irccd/daemon/plugin_list_command.hpp>
-#include <irccd/daemon/plugin_load_command.hpp>
-#include <irccd/daemon/plugin_reload_command.hpp>
-#include <irccd/daemon/plugin_unload_command.hpp>
-#include <irccd/daemon/rule_add_command.hpp>
-#include <irccd/daemon/rule_edit_command.hpp>
-#include <irccd/daemon/rule_info_command.hpp>
-#include <irccd/daemon/rule_list_command.hpp>
-#include <irccd/daemon/rule_move_command.hpp>
-#include <irccd/daemon/rule_remove_command.hpp>
-#include <irccd/daemon/server_connect_command.hpp>
-#include <irccd/daemon/server_disconnect_command.hpp>
-#include <irccd/daemon/server_info_command.hpp>
-#include <irccd/daemon/server_invite_command.hpp>
-#include <irccd/daemon/server_join_command.hpp>
-#include <irccd/daemon/server_kick_command.hpp>
-#include <irccd/daemon/server_list_command.hpp>
-#include <irccd/daemon/server_me_command.hpp>
-#include <irccd/daemon/server_message_command.hpp>
-#include <irccd/daemon/server_mode_command.hpp>
-#include <irccd/daemon/server_nick_command.hpp>
-#include <irccd/daemon/server_notice_command.hpp>
-#include <irccd/daemon/server_part_command.hpp>
-#include <irccd/daemon/server_reconnect_command.hpp>
-#include <irccd/daemon/server_topic_command.hpp>
+
+#include <irccd/daemon/command/plugin_config_command.hpp>
+#include <irccd/daemon/command/plugin_info_command.hpp>
+#include <irccd/daemon/command/plugin_list_command.hpp>
+#include <irccd/daemon/command/plugin_list_command.hpp>
+#include <irccd/daemon/command/plugin_load_command.hpp>
+#include <irccd/daemon/command/plugin_reload_command.hpp>
+#include <irccd/daemon/command/plugin_unload_command.hpp>
+#include <irccd/daemon/command/rule_add_command.hpp>
+#include <irccd/daemon/command/rule_edit_command.hpp>
+#include <irccd/daemon/command/rule_info_command.hpp>
+#include <irccd/daemon/command/rule_list_command.hpp>
+#include <irccd/daemon/command/rule_move_command.hpp>
+#include <irccd/daemon/command/rule_remove_command.hpp>
+#include <irccd/daemon/command/server_connect_command.hpp>
+#include <irccd/daemon/command/server_disconnect_command.hpp>
+#include <irccd/daemon/command/server_info_command.hpp>
+#include <irccd/daemon/command/server_invite_command.hpp>
+#include <irccd/daemon/command/server_join_command.hpp>
+#include <irccd/daemon/command/server_kick_command.hpp>
+#include <irccd/daemon/command/server_list_command.hpp>
+#include <irccd/daemon/command/server_me_command.hpp>
+#include <irccd/daemon/command/server_message_command.hpp>
+#include <irccd/daemon/command/server_mode_command.hpp>
+#include <irccd/daemon/command/server_nick_command.hpp>
+#include <irccd/daemon/command/server_notice_command.hpp>
+#include <irccd/daemon/command/server_part_command.hpp>
+#include <irccd/daemon/command/server_reconnect_command.hpp>
+#include <irccd/daemon/command/server_topic_command.hpp>
 
 #include <irccd/daemon/service/plugin_service.hpp>
 #include <irccd/daemon/service/rule_service.hpp>
--- a/libirccd/CMakeLists.txt	Wed Mar 07 17:49:56 2018 +0100
+++ b/libirccd/CMakeLists.txt	Wed Mar 07 21:00:56 2018 +0100
@@ -25,43 +25,43 @@
     ${libirccd_SOURCE_DIR}/irccd/daemon/basic_transport_client.hpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/basic_transport_server.hpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/plugin_config_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/plugin_info_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/plugin_list_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/plugin_list_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/plugin_load_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/plugin_reload_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/plugin_unload_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/rule_add_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/rule_edit_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/rule_info_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/rule_list_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/rule_move_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/rule_remove_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_connect_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_disconnect_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_info_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_invite_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_join_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_kick_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_list_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_me_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_message_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_mode_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_nick_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_notice_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_part_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_reconnect_command.hpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_topic_command.hpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/dynlib_plugin.hpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/ip_transport_server.hpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/irccd.hpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/irc.hpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/local_transport_server.hpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/logger.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/plugin_config_command.hpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/plugin.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/plugin_info_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/plugin_list_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/plugin_list_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/plugin_load_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/plugin_reload_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/plugin_unload_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/rule_add_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/rule_edit_command.hpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/rule.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/rule_info_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/rule_list_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/rule_move_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/rule_remove_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_connect_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_disconnect_command.hpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/server.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_info_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_invite_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_join_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_kick_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_list_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_me_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_message_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_mode_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_nick_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_notice_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_part_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_reconnect_command.hpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_topic_command.hpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/service/plugin_service.hpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/service/rule_service.hpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/service/server_service.hpp
@@ -73,40 +73,40 @@
 
 set(
     SOURCES
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/plugin_config_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/plugin_info_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/plugin_list_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/plugin_load_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/plugin_reload_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/plugin_unload_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/rule_add_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/rule_edit_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/rule_info_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/rule_list_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/rule_move_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/rule_remove_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_connect_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_disconnect_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_info_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_invite_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_join_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_kick_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_list_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_me_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_message_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_mode_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_nick_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_notice_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_part_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_reconnect_command.cpp
+    ${libirccd_SOURCE_DIR}/irccd/daemon/command/server_topic_command.cpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/dynlib_plugin.cpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/irccd.cpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/irc.cpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/logger.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/plugin_config_command.cpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/plugin.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/plugin_info_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/plugin_list_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/plugin_load_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/plugin_reload_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/plugin_unload_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/rule_add_command.cpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/rule.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/rule_edit_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/rule_info_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/rule_list_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/rule_move_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/rule_remove_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_connect_command.cpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/server.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_disconnect_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_info_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_invite_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_join_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_kick_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_list_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_me_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_message_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_mode_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_nick_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_notice_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_part_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_reconnect_command.cpp
-    ${libirccd_SOURCE_DIR}/irccd/daemon/server_topic_command.cpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/service/plugin_service.cpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/service/rule_service.cpp
     ${libirccd_SOURCE_DIR}/irccd/daemon/service/server_service.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/plugin_config_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,91 @@
+/*
+ * plugin_config_command.cpp -- implementation of plugin-config transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/plugin_service.hpp>
+
+#include "plugin_config_command.hpp"
+
+namespace irccd {
+
+namespace {
+
+void exec_set(transport_client& client, plugin& plugin, const nlohmann::json& args)
+{
+    assert(args.count("value") > 0);
+
+    auto var = args.find("variable");
+    auto value = args.find("value");
+
+    if (var == args.end() || !var->is_string())
+        throw irccd_error(irccd_error::error::incomplete_message);
+    if (value == args.end() || !value->is_string())
+        throw irccd_error(irccd_error::error::incomplete_message);
+
+    auto config = plugin.config();
+
+    config[*var] = *value;
+    plugin.set_config(config);
+    client.success("plugin-config");
+}
+
+void exec_get(transport_client& client, plugin& plugin, const nlohmann::json& args)
+{
+    auto variables = nlohmann::json::object();
+    auto var = args.find("variable");
+
+    if (var != args.end() && var->is_string())
+        variables[var->get<std::string>()] = plugin.config()[*var];
+    else
+        for (const auto& pair : plugin.config())
+            variables[pair.first] = pair.second;
+
+    /*
+     * Don't put all variables into the response, put them into a sub property
+     * 'variables' instead.
+     *
+     * It's easier for the client to iterate over all.
+     */
+    client.send({
+        { "command",    "plugin-config" },
+        { "variables",  variables       }
+    });
+}
+
+} // !namespace
+
+std::string plugin_config_command::get_name() const noexcept
+{
+    return "plugin-config";
+}
+
+void plugin_config_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto plugin = irccd.plugins().require(json_util::require_identifier(args, "plugin"));
+
+    if (args.count("value") > 0)
+        exec_set(client, *plugin, args);
+    else
+        exec_get(client, *plugin, args);
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/plugin_config_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,53 @@
+/*
+ * plugin_config_command.hpp -- implementation of plugin-config transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_PLUGIN_CONFIG_COMMAND_HPP
+#define IRCCD_DAEMON_PLUGIN_CONFIG_COMMAND_HPP
+
+/**
+ * \file plugin_config_command.hpp
+ * \brief Implementation of plugin-config transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of plugin-config transport command.
+ *
+ * Replies:
+ *
+ *   - plugin_error::not_found
+ */
+class plugin_config_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_PLUGIN_CONFIG_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/plugin_info_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,48 @@
+/*
+ * plugin_info_command.cpp -- implementation of plugin-info transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/plugin_service.hpp>
+
+#include "plugin_info_command.hpp"
+
+namespace irccd {
+
+std::string plugin_info_command::get_name() const noexcept
+{
+    return "plugin-info";
+}
+
+void plugin_info_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto plugin = irccd.plugins().require(json_util::require_identifier(args, "plugin"));
+
+    client.send({
+        { "command",    "plugin-info"       },
+        { "author",     plugin->author()    },
+        { "license",    plugin->license()   },
+        { "summary",    plugin->summary()   },
+        { "version",    plugin->version()   }
+    });
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/plugin_info_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,53 @@
+/*
+ * plugin_info_command.hpp -- implementation of plugin-info transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_PLUGIN_INFO_COMMAND_HPP
+#define IRCCD_DAEMON_PLUGIN_INFO_COMMAND_HPP
+
+/**
+ * \file plugin_info_command.hpp
+ * \brief Implementation of plugin-info transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of plugin-info transport command.
+ *
+ * Replies:
+ *
+ *   - plugin_error::not_found
+ */
+class plugin_info_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_PLUGIN_INFO_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/plugin_list_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,46 @@
+/*
+ * plugin_list_command.cpp -- implementation of plugin-list transport command
+ *
+ * Copyright (c) 2013-2018 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/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/plugin_service.hpp>
+
+#include "plugin_list_command.hpp"
+
+namespace irccd {
+
+std::string plugin_list_command::get_name() const noexcept
+{
+    return "plugin-list";
+}
+
+void plugin_list_command::exec(irccd& irccd, transport_client& client, const nlohmann::json&)
+{
+    auto list = nlohmann::json::array();
+
+    for (const auto& plugin : irccd.plugins().list())
+        list += plugin->name();
+
+    client.send({
+        { "command",    "plugin-list"   },
+        { "list",       list            }
+    });
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/plugin_list_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,49 @@
+/*
+ * plugin_list_command.hpp -- implementation of plugin-list transport command
+ *
+ * Copyright (c) 2013-2018 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.
+ */
+
+/**
+ * \file plugin_list_command.hpp
+ * \brief Implementation of plugin-list transport command.
+ */
+
+#ifndef IRCCD_DAEMON_PLUGIN_LIST_COMMAND_HPP
+#define IRCCD_DAEMON_PLUGIN_LIST_COMMAND_HPP
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of plugin-list transport command.
+ */
+class plugin_list_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_PLUGIN_LIST_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/plugin_load_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,41 @@
+/*
+ * plugin_load_command.cpp -- implementation of plugin-load transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/plugin_service.hpp>
+
+#include "plugin_load_command.hpp"
+
+namespace irccd {
+
+std::string plugin_load_command::get_name() const noexcept
+{
+    return "plugin-load";
+}
+
+void plugin_load_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    irccd.plugins().load(json_util::require_identifier(args, "plugin"));
+    client.success("plugin-load");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/plugin_load_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,55 @@
+/*
+ * plugin_load_command.hpp -- implementation of plugin-load transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_PLUGIN_LOAD_COMMAND_HPP
+#define IRCCD_DAEMON_PLUGIN_LOAD_COMMAND_HPP
+
+/**
+ * \file plugin_load_command.hpp
+ * \brief Implementation of plugin-load transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of plugin-load transport command.
+ *
+ * Replies:
+ *
+ *   - plugin_error::already_exists
+ *   - plugin_error::not_found
+ *   - plugin_error::exec_error
+ */
+class plugin_load_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_PLUGIN_LOAD_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/plugin_reload_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,41 @@
+/*
+ * plugin_reload_command.cpp -- implementation of plugin-reload transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/plugin_service.hpp>
+
+#include "plugin_reload_command.hpp"
+
+namespace irccd {
+
+std::string plugin_reload_command::get_name() const noexcept
+{
+    return "plugin-reload";
+}
+
+void plugin_reload_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    irccd.plugins().reload(json_util::require_identifier(args, "plugin"));
+    client.success("plugin-reload");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/plugin_reload_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,54 @@
+/*
+ * plugin_reload_command.hpp -- implementation of plugin-reload transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_PLUGIN_RELOAD_COMMAND_HPP
+#define IRCCD_DAEMON_PLUGIN_RELOAD_COMMAND_HPP
+
+/**
+ * \file plugin_reload_command.hpp
+ * \brief Implementation of plugin-reload transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of plugin-reload transport command.
+ *
+ * Replies:
+ *
+ *   - plugin_error::not_found
+ *   - plugin_error::exec_error
+ */
+class plugin_reload_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_PLUGIN_RELOAD_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/plugin_unload_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,41 @@
+/*
+ * plugin_unload_command.cpp -- implementation of plugin-unload transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/plugin_service.hpp>
+
+#include "plugin_unload_command.hpp"
+
+namespace irccd {
+
+std::string plugin_unload_command::get_name() const noexcept
+{
+    return "plugin-unload";
+}
+
+void plugin_unload_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    irccd.plugins().unload(json_util::require_identifier(args, "plugin"));
+    client.success("plugin-unload");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/plugin_unload_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,54 @@
+/*
+ * plugin_unload_command.hpp -- implementation of plugin-unload transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_PLUGIN_UNLOAD_COMMAND_HPP
+#define IRCCD_DAEMON_PLUGIN_UNLOAD_COMMAND_HPP
+
+/**
+ * \file plugin_unload_command.hpp
+ * \brief Implementation of plugin-unload transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of plugin-unload transport command.
+ *
+ * Replies:
+ *
+ *   - plugin_error::not_found
+ *   - plugin_error::exec_error
+ */
+class plugin_unload_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_PLUGIN_UNLOAD_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/rule_add_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,47 @@
+/*
+ * rule_add_command.cpp -- implementation of rule-add transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/rule_service.hpp>
+
+#include "rule_add_command.hpp"
+
+namespace irccd {
+
+std::string rule_add_command::get_name() const noexcept
+{
+    return "rule-add";
+}
+
+void rule_add_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto index = json_util::get_uint(args, "index", irccd.rules().length());
+    auto rule = rule_service::from_json(args);
+
+    if (index > irccd.rules().length())
+        throw rule_error(rule_error::error::invalid_index);
+
+    irccd.rules().insert(rule, index);
+    client.success("rule-add");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/rule_add_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,53 @@
+/*
+ * rule_add_command.hpp -- implementation of rule-add transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_RULE_ADD_COMMAND_HPP
+#define IRCCD_DAEMON_RULE_ADD_COMMAND_HPP
+
+/**
+ * \file rule_add_command.hpp
+ * \brief Implementation of rule-add transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of rule-add transport command.
+ *
+ * Replies:
+ *
+ *   - rule_error::invalid_action
+ */
+class rule_add_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_RULE_ADD_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/rule_edit_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,76 @@
+/*
+ * rule_edit_command.cpp -- implementation of rule-edit transport command
+ *
+ * Copyright (c) 2013-2018 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/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/rule_service.hpp>
+
+#include "rule_edit_command.hpp"
+
+using namespace std::string_literals;
+
+namespace irccd {
+
+std::string rule_edit_command::get_name() const noexcept
+{
+    return "rule-edit";
+}
+
+void rule_edit_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    static const auto updateset = [] (auto& set, auto args, const auto& key) {
+        for (const auto& v : args["remove-"s + key]) {
+            if (v.is_string())
+                set.erase(v.template get<std::string>());
+        }
+        for (const auto& v : args["add-"s + key]) {
+            if (v.is_string())
+                set.insert(v.template get<std::string>());
+        }
+    };
+
+    // Create a copy to avoid incomplete edition in case of errors.
+    auto index = irccd.rules().get_index(args);
+    auto rule = irccd.rules().require(index);
+
+    updateset(rule.get_channels(), args, "channels");
+    updateset(rule.get_events(), args, "events");
+    updateset(rule.get_plugins(), args, "plugins");
+    updateset(rule.get_servers(), args, "servers");
+
+    auto action = args.find("action");
+
+    if (action != args.end()) {
+        if (!action->is_string())
+            throw rule_error(rule_error::error::invalid_action);
+
+        if (action->get<std::string>() == "accept")
+            rule.set_action(rule::action::accept);
+        else if (action->get<std::string>() == "drop")
+            rule.set_action(rule::action::drop);
+        else
+            throw rule_error(rule_error::invalid_action);
+    }
+
+    // All done, sync the rule.
+    irccd.rules().require(index) = rule;
+    client.success("rule-edit");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/rule_edit_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,54 @@
+/*
+ * rule_edit_command.hpp -- implementation of rule-edit transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_RULE_EDIT_COMMAND_HPP
+#define IRCCD_DAEMON_RULE_EDIT_COMMAND_HPP
+
+/**
+ * \file rule_edit_command.hpp
+ * \brief Implementation of rule-edit transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of rule-edit transport command.
+ *
+ * Replies:
+ *
+ *   - rule_error::invalid_index
+ *   - rule_error::invalid_action
+ */
+class rule_edit_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_RULE_EDIT_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/rule_info_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,41 @@
+/*
+ * rule_info_command.cpp -- implementation of rule-info transport command
+ *
+ * Copyright (c) 2013-2018 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/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/rule_service.hpp>
+
+#include "rule_info_command.hpp"
+
+namespace irccd {
+
+std::string rule_info_command::get_name() const noexcept
+{
+    return "rule-info";
+}
+
+void rule_info_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto json = rule_service::to_json(irccd.rules().require(irccd.rules().get_index(args)));
+
+    json.push_back({"command", "rule-info"});
+    client.send(std::move(json));
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/rule_info_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,53 @@
+/*
+ * rule_info_command.hpp -- implementation of rule-info transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_RULE_INFO_COMMAND_HPP
+#define IRCCD_DAEMON_RULE_INFO_COMMAND_HPP
+
+/**
+ * \file rule_info_command.hpp
+ * \brief Implementation of rule-info transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of rule-info transport command.
+ *
+ * Replies:
+ *
+ *   - rule_error::invalid_index
+ */
+class rule_info_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_RULE_INFO_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/rule_list_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,46 @@
+/*
+ * rule_list_command.cpp -- implementation of rule-list transport command
+ *
+ * Copyright (c) 2013-2018 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/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/rule_service.hpp>
+
+#include "rule_list_command.hpp"
+
+namespace irccd {
+
+std::string rule_list_command::get_name() const noexcept
+{
+    return "rule-list";
+}
+
+void rule_list_command::exec(irccd& irccd, transport_client& client, const nlohmann::json&)
+{
+    auto array = nlohmann::json::array();
+
+    for (const auto& rule : irccd.rules().list())
+        array.push_back(rule_service::to_json(rule));
+
+    client.send({
+        { "command",    "rule-list"         },
+        { "list",       std::move(array)    }
+    });
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/rule_list_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,49 @@
+/*
+ * rule_list_command.hpp -- implementation of rule-list transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_RULE_LIST_COMMAND_HPP
+#define IRCCD_DAEMON_RULE_LIST_COMMAND_HPP
+
+/**
+ * \file rule_list_command.hpp
+ * \brief Implementation of rule-list transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of rule-list transport command.
+ */
+class rule_list_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_RULE_ADD_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/rule_move_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,84 @@
+/*
+ * rule_move_command.cpp -- implementation of rule-move transport command
+ *
+ * Copyright (c) 2013-2018 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/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/rule_service.hpp>
+
+#include "rule_move_command.hpp"
+
+namespace irccd {
+
+std::string rule_move_command::get_name() const noexcept
+{
+    return "rule-move";
+}
+
+void rule_move_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto from = rule_service::get_index(args, "from");
+    auto to = rule_service::get_index(args, "to");
+
+    /*
+     * Examples of moves
+     * --------------------------------------------------------------
+     *
+     * Before: [0] [1] [2]
+     *
+     * from = 0
+     * to   = 2
+     *
+     * After:  [1] [2] [0]
+     *
+     * --------------------------------------------------------------
+     *
+     * Before: [0] [1] [2]
+     *
+     * from = 2
+     * to   = 0
+     *
+     * After:  [2] [0] [1]
+     *
+     * --------------------------------------------------------------
+     *
+     * Before: [0] [1] [2]
+     *
+     * from = 0
+     * to   = 123
+     *
+     * After:  [1] [2] [0]
+     */
+
+    // Ignore dumb input.
+    if (from == to) {
+        client.success("rule-move");
+        return;
+    }
+
+    if (from >= irccd.rules().length())
+        throw rule_error(rule_error::error::invalid_index);
+
+    auto save = irccd.rules().list()[from];
+
+    irccd.rules().remove(from);
+    irccd.rules().insert(save, to > irccd.rules().length() ? irccd.rules().length() : to);
+    client.success("rule-move");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/rule_move_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,53 @@
+/*
+ * rule_move_command.hpp -- implementation of rule-move transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_RULE_MOVE_COMMAND_HPP
+#define IRCCD_DAEMON_RULE_MOVE_COMMAND_HPP
+
+/**
+ * \file rule_move_command.hpp
+ * \brief Implementation of rule-move transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of rule-move transport command.
+ *
+ * Replies:
+ *
+ *   - rule_error::invalid_index
+ */
+class rule_move_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_RULE_MOVE_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/rule_remove_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,44 @@
+/*
+ * rule_remove_command.cpp -- implementation of rule-remove transport command
+ *
+ * Copyright (c) 2013-2018 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/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/rule_service.hpp>
+
+#include "rule_remove_command.hpp"
+
+namespace irccd {
+
+std::string rule_remove_command::get_name() const noexcept
+{
+    return "rule-remove";
+}
+
+void rule_remove_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto index = rule_service::get_index(args);
+
+    if (index >= irccd.rules().length())
+        throw rule_error(rule_error::invalid_index);
+
+    irccd.rules().remove(index);
+    client.success("rule-remove");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/rule_remove_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,53 @@
+/*
+ * rule_remove_command.hpp -- implementation of rule-remove transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_RULE_REMOVE_COMMAND_HPP
+#define IRCCD_DAEMON_RULE_REMOVE_COMMAND_HPP
+
+/**
+ * \file rule_remove_command.hpp
+ * \brief Implementation of rule-remove transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of rule-remove transport command.
+ *
+ * Replies:
+ *
+ *   - rule_error::invalid_index
+ */
+class rule_remove_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_RULE_REMOVE_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_connect_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,44 @@
+/*
+ * server_connect_command.cpp -- implementation of server-connect transport command
+ *
+ * Copyright (c) 2013-2018 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/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/server_service.hpp>
+
+#include "server_connect_command.hpp"
+
+namespace irccd {
+
+std::string server_connect_command::get_name() const noexcept
+{
+    return "server-connect";
+}
+
+void server_connect_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto server = server_service::from_json(irccd.service(), args);
+
+    if (irccd.servers().has(server->name()))
+        throw server_error(server_error::error::already_exists, server->name());
+
+    irccd.servers().add(std::move(server));
+    client.success("server-connect");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_connect_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,57 @@
+/*
+ * server_connect_command.hpp -- implementation of server-connect transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_SERVER_CONNECT_COMMAND_HPP
+#define IRCCD_DAEMON_SERVER_CONNECT_COMMAND_HPP
+
+/**
+ * \file server_connect_command.hpp
+ * \brief Implementation of server-connect transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of server-connect transport command.
+ *
+ * Replies:
+ *
+ *   - server_error::already_exists,
+ *   - server_error::invalid_hostname,
+ *   - server_error::invalid_identifier,
+ *   - server_error::invalid_port_number,
+ *   - server_error::ssl_disabled.
+ */
+class server_connect_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_SERVER_CONNECT_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_disconnect_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,55 @@
+/*
+ * server_disconnect_command.cpp -- implementation of server-disconnect transport command
+ *
+ * Copyright (c) 2013-2018 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/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/server_service.hpp>
+
+#include "server_disconnect_command.hpp"
+
+namespace irccd {
+
+std::string server_disconnect_command::get_name() const noexcept
+{
+    return "server-disconnect";
+}
+
+void server_disconnect_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto it = args.find("server");
+
+    if (it == args.end())
+        irccd.servers().clear();
+    else {
+        if (!it->is_string())
+            throw server_error(server_error::invalid_identifier, "");
+
+        auto name = it->get<std::string>();
+        auto s = irccd.servers().get(name);
+
+        if (!s)
+            throw server_error(server_error::not_found, name);
+
+        irccd.servers().remove(name);
+    }
+
+    client.success("server-disconnect");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_disconnect_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,54 @@
+/*
+ * server_disconnect_command.hpp -- implementation of server-disconnect transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_SERVER_DISCONNECT_COMMAND_HPP
+#define IRCCD_DAEMON_SERVER_DISCONNECT_COMMAND_HPP
+
+/**
+ * \file server_disconnect_command.hpp
+ * \brief Implementation of server-disconnect transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of server-disconnect transport command.
+ *
+ * Replies:
+ *
+ *   - server_error::invalid_identifier,
+ *   - server_error::not_found.
+ */
+class server_disconnect_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_SERVER_DISCONNECT_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_info_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,59 @@
+/*
+ * server_info_command.cpp -- implementation of server-info transport command
+ *
+ * Copyright (c) 2013-2018 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/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/server_service.hpp>
+
+#include "server_info_command.hpp"
+
+namespace irccd {
+
+std::string server_info_command::get_name() const noexcept
+{
+    return "server-info";
+}
+
+void server_info_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto response = nlohmann::json::object();
+    auto server = irccd.servers().require(args);
+
+    // General stuff.
+    response.push_back({"command", "server-info"});
+    response.push_back({"name", server->name()});
+    response.push_back({"host", server->host()});
+    response.push_back({"port", server->port()});
+    response.push_back({"nickname", server->nickname()});
+    response.push_back({"username", server->username()});
+    response.push_back({"realname", server->realname()});
+    response.push_back({"channels", server->channels()});
+
+    // Optional stuff.
+    if (server->flags() & server::ipv6)
+        response.push_back({"ipv6", true});
+    if (server->flags() & server::ssl)
+        response.push_back({"ssl", true});
+    if (server->flags() & server::ssl_verify)
+        response.push_back({"sslVerify", true});
+
+    client.send(response);
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_info_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,54 @@
+/*
+ * server_info_command.hpp -- implementation of server-info transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_SERVER_INFO_COMMAND_HPP
+#define IRCCD_DAEMON_SERVER_INFO_COMMAND_HPP
+
+/**
+ * \file server_info_command.hpp
+ * \brief Implementation of server-info transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of server-info transport command.
+ *
+ * Replies:
+ *
+ *   - server_error::invalid_identifier,
+ *   - server_error::not_found.
+ */
+class server_info_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_SERVER_INFO_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_invite_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,50 @@
+/*
+ * server_invite_command.cpp -- implementation of server-invite transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/server_service.hpp>
+
+#include "server_invite_command.hpp"
+
+namespace irccd {
+
+std::string server_invite_command::get_name() const noexcept
+{
+    return "server-invite";
+}
+
+void server_invite_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto server = irccd.servers().require(args);
+    auto target = json_util::get_string(args, "target");
+    auto channel = json_util::get_string(args, "channel");
+
+    if (target.empty())
+        throw server_error(server_error::invalid_nickname, server->name());
+    if (channel.empty())
+        throw server_error(server_error::invalid_channel, server->name());
+
+    server->invite(target, channel);
+    client.success("server-invite");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_invite_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,56 @@
+/*
+ * server_invite_command.hpp -- implementation of server-invite transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_SERVER_INVITE_COMMAND_HPP
+#define IRCCD_DAEMON_SERVER_INVITE_COMMAND_HPP
+
+/**
+ * \file server_invite_command.hpp
+ * \brief Implementation of server-invite transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of server-invite transport command.
+ *
+ * Replies:
+ *
+ *   - server_error::invalid_channel,
+ *   - server_error::invalid_identifier,
+ *   - server_error::invalid_nickname,
+ *   - server_error::not_found.
+ */
+class server_invite_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_SERVER_INVITE_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_join_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,48 @@
+/*
+ * server_join_command.cpp -- implementation of server-join transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/server_service.hpp>
+
+#include "server_join_command.hpp"
+
+namespace irccd {
+
+std::string server_join_command::get_name() const noexcept
+{
+    return "server-join";
+}
+
+void server_join_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto server = irccd.servers().require(args);
+    auto channel = json_util::get_string(args, "channel");
+    auto password = json_util::get_string(args, "password");
+
+    if (channel.empty())
+        throw server_error(server_error::invalid_channel, server->name());
+
+    server->join(channel, password);
+    client.success("server-join");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_join_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,55 @@
+/*
+ * server_join_command.hpp -- implementation of server-join transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_SERVER_JOIN_COMMAND_HPP
+#define IRCCD_DAEMON_SERVER_JOIN_COMMAND_HPP
+
+/**
+ * \file server_join_command.hpp
+ * \brief Implementation of server-join transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of server-join transport command.
+ *
+ * Replies:
+ *
+ *   - server_error::invalid_channel,
+ *   - server_error::invalid_identifier,
+ *   - server_error::not_found.
+ */
+class server_join_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_SERVER_JOIN_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_kick_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,51 @@
+/*
+ * server_kick_command.cpp -- implementation of server-kick transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/server_service.hpp>
+
+#include "server_kick_command.hpp"
+
+namespace irccd {
+
+std::string server_kick_command::get_name() const noexcept
+{
+    return "server-kick";
+}
+
+void server_kick_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto server = irccd.servers().require(args);
+    auto target = json_util::get_string(args, "target");
+    auto channel = json_util::get_string(args, "channel");
+    auto reason = json_util::get_string(args, "reason");
+
+    if (target.empty())
+        throw server_error(server_error::invalid_nickname, server->name());
+    if (channel.empty())
+        throw server_error(server_error::invalid_channel, server->name());
+
+    server->kick(target, channel, reason);
+    client.success("server-kick");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_kick_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,56 @@
+/*
+ * server_kick_command.hpp -- implementation of server-kick transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_SERVER_KICK_COMMAND_HPP
+#define IRCCD_DAEMON_SERVER_KICK_COMMAND_HPP
+
+/**
+ * \file server_kick_command.hpp
+ * \brief Implementation of server-kick transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of server-kick transport command.
+ *
+ * Replies:
+ *
+ *   - server_error::invalid_channel,
+ *   - server_error::invalid_identifier,
+ *   - server_error::invalid_nickname,
+ *   - server_error::not_found.
+ */
+class server_kick_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_SERVER_KICK_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_list_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,47 @@
+/*
+ * server_list_command.cpp -- implementation of server-list transport command
+ *
+ * Copyright (c) 2013-2018 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/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/server_service.hpp>
+
+#include "server_list_command.hpp"
+
+namespace irccd {
+
+std::string server_list_command::get_name() const noexcept
+{
+    return "server-list";
+}
+
+void server_list_command::exec(irccd& irccd, transport_client& client, const nlohmann::json&)
+{
+    auto json = nlohmann::json::object();
+    auto list = nlohmann::json::array();
+
+    for (const auto& server : irccd.servers().servers())
+        list.push_back(server->name());
+
+    client.send({
+        { "command",    "server-list"   },
+        { "list",       std::move(list) }
+    });
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_list_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,49 @@
+/*
+ * server_list_command.hpp -- implementation of server-list transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_SERVER_LIST_COMMAND_HPP
+#define IRCCD_DAEMON_SERVER_LIST_COMMAND_HPP
+
+/**
+ * \file server_list_command.hpp
+ * \brief Implementation of server-list transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of server-list transport command.
+ */
+class server_list_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_SERVER_LIST_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_me_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,48 @@
+/*
+ * server_me_command.cpp -- implementation of server-me transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/server_service.hpp>
+
+#include "server_me_command.hpp"
+
+namespace irccd {
+
+std::string server_me_command::get_name() const noexcept
+{
+    return "server-me";
+}
+
+void server_me_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto server = irccd.servers().require(args);
+    auto channel = json_util::get_string(args, "target");
+    auto message = json_util::get_string(args, "message");
+
+    if (channel.empty())
+        throw server_error(server_error::invalid_channel, server->name());
+
+    server->me(channel, message);
+    client.success("server-me");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_me_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,55 @@
+/*
+ * server_me_command.hpp -- implementation of server-me transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_SERVER_ME_COMMAND_HPP
+#define IRCCD_DAEMON_SERVER_ME_COMMAND_HPP
+
+/**
+ * \file server_me_command.hpp
+ * \brief Implementation of server-me transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of server-me transport command.
+ *
+ * Replies:
+ *
+ *   - server_error::invalid_channel,
+ *   - server_error::invalid_identifier,
+ *   - server_error::not_found.
+ */
+class server_me_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_SERVER_ME_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_message_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,48 @@
+/*
+ * server_message_command.cpp -- implementation of server-message transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/server_service.hpp>
+
+#include "server_message_command.hpp"
+
+namespace irccd {
+
+std::string server_message_command::get_name() const noexcept
+{
+    return "server-message";
+}
+
+void server_message_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto server = irccd.servers().require(args);
+    auto channel = json_util::get_string(args, "target");
+    auto message = json_util::get_string(args, "message");
+
+    if (channel.empty())
+        throw server_error(server_error::invalid_channel, server->name());
+
+    server->message(channel, message);
+    client.success("server-message");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_message_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,55 @@
+/*
+ * server_message_command.hpp -- implementation of server-message transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_SERVER_MESSAGE_COMMAND_HPP
+#define IRCCD_DAEMON_SERVER_MESSAGE_COMMAND_HPP
+
+/**
+ * \file server_message_command.hpp
+ * \brief Implementation of server-message transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of server-message transport command.
+ *
+ * Replies:
+ *
+ *   - server_error::invalid_channel,
+ *   - server_error::invalid_identifier,
+ *   - server_error::not_found.
+ */
+class server_message_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_SERVER_MESSAGE_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_mode_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,54 @@
+/*
+ * server_mode_command.cpp -- implementation of server-mode transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/server_service.hpp>
+
+#include "server_mode_command.hpp"
+
+namespace irccd {
+
+std::string server_mode_command::get_name() const noexcept
+{
+    return "server-mode";
+}
+
+void server_mode_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto server = irccd.servers().require(args);
+    auto channel = json_util::get_string(args, "channel");
+    auto mode = json_util::get_string(args, "mode");
+
+    if (channel.empty())
+        throw server_error(server_error::invalid_channel, server->name());
+    if (mode.empty())
+        throw server_error(server_error::invalid_mode, server->name());
+
+    auto limit = json_util::get_string(args, "limit");
+    auto user = json_util::get_string(args, "user");
+    auto mask = json_util::get_string(args, "mask");
+
+    server->mode(channel, mode, limit, user, mask);
+    client.success("server-mode");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_mode_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,56 @@
+/*
+ * server_mode_command.hpp -- implementation of server-mode transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_SERVER_MODE_COMMAND_HPP
+#define IRCCD_DAEMON_SERVER_MODE_COMMAND_HPP
+
+/**
+ * \file server_mode_command.hpp
+ * \brief Implementation of server-mode transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of server-mode transport command.
+ *
+ * Replies:
+ *
+ *   - server_error::invalid_channel,
+ *   - server_error::invalid_identifier,
+ *   - server_error::invalid_mode,
+ *   - server_error::not_found.
+ */
+class server_mode_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_SERVER_MODE_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_nick_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,47 @@
+/*
+ * server_nick_command.cpp -- implementation of server-nick transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/server_service.hpp>
+
+#include "server_nick_command.hpp"
+
+namespace irccd {
+
+std::string server_nick_command::get_name() const noexcept
+{
+    return "server-nick";
+}
+
+void server_nick_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto server = irccd.servers().require(args);
+    auto nick = json_util::get_string(args, "nickname");
+
+    if (nick.empty())
+        throw server_error(server_error::invalid_nickname, server->name());
+
+    server->set_nickname(nick);
+    client.success("server-nick");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_nick_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,55 @@
+/*
+ * server_nick_command.hpp -- implementation of server-nick transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_SERVER_NICK_COMMAND_HPP
+#define IRCCD_DAEMON_SERVER_NICK_COMMAND_HPP
+
+/**
+ * \file server_nick_command.hpp
+ * \brief Implementation of server-nick transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of server-nick transport command.
+ *
+ * Replies:
+ *
+ *   - server_error::invalid_identifier,
+ *   - server_error::invalid_nickname,
+ *   - server_error::not_found.
+ */
+class server_nick_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_SERVER_NICK_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_notice_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,48 @@
+/*
+ * server_notice_command.cpp -- implementation of server-notice transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/server_service.hpp>
+
+#include "server_notice_command.hpp"
+
+namespace irccd {
+
+std::string server_notice_command::get_name() const noexcept
+{
+    return "server-notice";
+}
+
+void server_notice_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto server = irccd.servers().require(args);
+    auto channel = json_util::get_string(args, "target");
+    auto message = json_util::get_string(args, "message");
+
+    if (channel.empty())
+        throw server_error(server_error::invalid_channel, server->name());
+
+    server->notice(channel, message);
+    client.success("server-notice");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_notice_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,55 @@
+/*
+ * server_notice_command.hpp -- implementation of server-notice transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_SERVER_NOTICE_COMMAND_HPP
+#define IRCCD_DAEMON_SERVER_NOTICE_COMMAND_HPP
+
+/**
+ * \file server_notice_command.hpp
+ * \brief Implementation of server-notice transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of server-notice transport command.
+ *
+ * Replies:
+ *
+ *   - server_error::invalid_channel,
+ *   - server_error::invalid_identifier,
+ *   - server_error::not_found.
+ */
+class server_notice_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_SERVER_NOTICE_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_part_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,48 @@
+/*
+ * server_part_command.cpp -- implementation of server-part transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/server_service.hpp>
+
+#include "server_part_command.hpp"
+
+namespace irccd {
+
+std::string server_part_command::get_name() const noexcept
+{
+    return "server-part";
+}
+
+void server_part_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto server = irccd.servers().require(args);
+    auto channel = json_util::get_string(args, "channel");
+    auto reason = json_util::get_string(args, "reason");
+
+    if (channel.empty())
+        throw server_error(server_error::invalid_channel, server->name());
+
+    server->part(channel, reason);
+    client.success("server-part");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_part_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,55 @@
+/*
+ * server_part_command.hpp -- implementation of server-part transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_SERVER_PART_COMMAND_HPP
+#define IRCCD_DAEMON_SERVER_PART_COMMAND_HPP
+
+/**
+ * \file server_part_command.hpp
+ * \brief Implementation of server-part transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of server-part transport command.
+ *
+ * Replies:
+ *
+ *   - server_error::invalid_channel,
+ *   - server_error::invalid_identifier,
+ *   - server_error::not_found.
+ */
+class server_part_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_SERVER_PART_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_reconnect_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,58 @@
+/*
+ * server_reconnect_command.cpp -- implementation of server-reconnect transport command
+ *
+ * Copyright (c) 2013-2018 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/string_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/server_service.hpp>
+
+#include "server_reconnect_command.hpp"
+
+namespace irccd {
+
+std::string server_reconnect_command::get_name() const noexcept
+{
+    return "server-reconnect";
+}
+
+void server_reconnect_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto server = args.find("server");
+
+    if (server == args.end()) {
+        for (auto& server : irccd.servers().servers())
+            server->reconnect();
+    } else {
+        if (!server->is_string() || !string_util::is_identifier(server->get<std::string>()))
+            throw server_error(server_error::invalid_identifier, "");
+
+        auto name = server->get<std::string>();
+        auto s = irccd.servers().get(name);
+
+        if (!s)
+            throw server_error(server_error::not_found, name);
+
+        s->reconnect();
+    }
+
+    client.success("server-reconnect");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_reconnect_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,54 @@
+/*
+ * server_reconnect_command.hpp -- implementation of server-reconnect transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_SERVER_RECONNECT_COMMAND_HPP
+#define IRCCD_DAEMON_SERVER_RECONNECT_COMMAND_HPP
+
+/**
+ * \file server_reconnect_command.hpp
+ * \brief Implementation of server-reconnect transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of server-reconnect transport command.
+ *
+ * Replies:
+ *
+ *   - server_error::invalid_identifier,
+ *   - server_error::not_found.
+ */
+class server_reconnect_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_SERVER_RECONNECT_COMMAND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_topic_command.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,48 @@
+/*
+ * server_topic_command.cpp -- implementation of server-topic transport command
+ *
+ * Copyright (c) 2013-2018 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/json_util.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/transport_client.hpp>
+
+#include <irccd/daemon/service/server_service.hpp>
+
+#include "server_topic_command.hpp"
+
+namespace irccd {
+
+std::string server_topic_command::get_name() const noexcept
+{
+    return "server-topic";
+}
+
+void server_topic_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
+{
+    auto server = irccd.servers().require(args);
+    auto channel = json_util::get_string(args, "channel");
+    auto topic = json_util::get_string(args, "topic");
+
+    if (channel.empty())
+        throw server_error(server_error::invalid_channel, server->name());
+
+    server->topic(channel, topic);
+    client.success("server-topic");
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/daemon/command/server_topic_command.hpp	Wed Mar 07 21:00:56 2018 +0100
@@ -0,0 +1,55 @@
+/*
+ * server_topic_command.hpp -- implementation of server-topic transport command
+ *
+ * Copyright (c) 2013-2018 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_DAEMON_SERVER_TOPIC_COMMAND_HPP
+#define IRCCD_DAEMON_SERVER_TOPIC_COMMAND_HPP
+
+/**
+ * \file server_topic_command.hpp
+ * \brief Implementation of server-topic transport command.
+ */
+
+#include <irccd/daemon/command.hpp>
+
+namespace irccd {
+
+/**
+ * \brief Implementation of server-topic transport command.
+ *
+ * Replies:
+ *
+ *   - server_error::invalid_channel,
+ *   - server_error::invalid_identifier,
+ *   - server_error::not_found.
+ */
+class server_topic_command : public command {
+public:
+    /**
+     * \copydoc command::get_name
+     */
+    std::string get_name() const noexcept override;
+
+    /**
+     * \copydoc command::exec
+     */
+    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
+};
+
+} // !irccd
+
+#endif // !IRCCD_DAEMON_SERVER_TOPIC_COMMAND_HPP
--- a/libirccd/irccd/daemon/plugin_config_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-/*
- * plugin_config_command.cpp -- implementation of plugin-config transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "plugin_config_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/plugin_service.hpp>
-
-namespace irccd {
-
-namespace {
-
-void exec_set(transport_client& client, plugin& plugin, const nlohmann::json& args)
-{
-    assert(args.count("value") > 0);
-
-    auto var = args.find("variable");
-    auto value = args.find("value");
-
-    if (var == args.end() || !var->is_string())
-        throw irccd_error(irccd_error::error::incomplete_message);
-    if (value == args.end() || !value->is_string())
-        throw irccd_error(irccd_error::error::incomplete_message);
-
-    auto config = plugin.config();
-
-    config[*var] = *value;
-    plugin.set_config(config);
-    client.success("plugin-config");
-}
-
-void exec_get(transport_client& client, plugin& plugin, const nlohmann::json& args)
-{
-    auto variables = nlohmann::json::object();
-    auto var = args.find("variable");
-
-    if (var != args.end() && var->is_string())
-        variables[var->get<std::string>()] = plugin.config()[*var];
-    else
-        for (const auto& pair : plugin.config())
-            variables[pair.first] = pair.second;
-
-    /*
-     * Don't put all variables into the response, put them into a sub property
-     * 'variables' instead.
-     *
-     * It's easier for the client to iterate over all.
-     */
-    client.send({
-        { "command",    "plugin-config" },
-        { "variables",  variables       }
-    });
-}
-
-} // !namespace
-
-std::string plugin_config_command::get_name() const noexcept
-{
-    return "plugin-config";
-}
-
-void plugin_config_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto plugin = irccd.plugins().require(json_util::require_identifier(args, "plugin"));
-
-    if (args.count("value") > 0)
-        exec_set(client, *plugin, args);
-    else
-        exec_get(client, *plugin, args);
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/plugin_config_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * plugin_config_command.hpp -- implementation of plugin-config transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_PLUGIN_CONFIG_COMMAND_HPP
-#define IRCCD_DAEMON_PLUGIN_CONFIG_COMMAND_HPP
-
-/**
- * \file plugin_config_command.hpp
- * \brief Implementation of plugin-config transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of plugin-config transport command.
- *
- * Replies:
- *
- *   - plugin_error::not_found
- */
-class plugin_config_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_PLUGIN_CONFIG_COMMAND_HPP
--- a/libirccd/irccd/daemon/plugin_info_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * plugin_info_command.cpp -- implementation of plugin-info transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "plugin_info_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/plugin_service.hpp>
-
-namespace irccd {
-
-std::string plugin_info_command::get_name() const noexcept
-{
-    return "plugin-info";
-}
-
-void plugin_info_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto plugin = irccd.plugins().require(json_util::require_identifier(args, "plugin"));
-
-    client.send({
-        { "command",    "plugin-info"       },
-        { "author",     plugin->author()    },
-        { "license",    plugin->license()   },
-        { "summary",    plugin->summary()   },
-        { "version",    plugin->version()   }
-    });
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/plugin_info_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * plugin_info_command.hpp -- implementation of plugin-info transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_PLUGIN_INFO_COMMAND_HPP
-#define IRCCD_DAEMON_PLUGIN_INFO_COMMAND_HPP
-
-/**
- * \file plugin_info_command.hpp
- * \brief Implementation of plugin-info transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of plugin-info transport command.
- *
- * Replies:
- *
- *   - plugin_error::not_found
- */
-class plugin_info_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_PLUGIN_INFO_COMMAND_HPP
--- a/libirccd/irccd/daemon/plugin_list_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-/*
- * plugin_list_command.cpp -- implementation of plugin-list transport command
- *
- * Copyright (c) 2013-2018 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 "plugin_list_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/plugin_service.hpp>
-
-namespace irccd {
-
-std::string plugin_list_command::get_name() const noexcept
-{
-    return "plugin-list";
-}
-
-void plugin_list_command::exec(irccd& irccd, transport_client& client, const nlohmann::json&)
-{
-    auto list = nlohmann::json::array();
-
-    for (const auto& plugin : irccd.plugins().list())
-        list += plugin->name();
-
-    client.send({
-        { "command",    "plugin-list"   },
-        { "list",       list            }
-    });
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/plugin_list_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
- * plugin_list_command.hpp -- implementation of plugin-list transport command
- *
- * Copyright (c) 2013-2018 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.
- */
-
-/**
- * \file plugin_list_command.hpp
- * \brief Implementation of plugin-list transport command.
- */
-
-#ifndef IRCCD_DAEMON_PLUGIN_LIST_COMMAND_HPP
-#define IRCCD_DAEMON_PLUGIN_LIST_COMMAND_HPP
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of plugin-list transport command.
- */
-class plugin_list_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_PLUGIN_LIST_COMMAND_HPP
--- a/libirccd/irccd/daemon/plugin_load_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
- * plugin_load_command.cpp -- implementation of plugin-load transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "plugin_load_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/plugin_service.hpp>
-
-namespace irccd {
-
-std::string plugin_load_command::get_name() const noexcept
-{
-    return "plugin-load";
-}
-
-void plugin_load_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    irccd.plugins().load(json_util::require_identifier(args, "plugin"));
-    client.success("plugin-load");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/plugin_load_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * plugin_load_command.hpp -- implementation of plugin-load transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_PLUGIN_LOAD_COMMAND_HPP
-#define IRCCD_DAEMON_PLUGIN_LOAD_COMMAND_HPP
-
-/**
- * \file plugin_load_command.hpp
- * \brief Implementation of plugin-load transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of plugin-load transport command.
- *
- * Replies:
- *
- *   - plugin_error::already_exists
- *   - plugin_error::not_found
- *   - plugin_error::exec_error
- */
-class plugin_load_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_PLUGIN_LOAD_COMMAND_HPP
--- a/libirccd/irccd/daemon/plugin_reload_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
- * plugin_reload_command.cpp -- implementation of plugin-reload transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "plugin_reload_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/plugin_service.hpp>
-
-namespace irccd {
-
-std::string plugin_reload_command::get_name() const noexcept
-{
-    return "plugin-reload";
-}
-
-void plugin_reload_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    irccd.plugins().reload(json_util::require_identifier(args, "plugin"));
-    client.success("plugin-reload");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/plugin_reload_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * plugin_reload_command.hpp -- implementation of plugin-reload transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_PLUGIN_RELOAD_COMMAND_HPP
-#define IRCCD_DAEMON_PLUGIN_RELOAD_COMMAND_HPP
-
-/**
- * \file plugin_reload_command.hpp
- * \brief Implementation of plugin-reload transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of plugin-reload transport command.
- *
- * Replies:
- *
- *   - plugin_error::not_found
- *   - plugin_error::exec_error
- */
-class plugin_reload_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_PLUGIN_RELOAD_COMMAND_HPP
--- a/libirccd/irccd/daemon/plugin_unload_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
- * plugin_unload_command.cpp -- implementation of plugin-unload transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "plugin_unload_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/plugin_service.hpp>
-
-namespace irccd {
-
-std::string plugin_unload_command::get_name() const noexcept
-{
-    return "plugin-unload";
-}
-
-void plugin_unload_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    irccd.plugins().unload(json_util::require_identifier(args, "plugin"));
-    client.success("plugin-unload");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/plugin_unload_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * plugin_unload_command.hpp -- implementation of plugin-unload transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_PLUGIN_UNLOAD_COMMAND_HPP
-#define IRCCD_DAEMON_PLUGIN_UNLOAD_COMMAND_HPP
-
-/**
- * \file plugin_unload_command.hpp
- * \brief Implementation of plugin-unload transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of plugin-unload transport command.
- *
- * Replies:
- *
- *   - plugin_error::not_found
- *   - plugin_error::exec_error
- */
-class plugin_unload_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_PLUGIN_UNLOAD_COMMAND_HPP
--- a/libirccd/irccd/daemon/rule_add_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*
- * rule_add_command.cpp -- implementation of rule-add transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "rule_add_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/rule_service.hpp>
-
-namespace irccd {
-
-std::string rule_add_command::get_name() const noexcept
-{
-    return "rule-add";
-}
-
-void rule_add_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto index = json_util::get_uint(args, "index", irccd.rules().length());
-    auto rule = rule_service::from_json(args);
-
-    if (index > irccd.rules().length())
-        throw rule_error(rule_error::error::invalid_index);
-
-    irccd.rules().insert(rule, index);
-    client.success("rule-add");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/rule_add_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * rule_add_command.hpp -- implementation of rule-add transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_RULE_ADD_COMMAND_HPP
-#define IRCCD_DAEMON_RULE_ADD_COMMAND_HPP
-
-/**
- * \file rule_add_command.hpp
- * \brief Implementation of rule-add transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of rule-add transport command.
- *
- * Replies:
- *
- *   - rule_error::invalid_action
- */
-class rule_add_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_RULE_ADD_COMMAND_HPP
--- a/libirccd/irccd/daemon/rule_edit_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/*
- * rule_edit_command.cpp -- implementation of rule-edit transport command
- *
- * Copyright (c) 2013-2018 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 "rule_edit_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/rule_service.hpp>
-
-using namespace std::string_literals;
-
-namespace irccd {
-
-std::string rule_edit_command::get_name() const noexcept
-{
-    return "rule-edit";
-}
-
-void rule_edit_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    static const auto updateset = [] (auto& set, auto args, const auto& key) {
-        for (const auto& v : args["remove-"s + key]) {
-            if (v.is_string())
-                set.erase(v.template get<std::string>());
-        }
-        for (const auto& v : args["add-"s + key]) {
-            if (v.is_string())
-                set.insert(v.template get<std::string>());
-        }
-    };
-
-    // Create a copy to avoid incomplete edition in case of errors.
-    auto index = irccd.rules().get_index(args);
-    auto rule = irccd.rules().require(index);
-
-    updateset(rule.get_channels(), args, "channels");
-    updateset(rule.get_events(), args, "events");
-    updateset(rule.get_plugins(), args, "plugins");
-    updateset(rule.get_servers(), args, "servers");
-
-    auto action = args.find("action");
-
-    if (action != args.end()) {
-        if (!action->is_string())
-            throw rule_error(rule_error::error::invalid_action);
-
-        if (action->get<std::string>() == "accept")
-            rule.set_action(rule::action::accept);
-        else if (action->get<std::string>() == "drop")
-            rule.set_action(rule::action::drop);
-        else
-            throw rule_error(rule_error::invalid_action);
-    }
-
-    // All done, sync the rule.
-    irccd.rules().require(index) = rule;
-    client.success("rule-edit");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/rule_edit_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * rule_edit_command.hpp -- implementation of rule-edit transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_RULE_EDIT_COMMAND_HPP
-#define IRCCD_DAEMON_RULE_EDIT_COMMAND_HPP
-
-/**
- * \file rule_edit_command.hpp
- * \brief Implementation of rule-edit transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of rule-edit transport command.
- *
- * Replies:
- *
- *   - rule_error::invalid_index
- *   - rule_error::invalid_action
- */
-class rule_edit_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_RULE_EDIT_COMMAND_HPP
--- a/libirccd/irccd/daemon/rule_info_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
- * rule_info_command.cpp -- implementation of rule-info transport command
- *
- * Copyright (c) 2013-2018 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 "rule_info_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/rule_service.hpp>
-
-namespace irccd {
-
-std::string rule_info_command::get_name() const noexcept
-{
-    return "rule-info";
-}
-
-void rule_info_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto json = rule_service::to_json(irccd.rules().require(irccd.rules().get_index(args)));
-
-    json.push_back({"command", "rule-info"});
-    client.send(std::move(json));
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/rule_info_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * rule_info_command.hpp -- implementation of rule-info transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_RULE_INFO_COMMAND_HPP
-#define IRCCD_DAEMON_RULE_INFO_COMMAND_HPP
-
-/**
- * \file rule_info_command.hpp
- * \brief Implementation of rule-info transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of rule-info transport command.
- *
- * Replies:
- *
- *   - rule_error::invalid_index
- */
-class rule_info_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_RULE_INFO_COMMAND_HPP
--- a/libirccd/irccd/daemon/rule_list_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-/*
- * rule_list_command.cpp -- implementation of rule-list transport command
- *
- * Copyright (c) 2013-2018 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 "rule_list_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/rule_service.hpp>
-
-namespace irccd {
-
-std::string rule_list_command::get_name() const noexcept
-{
-    return "rule-list";
-}
-
-void rule_list_command::exec(irccd& irccd, transport_client& client, const nlohmann::json&)
-{
-    auto array = nlohmann::json::array();
-
-    for (const auto& rule : irccd.rules().list())
-        array.push_back(rule_service::to_json(rule));
-
-    client.send({
-        { "command",    "rule-list"         },
-        { "list",       std::move(array)    }
-    });
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/rule_list_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
- * rule_list_command.hpp -- implementation of rule-list transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_RULE_LIST_COMMAND_HPP
-#define IRCCD_DAEMON_RULE_LIST_COMMAND_HPP
-
-/**
- * \file rule_list_command.hpp
- * \brief Implementation of rule-list transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of rule-list transport command.
- */
-class rule_list_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_RULE_ADD_COMMAND_HPP
--- a/libirccd/irccd/daemon/rule_move_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-/*
- * rule_move_command.cpp -- implementation of rule-move transport command
- *
- * Copyright (c) 2013-2018 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 "rule_move_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/rule_service.hpp>
-
-namespace irccd {
-
-std::string rule_move_command::get_name() const noexcept
-{
-    return "rule-move";
-}
-
-void rule_move_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto from = rule_service::get_index(args, "from");
-    auto to = rule_service::get_index(args, "to");
-
-    /*
-     * Examples of moves
-     * --------------------------------------------------------------
-     *
-     * Before: [0] [1] [2]
-     *
-     * from = 0
-     * to   = 2
-     *
-     * After:  [1] [2] [0]
-     *
-     * --------------------------------------------------------------
-     *
-     * Before: [0] [1] [2]
-     *
-     * from = 2
-     * to   = 0
-     *
-     * After:  [2] [0] [1]
-     *
-     * --------------------------------------------------------------
-     *
-     * Before: [0] [1] [2]
-     *
-     * from = 0
-     * to   = 123
-     *
-     * After:  [1] [2] [0]
-     */
-
-    // Ignore dumb input.
-    if (from == to) {
-        client.success("rule-move");
-        return;
-    }
-
-    if (from >= irccd.rules().length())
-        throw rule_error(rule_error::error::invalid_index);
-
-    auto save = irccd.rules().list()[from];
-
-    irccd.rules().remove(from);
-    irccd.rules().insert(save, to > irccd.rules().length() ? irccd.rules().length() : to);
-    client.success("rule-move");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/rule_move_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * rule_move_command.hpp -- implementation of rule-move transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_RULE_MOVE_COMMAND_HPP
-#define IRCCD_DAEMON_RULE_MOVE_COMMAND_HPP
-
-/**
- * \file rule_move_command.hpp
- * \brief Implementation of rule-move transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of rule-move transport command.
- *
- * Replies:
- *
- *   - rule_error::invalid_index
- */
-class rule_move_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_RULE_MOVE_COMMAND_HPP
--- a/libirccd/irccd/daemon/rule_remove_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
- * rule_remove_command.cpp -- implementation of rule-remove transport command
- *
- * Copyright (c) 2013-2018 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 "rule_remove_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/rule_service.hpp>
-
-namespace irccd {
-
-std::string rule_remove_command::get_name() const noexcept
-{
-    return "rule-remove";
-}
-
-void rule_remove_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto index = rule_service::get_index(args);
-
-    if (index >= irccd.rules().length())
-        throw rule_error(rule_error::invalid_index);
-
-    irccd.rules().remove(index);
-    client.success("rule-remove");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/rule_remove_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * rule_remove_command.hpp -- implementation of rule-remove transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_RULE_REMOVE_COMMAND_HPP
-#define IRCCD_DAEMON_RULE_REMOVE_COMMAND_HPP
-
-/**
- * \file rule_remove_command.hpp
- * \brief Implementation of rule-remove transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of rule-remove transport command.
- *
- * Replies:
- *
- *   - rule_error::invalid_index
- */
-class rule_remove_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_RULE_REMOVE_COMMAND_HPP
--- a/libirccd/irccd/daemon/server_connect_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
- * server_connect_command.cpp -- implementation of server-connect transport command
- *
- * Copyright (c) 2013-2018 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 "server_connect_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/server_service.hpp>
-
-namespace irccd {
-
-std::string server_connect_command::get_name() const noexcept
-{
-    return "server-connect";
-}
-
-void server_connect_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto server = server_service::from_json(irccd.service(), args);
-
-    if (irccd.servers().has(server->name()))
-        throw server_error(server_error::error::already_exists, server->name());
-
-    irccd.servers().add(std::move(server));
-    client.success("server-connect");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/server_connect_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-/*
- * server_connect_command.hpp -- implementation of server-connect transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_SERVER_CONNECT_COMMAND_HPP
-#define IRCCD_DAEMON_SERVER_CONNECT_COMMAND_HPP
-
-/**
- * \file server_connect_command.hpp
- * \brief Implementation of server-connect transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of server-connect transport command.
- *
- * Replies:
- *
- *   - server_error::already_exists,
- *   - server_error::invalid_hostname,
- *   - server_error::invalid_identifier,
- *   - server_error::invalid_port_number,
- *   - server_error::ssl_disabled.
- */
-class server_connect_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_SERVER_CONNECT_COMMAND_HPP
--- a/libirccd/irccd/daemon/server_disconnect_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * server_disconnect_command.cpp -- implementation of server-disconnect transport command
- *
- * Copyright (c) 2013-2018 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 "server_disconnect_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/server_service.hpp>
-
-namespace irccd {
-
-std::string server_disconnect_command::get_name() const noexcept
-{
-    return "server-disconnect";
-}
-
-void server_disconnect_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto it = args.find("server");
-
-    if (it == args.end())
-        irccd.servers().clear();
-    else {
-        if (!it->is_string())
-            throw server_error(server_error::invalid_identifier, "");
-
-        auto name = it->get<std::string>();
-        auto s = irccd.servers().get(name);
-
-        if (!s)
-            throw server_error(server_error::not_found, name);
-
-        irccd.servers().remove(name);
-    }
-
-    client.success("server-disconnect");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/server_disconnect_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * server_disconnect_command.hpp -- implementation of server-disconnect transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_SERVER_DISCONNECT_COMMAND_HPP
-#define IRCCD_DAEMON_SERVER_DISCONNECT_COMMAND_HPP
-
-/**
- * \file server_disconnect_command.hpp
- * \brief Implementation of server-disconnect transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of server-disconnect transport command.
- *
- * Replies:
- *
- *   - server_error::invalid_identifier,
- *   - server_error::not_found.
- */
-class server_disconnect_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_SERVER_DISCONNECT_COMMAND_HPP
--- a/libirccd/irccd/daemon/server_info_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*
- * server_info_command.cpp -- implementation of server-info transport command
- *
- * Copyright (c) 2013-2018 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 "server_info_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/server_service.hpp>
-
-namespace irccd {
-
-std::string server_info_command::get_name() const noexcept
-{
-    return "server-info";
-}
-
-void server_info_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto response = nlohmann::json::object();
-    auto server = irccd.servers().require(args);
-
-    // General stuff.
-    response.push_back({"command", "server-info"});
-    response.push_back({"name", server->name()});
-    response.push_back({"host", server->host()});
-    response.push_back({"port", server->port()});
-    response.push_back({"nickname", server->nickname()});
-    response.push_back({"username", server->username()});
-    response.push_back({"realname", server->realname()});
-    response.push_back({"channels", server->channels()});
-
-    // Optional stuff.
-    if (server->flags() & server::ipv6)
-        response.push_back({"ipv6", true});
-    if (server->flags() & server::ssl)
-        response.push_back({"ssl", true});
-    if (server->flags() & server::ssl_verify)
-        response.push_back({"sslVerify", true});
-
-    client.send(response);
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/server_info_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * server_info_command.hpp -- implementation of server-info transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_SERVER_INFO_COMMAND_HPP
-#define IRCCD_DAEMON_SERVER_INFO_COMMAND_HPP
-
-/**
- * \file server_info_command.hpp
- * \brief Implementation of server-info transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of server-info transport command.
- *
- * Replies:
- *
- *   - server_error::invalid_identifier,
- *   - server_error::not_found.
- */
-class server_info_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_SERVER_INFO_COMMAND_HPP
--- a/libirccd/irccd/daemon/server_invite_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
- * server_invite_command.cpp -- implementation of server-invite transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "server_invite_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/server_service.hpp>
-
-namespace irccd {
-
-std::string server_invite_command::get_name() const noexcept
-{
-    return "server-invite";
-}
-
-void server_invite_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto server = irccd.servers().require(args);
-    auto target = json_util::get_string(args, "target");
-    auto channel = json_util::get_string(args, "channel");
-
-    if (target.empty())
-        throw server_error(server_error::invalid_nickname, server->name());
-    if (channel.empty())
-        throw server_error(server_error::invalid_channel, server->name());
-
-    server->invite(target, channel);
-    client.success("server-invite");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/server_invite_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
- * server_invite_command.hpp -- implementation of server-invite transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_SERVER_INVITE_COMMAND_HPP
-#define IRCCD_DAEMON_SERVER_INVITE_COMMAND_HPP
-
-/**
- * \file server_invite_command.hpp
- * \brief Implementation of server-invite transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of server-invite transport command.
- *
- * Replies:
- *
- *   - server_error::invalid_channel,
- *   - server_error::invalid_identifier,
- *   - server_error::invalid_nickname,
- *   - server_error::not_found.
- */
-class server_invite_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_SERVER_INVITE_COMMAND_HPP
--- a/libirccd/irccd/daemon/server_join_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * server_join_command.cpp -- implementation of server-join transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "server_join_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/server_service.hpp>
-
-namespace irccd {
-
-std::string server_join_command::get_name() const noexcept
-{
-    return "server-join";
-}
-
-void server_join_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto server = irccd.servers().require(args);
-    auto channel = json_util::get_string(args, "channel");
-    auto password = json_util::get_string(args, "password");
-
-    if (channel.empty())
-        throw server_error(server_error::invalid_channel, server->name());
-
-    server->join(channel, password);
-    client.success("server-join");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/server_join_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * server_join_command.hpp -- implementation of server-join transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_SERVER_JOIN_COMMAND_HPP
-#define IRCCD_DAEMON_SERVER_JOIN_COMMAND_HPP
-
-/**
- * \file server_join_command.hpp
- * \brief Implementation of server-join transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of server-join transport command.
- *
- * Replies:
- *
- *   - server_error::invalid_channel,
- *   - server_error::invalid_identifier,
- *   - server_error::not_found.
- */
-class server_join_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_SERVER_JOIN_COMMAND_HPP
--- a/libirccd/irccd/daemon/server_kick_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * server_kick_command.cpp -- implementation of server-kick transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "server_kick_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/server_service.hpp>
-
-namespace irccd {
-
-std::string server_kick_command::get_name() const noexcept
-{
-    return "server-kick";
-}
-
-void server_kick_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto server = irccd.servers().require(args);
-    auto target = json_util::get_string(args, "target");
-    auto channel = json_util::get_string(args, "channel");
-    auto reason = json_util::get_string(args, "reason");
-
-    if (target.empty())
-        throw server_error(server_error::invalid_nickname, server->name());
-    if (channel.empty())
-        throw server_error(server_error::invalid_channel, server->name());
-
-    server->kick(target, channel, reason);
-    client.success("server-kick");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/server_kick_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
- * server_kick_command.hpp -- implementation of server-kick transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_SERVER_KICK_COMMAND_HPP
-#define IRCCD_DAEMON_SERVER_KICK_COMMAND_HPP
-
-/**
- * \file server_kick_command.hpp
- * \brief Implementation of server-kick transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of server-kick transport command.
- *
- * Replies:
- *
- *   - server_error::invalid_channel,
- *   - server_error::invalid_identifier,
- *   - server_error::invalid_nickname,
- *   - server_error::not_found.
- */
-class server_kick_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_SERVER_KICK_COMMAND_HPP
--- a/libirccd/irccd/daemon/server_list_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*
- * server_list_command.cpp -- implementation of server-list transport command
- *
- * Copyright (c) 2013-2018 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 "server_list_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/server_service.hpp>
-
-namespace irccd {
-
-std::string server_list_command::get_name() const noexcept
-{
-    return "server-list";
-}
-
-void server_list_command::exec(irccd& irccd, transport_client& client, const nlohmann::json&)
-{
-    auto json = nlohmann::json::object();
-    auto list = nlohmann::json::array();
-
-    for (const auto& server : irccd.servers().servers())
-        list.push_back(server->name());
-
-    client.send({
-        { "command",    "server-list"   },
-        { "list",       std::move(list) }
-    });
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/server_list_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
- * server_list_command.hpp -- implementation of server-list transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_SERVER_LIST_COMMAND_HPP
-#define IRCCD_DAEMON_SERVER_LIST_COMMAND_HPP
-
-/**
- * \file server_list_command.hpp
- * \brief Implementation of server-list transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of server-list transport command.
- */
-class server_list_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_SERVER_LIST_COMMAND_HPP
--- a/libirccd/irccd/daemon/server_me_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * server_me_command.cpp -- implementation of server-me transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "server_me_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/server_service.hpp>
-
-namespace irccd {
-
-std::string server_me_command::get_name() const noexcept
-{
-    return "server-me";
-}
-
-void server_me_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto server = irccd.servers().require(args);
-    auto channel = json_util::get_string(args, "target");
-    auto message = json_util::get_string(args, "message");
-
-    if (channel.empty())
-        throw server_error(server_error::invalid_channel, server->name());
-
-    server->me(channel, message);
-    client.success("server-me");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/server_me_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * server_me_command.hpp -- implementation of server-me transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_SERVER_ME_COMMAND_HPP
-#define IRCCD_DAEMON_SERVER_ME_COMMAND_HPP
-
-/**
- * \file server_me_command.hpp
- * \brief Implementation of server-me transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of server-me transport command.
- *
- * Replies:
- *
- *   - server_error::invalid_channel,
- *   - server_error::invalid_identifier,
- *   - server_error::not_found.
- */
-class server_me_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_SERVER_ME_COMMAND_HPP
--- a/libirccd/irccd/daemon/server_message_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * server_message_command.cpp -- implementation of server-message transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "server_message_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/server_service.hpp>
-
-namespace irccd {
-
-std::string server_message_command::get_name() const noexcept
-{
-    return "server-message";
-}
-
-void server_message_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto server = irccd.servers().require(args);
-    auto channel = json_util::get_string(args, "target");
-    auto message = json_util::get_string(args, "message");
-
-    if (channel.empty())
-        throw server_error(server_error::invalid_channel, server->name());
-
-    server->message(channel, message);
-    client.success("server-message");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/server_message_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * server_message_command.hpp -- implementation of server-message transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_SERVER_MESSAGE_COMMAND_HPP
-#define IRCCD_DAEMON_SERVER_MESSAGE_COMMAND_HPP
-
-/**
- * \file server_message_command.hpp
- * \brief Implementation of server-message transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of server-message transport command.
- *
- * Replies:
- *
- *   - server_error::invalid_channel,
- *   - server_error::invalid_identifier,
- *   - server_error::not_found.
- */
-class server_message_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_SERVER_MESSAGE_COMMAND_HPP
--- a/libirccd/irccd/daemon/server_mode_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * server_mode_command.cpp -- implementation of server-mode transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "server_mode_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/server_service.hpp>
-
-namespace irccd {
-
-std::string server_mode_command::get_name() const noexcept
-{
-    return "server-mode";
-}
-
-void server_mode_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto server = irccd.servers().require(args);
-    auto channel = json_util::get_string(args, "channel");
-    auto mode = json_util::get_string(args, "mode");
-
-    if (channel.empty())
-        throw server_error(server_error::invalid_channel, server->name());
-    if (mode.empty())
-        throw server_error(server_error::invalid_mode, server->name());
-
-    auto limit = json_util::get_string(args, "limit");
-    auto user = json_util::get_string(args, "user");
-    auto mask = json_util::get_string(args, "mask");
-
-    server->mode(channel, mode, limit, user, mask);
-    client.success("server-mode");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/server_mode_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
- * server_mode_command.hpp -- implementation of server-mode transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_SERVER_MODE_COMMAND_HPP
-#define IRCCD_DAEMON_SERVER_MODE_COMMAND_HPP
-
-/**
- * \file server_mode_command.hpp
- * \brief Implementation of server-mode transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of server-mode transport command.
- *
- * Replies:
- *
- *   - server_error::invalid_channel,
- *   - server_error::invalid_identifier,
- *   - server_error::invalid_mode,
- *   - server_error::not_found.
- */
-class server_mode_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_SERVER_MODE_COMMAND_HPP
--- a/libirccd/irccd/daemon/server_nick_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*
- * server_nick_command.cpp -- implementation of server-nick transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "server_nick_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/server_service.hpp>
-
-namespace irccd {
-
-std::string server_nick_command::get_name() const noexcept
-{
-    return "server-nick";
-}
-
-void server_nick_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto server = irccd.servers().require(args);
-    auto nick = json_util::get_string(args, "nickname");
-
-    if (nick.empty())
-        throw server_error(server_error::invalid_nickname, server->name());
-
-    server->set_nickname(nick);
-    client.success("server-nick");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/server_nick_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * server_nick_command.hpp -- implementation of server-nick transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_SERVER_NICK_COMMAND_HPP
-#define IRCCD_DAEMON_SERVER_NICK_COMMAND_HPP
-
-/**
- * \file server_nick_command.hpp
- * \brief Implementation of server-nick transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of server-nick transport command.
- *
- * Replies:
- *
- *   - server_error::invalid_identifier,
- *   - server_error::invalid_nickname,
- *   - server_error::not_found.
- */
-class server_nick_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_SERVER_NICK_COMMAND_HPP
--- a/libirccd/irccd/daemon/server_notice_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * server_notice_command.cpp -- implementation of server-notice transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "server_notice_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/server_service.hpp>
-
-namespace irccd {
-
-std::string server_notice_command::get_name() const noexcept
-{
-    return "server-notice";
-}
-
-void server_notice_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto server = irccd.servers().require(args);
-    auto channel = json_util::get_string(args, "target");
-    auto message = json_util::get_string(args, "message");
-
-    if (channel.empty())
-        throw server_error(server_error::invalid_channel, server->name());
-
-    server->notice(channel, message);
-    client.success("server-notice");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/server_notice_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * server_notice_command.hpp -- implementation of server-notice transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_SERVER_NOTICE_COMMAND_HPP
-#define IRCCD_DAEMON_SERVER_NOTICE_COMMAND_HPP
-
-/**
- * \file server_notice_command.hpp
- * \brief Implementation of server-notice transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of server-notice transport command.
- *
- * Replies:
- *
- *   - server_error::invalid_channel,
- *   - server_error::invalid_identifier,
- *   - server_error::not_found.
- */
-class server_notice_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_SERVER_NOTICE_COMMAND_HPP
--- a/libirccd/irccd/daemon/server_part_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * server_part_command.cpp -- implementation of server-part transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "server_part_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/server_service.hpp>
-
-namespace irccd {
-
-std::string server_part_command::get_name() const noexcept
-{
-    return "server-part";
-}
-
-void server_part_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto server = irccd.servers().require(args);
-    auto channel = json_util::get_string(args, "channel");
-    auto reason = json_util::get_string(args, "reason");
-
-    if (channel.empty())
-        throw server_error(server_error::invalid_channel, server->name());
-
-    server->part(channel, reason);
-    client.success("server-part");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/server_part_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * server_part_command.hpp -- implementation of server-part transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_SERVER_PART_COMMAND_HPP
-#define IRCCD_DAEMON_SERVER_PART_COMMAND_HPP
-
-/**
- * \file server_part_command.hpp
- * \brief Implementation of server-part transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of server-part transport command.
- *
- * Replies:
- *
- *   - server_error::invalid_channel,
- *   - server_error::invalid_identifier,
- *   - server_error::not_found.
- */
-class server_part_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_SERVER_PART_COMMAND_HPP
--- a/libirccd/irccd/daemon/server_reconnect_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-/*
- * server_reconnect_command.cpp -- implementation of server-reconnect transport command
- *
- * Copyright (c) 2013-2018 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/string_util.hpp>
-
-#include "irccd.hpp"
-#include "server_reconnect_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/server_service.hpp>
-
-namespace irccd {
-
-std::string server_reconnect_command::get_name() const noexcept
-{
-    return "server-reconnect";
-}
-
-void server_reconnect_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto server = args.find("server");
-
-    if (server == args.end()) {
-        for (auto& server : irccd.servers().servers())
-            server->reconnect();
-    } else {
-        if (!server->is_string() || !string_util::is_identifier(server->get<std::string>()))
-            throw server_error(server_error::invalid_identifier, "");
-
-        auto name = server->get<std::string>();
-        auto s = irccd.servers().get(name);
-
-        if (!s)
-            throw server_error(server_error::not_found, name);
-
-        s->reconnect();
-    }
-
-    client.success("server-reconnect");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/server_reconnect_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * server_reconnect_command.hpp -- implementation of server-reconnect transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_SERVER_RECONNECT_COMMAND_HPP
-#define IRCCD_DAEMON_SERVER_RECONNECT_COMMAND_HPP
-
-/**
- * \file server_reconnect_command.hpp
- * \brief Implementation of server-reconnect transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of server-reconnect transport command.
- *
- * Replies:
- *
- *   - server_error::invalid_identifier,
- *   - server_error::not_found.
- */
-class server_reconnect_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_SERVER_RECONNECT_COMMAND_HPP
--- a/libirccd/irccd/daemon/server_topic_command.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * server_topic_command.cpp -- implementation of server-topic transport command
- *
- * Copyright (c) 2013-2018 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/json_util.hpp>
-
-#include "irccd.hpp"
-#include "server_topic_command.hpp"
-#include "transport_client.hpp"
-
-#include <irccd/daemon/service/server_service.hpp>
-
-namespace irccd {
-
-std::string server_topic_command::get_name() const noexcept
-{
-    return "server-topic";
-}
-
-void server_topic_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args)
-{
-    auto server = irccd.servers().require(args);
-    auto channel = json_util::get_string(args, "channel");
-    auto topic = json_util::get_string(args, "topic");
-
-    if (channel.empty())
-        throw server_error(server_error::invalid_channel, server->name());
-
-    server->topic(channel, topic);
-    client.success("server-topic");
-}
-
-} // !irccd
--- a/libirccd/irccd/daemon/server_topic_command.hpp	Wed Mar 07 17:49:56 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * server_topic_command.hpp -- implementation of server-topic transport command
- *
- * Copyright (c) 2013-2018 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_DAEMON_SERVER_TOPIC_COMMAND_HPP
-#define IRCCD_DAEMON_SERVER_TOPIC_COMMAND_HPP
-
-/**
- * \file server_topic_command.hpp
- * \brief Implementation of server-topic transport command.
- */
-
-#include "command.hpp"
-
-namespace irccd {
-
-/**
- * \brief Implementation of server-topic transport command.
- *
- * Replies:
- *
- *   - server_error::invalid_channel,
- *   - server_error::invalid_identifier,
- *   - server_error::not_found.
- */
-class server_topic_command : public command {
-public:
-    /**
-     * \copydoc command::get_name
-     */
-    std::string get_name() const noexcept override;
-
-    /**
-     * \copydoc command::exec
-     */
-    void exec(irccd& irccd, transport_client& client, const nlohmann::json& args) override;
-};
-
-} // !irccd
-
-#endif // !IRCCD_DAEMON_SERVER_TOPIC_COMMAND_HPP
--- a/tests/src/libirccd/command-plugin-config/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-plugin-config/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "plugin-config"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/plugin_config_command.hpp>
+#include <irccd/daemon/command/plugin_config_command.hpp>
 #include <irccd/daemon/service/plugin_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-plugin-info/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-plugin-info/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "plugin-info"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/plugin_info_command.hpp>
+#include <irccd/daemon/command/plugin_info_command.hpp>
 #include <irccd/daemon/service/plugin_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-plugin-list/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-plugin-list/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "plugin-list"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/plugin_list_command.hpp>
+#include <irccd/daemon/command/plugin_list_command.hpp>
 #include <irccd/daemon/service/plugin_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-plugin-load/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-plugin-load/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "plugin-load"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/plugin_load_command.hpp>
+#include <irccd/daemon/command/plugin_load_command.hpp>
 #include <irccd/daemon/service/plugin_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-plugin-reload/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-plugin-reload/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "plugin-reload"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/plugin_reload_command.hpp>
+#include <irccd/daemon/command/plugin_reload_command.hpp>
 #include <irccd/daemon/service/plugin_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-plugin-unload/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-plugin-unload/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "plugin-unload"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/plugin_unload_command.hpp>
+#include <irccd/daemon/command/plugin_unload_command.hpp>
 #include <irccd/daemon/service/plugin_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-rule-add/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-rule-add/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -21,8 +21,8 @@
 
 #include <irccd/json_util.hpp>
 
-#include <irccd/daemon/rule_add_command.hpp>
-#include <irccd/daemon/rule_list_command.hpp>
+#include <irccd/daemon/command/rule_add_command.hpp>
+#include <irccd/daemon/command/rule_list_command.hpp>
 #include <irccd/daemon/service/rule_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-rule-edit/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-rule-edit/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -21,8 +21,8 @@
 
 #include <irccd/json_util.hpp>
 
-#include <irccd/daemon/rule_edit_command.hpp>
-#include <irccd/daemon/rule_info_command.hpp>
+#include <irccd/daemon/command/rule_edit_command.hpp>
+#include <irccd/daemon/command/rule_info_command.hpp>
 #include <irccd/daemon/service/rule_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-rule-info/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-rule-info/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -21,7 +21,7 @@
 
 #include <irccd/json_util.hpp>
 
-#include <irccd/daemon/rule_info_command.hpp>
+#include <irccd/daemon/command/rule_info_command.hpp>
 #include <irccd/daemon/service/rule_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-rule-list/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-rule-list/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -21,7 +21,7 @@
 
 #include <irccd/json_util.hpp>
 
-#include <irccd/daemon/rule_list_command.hpp>
+#include <irccd/daemon/command/rule_list_command.hpp>
 #include <irccd/daemon/service/rule_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-rule-move/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-rule-move/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -21,8 +21,8 @@
 
 #include <irccd/json_util.hpp>
 
-#include <irccd/daemon/rule_list_command.hpp>
-#include <irccd/daemon/rule_move_command.hpp>
+#include <irccd/daemon/command/rule_list_command.hpp>
+#include <irccd/daemon/command/rule_move_command.hpp>
 #include <irccd/daemon/service/rule_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-rule-remove/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-rule-remove/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -21,8 +21,8 @@
 
 #include <irccd/json_util.hpp>
 
-#include <irccd/daemon/rule_remove_command.hpp>
-#include <irccd/daemon/rule_list_command.hpp>
+#include <irccd/daemon/command/rule_remove_command.hpp>
+#include <irccd/daemon/command/rule_list_command.hpp>
 #include <irccd/daemon/service/rule_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-server-connect/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-server-connect/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "server-connect"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/server_connect_command.hpp>
+#include <irccd/daemon/command/server_connect_command.hpp>
 #include <irccd/daemon/service/server_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-server-disconnect/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-server-disconnect/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "server-disconnect"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/server_disconnect_command.hpp>
+#include <irccd/daemon/command/server_disconnect_command.hpp>
 #include <irccd/daemon/service/server_service.hpp>
 
 #include <irccd/test/journal_server.hpp>
--- a/tests/src/libirccd/command-server-info/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-server-info/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "server-info"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/server_info_command.hpp>
+#include <irccd/daemon/command/server_info_command.hpp>
 #include <irccd/daemon/service/server_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-server-invite/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-server-invite/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "server-invite"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/server_invite_command.hpp>
+#include <irccd/daemon/command/server_invite_command.hpp>
 #include <irccd/daemon/service/server_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-server-join/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-server-join/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "server-join"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/server_join_command.hpp>
+#include <irccd/daemon/command/server_join_command.hpp>
 #include <irccd/daemon/service/server_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-server-kick/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-server-kick/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "server-kick"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/server_kick_command.hpp>
+#include <irccd/daemon/command/server_kick_command.hpp>
 #include <irccd/daemon/service/server_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-server-list/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-server-list/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "server-list"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/server_list_command.hpp>
+#include <irccd/daemon/command/server_list_command.hpp>
 #include <irccd/daemon/service/server_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-server-me/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-server-me/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "server-me"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/server_me_command.hpp>
+#include <irccd/daemon/command/server_me_command.hpp>
 #include <irccd/daemon/service/server_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-server-message/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-server-message/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "server-message"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/server_message_command.hpp>
+#include <irccd/daemon/command/server_message_command.hpp>
 #include <irccd/daemon/service/server_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-server-mode/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-server-mode/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "server-mode"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/server_mode_command.hpp>
+#include <irccd/daemon/command/server_mode_command.hpp>
 #include <irccd/daemon/service/server_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-server-nick/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-server-nick/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "server-nick"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/server_nick_command.hpp>
+#include <irccd/daemon/command/server_nick_command.hpp>
 #include <irccd/daemon/service/server_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-server-notice/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-server-notice/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "server-notice"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/server_notice_command.hpp>
+#include <irccd/daemon/command/server_notice_command.hpp>
 #include <irccd/daemon/service/server_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-server-part/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-server-part/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "server-part"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/server_part_command.hpp>
+#include <irccd/daemon/command/server_part_command.hpp>
 #include <irccd/daemon/service/server_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-server-reconnect/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-server-reconnect/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "server-reconnect"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/server_reconnect_command.hpp>
+#include <irccd/daemon/command/server_reconnect_command.hpp>
 #include <irccd/daemon/service/server_service.hpp>
 
 #include <irccd/test/command_test.hpp>
--- a/tests/src/libirccd/command-server-topic/main.cpp	Wed Mar 07 17:49:56 2018 +0100
+++ b/tests/src/libirccd/command-server-topic/main.cpp	Wed Mar 07 21:00:56 2018 +0100
@@ -19,7 +19,7 @@
 #define BOOST_TEST_MODULE "server-topic"
 #include <boost/test/unit_test.hpp>
 
-#include <irccd/daemon/server_topic_command.hpp>
+#include <irccd/daemon/command/server_topic_command.hpp>
 #include <irccd/daemon/service/server_service.hpp>
 
 #include <irccd/test/command_test.hpp>