changeset 841:1399755352e7

irccd: use appropriate function names in bot
author David Demelier <markand@malikania.fr>
date Fri, 14 Jun 2019 20:53:00 +0200
parents fdb1e0f5fd6d
children 0df3a4977bf9
files irccd-test/main.cpp irccd/main.cpp libirccd-daemon/irccd/daemon/bot.cpp libirccd-daemon/irccd/daemon/bot.hpp libirccd-daemon/irccd/daemon/plugin_service.hpp libirccd-daemon/irccd/daemon/server_service.cpp libirccd-daemon/irccd/daemon/transport_command.cpp libirccd-js/irccd/js/plugin_api.cpp libirccd-js/irccd/js/server_api.cpp libirccd-test/irccd/test/cli_fixture.cpp libirccd-test/irccd/test/command_fixture.cpp libirccd-test/irccd/test/irccd_fixture.cpp libirccd-test/irccd/test/js_plugin_fixture.cpp tests/src/irccdctl/cli-plugin-config/main.cpp tests/src/irccdctl/cli-plugin-info/main.cpp tests/src/irccdctl/cli-plugin-list/main.cpp tests/src/irccdctl/cli-plugin-load/main.cpp tests/src/irccdctl/cli-plugin-reload/main.cpp tests/src/irccdctl/cli-plugin-unload/main.cpp tests/src/irccdctl/cli-rule-edit/main.cpp tests/src/irccdctl/cli-rule-info/main.cpp tests/src/irccdctl/cli-rule-list/main.cpp tests/src/irccdctl/cli-rule-move/main.cpp tests/src/irccdctl/cli-rule-remove/main.cpp tests/src/irccdctl/cli-server-disconnect/main.cpp tests/src/irccdctl/cli-server-list/main.cpp tests/src/irccdctl/cli-server-reconnect/main.cpp tests/src/libirccd-daemon/command-plugin-config/main.cpp tests/src/libirccd-daemon/command-plugin-list/main.cpp tests/src/libirccd-daemon/command-plugin-load/main.cpp tests/src/libirccd-daemon/command-plugin-reload/main.cpp tests/src/libirccd-daemon/command-plugin-unload/main.cpp tests/src/libirccd-daemon/command-rule-edit/main.cpp tests/src/libirccd-daemon/command-rule-info/main.cpp tests/src/libirccd-daemon/command-rule-list/main.cpp tests/src/libirccd-daemon/command-rule-move/main.cpp tests/src/libirccd-daemon/command-rule-remove/main.cpp tests/src/libirccd-daemon/command-server-connect/main.cpp tests/src/libirccd-daemon/command-server-disconnect/main.cpp tests/src/libirccd-daemon/command-server-info/main.cpp tests/src/libirccd-daemon/command-server-list/main.cpp tests/src/libirccd-daemon/command-server-reconnect/main.cpp tests/src/libirccd-js/js-plugin/main.cpp tests/src/plugins/plugin/main.cpp
diffstat 44 files changed, 174 insertions(+), 173 deletions(-) [+]
line wrap: on
line diff
--- a/irccd-test/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/irccd-test/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -142,11 +142,11 @@
 	if (name.empty())
 		name = "test";
 
-	auto s = daemon->servers().get(name);
+	auto s = daemon->get_servers().get(name);
 
 	if (!s) {
 		s = std::make_shared<debug_server>(io, std::move(name), "localhost");
-		daemon->servers().add(s);
+		daemon->get_servers().add(s);
 	}
 
 	return s;
@@ -598,8 +598,8 @@
 	if (argc <= 0)
 		usage();
 
-	daemon->plugins().load("test", boost::filesystem::exists(argv[0]) ? argv[0] : "");
-	plugin = daemon->plugins().get("test");
+	daemon->get_plugins().load("test", boost::filesystem::exists(argv[0]) ? argv[0] : "");
+	plugin = daemon->get_plugins().get("test");
 }
 
 // }}}
@@ -643,7 +643,7 @@
 void load(int argc, char** argv)
 {
 	daemon = std::make_unique<bot>(io);
-	daemon->plugins().add_loader(std::make_unique<dynlib_plugin_loader>());
+	daemon->get_plugins().add_loader(std::make_unique<dynlib_plugin_loader>());
 
 #if defined(IRCCD_HAVE_JS)
 	auto loader = std::make_unique<js::plugin_loader>(*daemon);
@@ -651,7 +651,7 @@
 	for (const auto& f : js::api::registry())
 		loader->get_modules().push_back(f());
 
-	daemon->plugins().add_loader(std::move(loader));
+	daemon->get_plugins().add_loader(std::move(loader));
 #endif
 
 	load_options(argc, argv);
--- a/irccd/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/irccd/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -179,10 +179,10 @@
 
 	// 1. Load commands.
 	for (const auto& f : transport_command::registry())
-		instance->transports().get_commands().push_back(f());
+		instance->get_transports().get_commands().push_back(f());
 
 	// 2. Load plugin loaders.
-	instance->plugins().add_loader(std::make_unique<dynlib_plugin_loader>());
+	instance->get_plugins().add_loader(std::make_unique<dynlib_plugin_loader>());
 
 #if defined(IRCCD_HAVE_JS)
 	auto loader = std::make_unique<js::plugin_loader>(*instance);
@@ -190,7 +190,7 @@
 	for (const auto& f : js::api::registry())
 		loader->get_modules().push_back(f());
 
-	instance->plugins().add_loader(std::move(loader));
+	instance->get_plugins().add_loader(std::move(loader));
 #endif
 
 	const auto options = parse(argc, argv);
--- a/libirccd-daemon/irccd/daemon/bot.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/libirccd-daemon/irccd/daemon/bot.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -228,22 +228,22 @@
 	return *sink_;
 }
 
-auto bot::servers() noexcept -> server_service&
+auto bot::get_servers() noexcept -> server_service&
 {
 	return *server_service_;
 }
 
-auto bot::transports() noexcept -> transport_service&
+auto bot::get_transports() noexcept -> transport_service&
 {
 	return *tpt_service_;
 }
 
-auto bot::rules() noexcept -> rule_service&
+auto bot::get_rules() noexcept -> rule_service&
 {
 	return *rule_service_;
 }
 
-auto bot::plugins() noexcept -> plugin_service&
+auto bot::get_plugins() noexcept -> plugin_service&
 {
 	return *plugin_service_;
 }
--- a/libirccd-daemon/irccd/daemon/bot.hpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/libirccd-daemon/irccd/daemon/bot.hpp	Fri Jun 14 20:53:00 2019 +0200
@@ -160,28 +160,28 @@
 	 *
 	 * \return the service
 	 */
-	auto servers() noexcept -> server_service&;
+	auto get_servers() noexcept -> server_service&;
 
 	/**
 	 * Access the transport service.
 	 *
 	 * \return the service
 	 */
-	auto transports() noexcept -> transport_service&;
+	auto get_transports() noexcept -> transport_service&;
 
 	/**
 	 * Access the rule service.
 	 *
 	 * \return the service
 	 */
-	auto rules() noexcept -> rule_service&;
+	auto get_rules() noexcept -> rule_service&;
 
 	/**
 	 * Access the plugin service.
 	 *
 	 * \return the service
 	 */
-	auto plugins() noexcept -> plugin_service&;
+	auto get_plugins() noexcept -> plugin_service&;
 
 	/**
 	 * Load and re-apply the configuration to the daemon.
--- a/libirccd-daemon/irccd/daemon/plugin_service.hpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/libirccd-daemon/irccd/daemon/plugin_service.hpp	Fri Jun 14 20:53:00 2019 +0200
@@ -27,6 +27,7 @@
 #include <irccd/sysconfig.hpp>
 
 #include <cassert>
+#include <functional>
 #include <memory>
 #include <string>
 #include <string_view>
--- a/libirccd-daemon/irccd/daemon/server_service.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/libirccd-daemon/irccd/daemon/server_service.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -67,9 +67,9 @@
                           EventNameFunc&& name_func,
                           ExecFunc exec_func)
 {
-	for (const auto& plugin : bot_.plugins().list()) {
+	for (const auto& plugin : bot_.get_plugins().list()) {
 		const auto eventname = name_func(*plugin);
-		const auto allowed = bot_.rules().solve(server, target, origin, plugin->get_name(), eventname);
+		const auto allowed = bot_.get_rules().solve(server, target, origin, plugin->get_name(), eventname);
 
 		if (!allowed) {
 			bot_.get_log().debug("rule", "") << "event skipped on match" << std::endl;
@@ -98,7 +98,7 @@
 void dispatcher::operator()(const connect_event& ev)
 {
 	bot_.get_log().debug(*ev.server) << "event onConnect" << std::endl;
-	bot_.transports().broadcast(nlohmann::json::object({
+	bot_.get_transports().broadcast(nlohmann::json::object({
 		{ "event",      "onConnect"             },
 		{ "server",     ev.server->get_id()     }
 	}));
@@ -116,7 +116,7 @@
 void dispatcher::operator()(const disconnect_event& ev)
 {
 	bot_.get_log().debug(*ev.server) << "event onDisconnect" << std::endl;
-	bot_.transports().broadcast(nlohmann::json::object({
+	bot_.get_transports().broadcast(nlohmann::json::object({
 		{ "event",      "onDisconnect"          },
 		{ "server",     ev.server->get_id()     }
 	}));
@@ -138,7 +138,7 @@
 	bot_.get_log().debug(*ev.server) << "  channel: " << ev.channel << std::endl;
 	bot_.get_log().debug(*ev.server) << "  target: " << ev.nickname << std::endl;
 
-	bot_.transports().broadcast(nlohmann::json::object({
+	bot_.get_transports().broadcast(nlohmann::json::object({
 		{ "event",      "onInvite"              },
 		{ "server",     ev.server->get_id()     },
 		{ "origin",     ev.origin               },
@@ -161,7 +161,7 @@
 	bot_.get_log().debug(*ev.server) << "  origin: " << ev.origin << std::endl;
 	bot_.get_log().debug(*ev.server) << "  channel: " << ev.channel << std::endl;
 
-	bot_.transports().broadcast(nlohmann::json::object({
+	bot_.get_transports().broadcast(nlohmann::json::object({
 		{ "event",      "onJoin"                },
 		{ "server",     ev.server->get_id()     },
 		{ "origin",     ev.origin               },
@@ -186,7 +186,7 @@
 	bot_.get_log().debug(*ev.server) << "  target: " << ev.target << std::endl;
 	bot_.get_log().debug(*ev.server) << "  reason: " << ev.reason << std::endl;
 
-	bot_.transports().broadcast(nlohmann::json::object({
+	bot_.get_transports().broadcast(nlohmann::json::object({
 		{ "event",      "onKick"                },
 		{ "server",     ev.server->get_id()     },
 		{ "origin",     ev.origin               },
@@ -212,7 +212,7 @@
 	bot_.get_log().debug(*ev.server) << "  channel: " << ev.channel << std::endl;
 	bot_.get_log().debug(*ev.server) << "  message: " << ev.message << std::endl;
 
-	bot_.transports().broadcast(nlohmann::json::object({
+	bot_.get_transports().broadcast(nlohmann::json::object({
 		{ "event",      "onMessage"             },
 		{ "server",     ev.server->get_id()     },
 		{ "origin",     ev.origin               },
@@ -253,7 +253,7 @@
 	bot_.get_log().debug(*ev.server) << "  target: " << ev.channel << std::endl;
 	bot_.get_log().debug(*ev.server) << "  message: " << ev.message << std::endl;
 
-	bot_.transports().broadcast(nlohmann::json::object({
+	bot_.get_transports().broadcast(nlohmann::json::object({
 		{ "event",      "onMe"                  },
 		{ "server",     ev.server->get_id()     },
 		{ "origin",     ev.origin               },
@@ -281,7 +281,7 @@
 	bot_.get_log().debug(*ev.server) << "  user: " << ev.user << std::endl;
 	bot_.get_log().debug(*ev.server) << "  mask: " << ev.mask << std::endl;
 
-	bot_.transports().broadcast(nlohmann::json::object({
+	bot_.get_transports().broadcast(nlohmann::json::object({
 		{ "event",      "onMode"                },
 		{ "server",     ev.server->get_id()     },
 		{ "origin",     ev.origin               },
@@ -313,7 +313,7 @@
 	for (const auto& v : ev.names)
 		names.push_back(v);
 
-	bot_.transports().broadcast(nlohmann::json::object({
+	bot_.get_transports().broadcast(nlohmann::json::object({
 		{ "event",      "onNames"               },
 		{ "server",     ev.server->get_id()     },
 		{ "channel",    ev.channel              },
@@ -336,7 +336,7 @@
 	bot_.get_log().debug(*ev.server) << "  origin: " << ev.origin << std::endl;
 	bot_.get_log().debug(*ev.server) << "  nickname: " << ev.nickname << std::endl;
 
-	bot_.transports().broadcast(nlohmann::json::object({
+	bot_.get_transports().broadcast(nlohmann::json::object({
 		{ "event",      "onNick"                },
 		{ "server",     ev.server->get_id()     },
 		{ "origin",     ev.origin               },
@@ -360,7 +360,7 @@
 	bot_.get_log().debug(*ev.server) << "  channel: " << ev.channel << std::endl;
 	bot_.get_log().debug(*ev.server) << "  message: " << ev.message << std::endl;
 
-	bot_.transports().broadcast(nlohmann::json::object({
+	bot_.get_transports().broadcast(nlohmann::json::object({
 		{ "event",      "onNotice"              },
 		{ "server",     ev.server->get_id()     },
 		{ "origin",     ev.origin               },
@@ -385,7 +385,7 @@
 	bot_.get_log().debug(*ev.server) << "  channel: " << ev.channel << std::endl;
 	bot_.get_log().debug(*ev.server) << "  reason: " << ev.reason << std::endl;
 
-	bot_.transports().broadcast(nlohmann::json::object({
+	bot_.get_transports().broadcast(nlohmann::json::object({
 		{ "event",      "onPart"                },
 		{ "server",     ev.server->get_id()     },
 		{ "origin",     ev.origin               },
@@ -410,7 +410,7 @@
 	bot_.get_log().debug(*ev.server) << "  channel: " << ev.channel << std::endl;
 	bot_.get_log().debug(*ev.server) << "  topic: " << ev.topic << std::endl;
 
-	bot_.transports().broadcast(nlohmann::json::object({
+	bot_.get_transports().broadcast(nlohmann::json::object({
 		{ "event",      "onTopic"               },
 		{ "server",     ev.server->get_id()     },
 		{ "origin",     ev.origin               },
@@ -437,7 +437,7 @@
 	bot_.get_log().debug(*ev.server) << "  realname: " << ev.whois.realname << std::endl;
 	bot_.get_log().debug(*ev.server) << "  channels: " << string_util::join(ev.whois.channels, ", ") << std::endl;
 
-	bot_.transports().broadcast(nlohmann::json::object({
+	bot_.get_transports().broadcast(nlohmann::json::object({
 		{ "event",      "onWhois"               },
 		{ "server",     ev.server->get_id()     },
 		{ "nickname",   ev.whois.nick           },
@@ -500,7 +500,7 @@
 	}
 
 	recv(server);
-	std::visit(dispatcher(bot_), event);
+	std::visit(dispatcher{bot_}, event);
 }
 
 void server_service::handle_wait(const std::shared_ptr<server>& server, const std::error_code& code)
--- a/libirccd-daemon/irccd/daemon/transport_command.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/libirccd-daemon/irccd/daemon/transport_command.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -140,7 +140,7 @@
 	if (!id || !string_util::is_identifier(*id))
 		throw plugin_error(plugin_error::invalid_identifier);
 
-	const auto plugin = bot.plugins().require(*id);
+	const auto plugin = bot.get_plugins().require(*id);
 
 	if (args.count("value") > 0)
 		exec_set(client, *plugin, args);
@@ -164,7 +164,7 @@
 	if (!id || !string_util::is_identifier(*id))
 		throw plugin_error(plugin_error::invalid_identifier);
 
-	const auto plugin = bot.plugins().require(*id);
+	const auto plugin = bot.get_plugins().require(*id);
 
 	client.write({
 		{ "command",    "plugin-info"                           },
@@ -188,7 +188,7 @@
 {
 	auto list = nlohmann::json::array();
 
-	for (const auto& plg : bot.plugins().list())
+	for (const auto& plg : bot.get_plugins().list())
 		list += plg->get_id();
 
 	client.write({
@@ -213,7 +213,7 @@
 	if (!id || !string_util::is_identifier(*id))
 		throw plugin_error(plugin_error::invalid_identifier);
 
-	bot.plugins().load(*id, "");
+	bot.get_plugins().load(*id, "");
 	client.success("plugin-load");
 }
 
@@ -233,7 +233,7 @@
 	if (!id || !string_util::is_identifier(*id))
 		throw plugin_error(plugin_error::invalid_identifier);
 
-	bot.plugins().reload(*id);
+	bot.get_plugins().reload(*id);
 	client.success("plugin-reload");
 }
 
@@ -253,7 +253,7 @@
 	if (!id || !string_util::is_identifier(*id))
 		throw plugin_error(plugin_error::invalid_identifier);
 
-	bot.plugins().unload(*id);
+	bot.get_plugins().unload(*id);
 	client.success("plugin-unload");
 }
 
@@ -268,12 +268,12 @@
 
 void rule_add_command::exec(bot& bot, transport_client& client, const document& args)
 {
-	const auto index = args.optional<std::size_t>("index", bot.rules().list().size());
+	const auto index = args.optional<std::size_t>("index", bot.get_rules().list().size());
 
-	if (!index || *index > bot.rules().list().size())
+	if (!index || *index > bot.get_rules().list().size())
 		throw rule_error(rule_error::error::invalid_index);
 
-	bot.rules().insert(rule_util::from_json(args), *index);
+	bot.get_rules().insert(rule_util::from_json(args), *index);
 	client.success("rule-add");
 }
 
@@ -305,7 +305,7 @@
 		throw rule_error(rule_error::invalid_index);
 
 	// Create a copy to avoid incomplete edition in case of errors.
-	auto rule = bot.rules().require(*index);
+	auto rule = bot.get_rules().require(*index);
 
 	updateset(rule.channels, args, "channels");
 	updateset(rule.events, args, "events");
@@ -327,7 +327,7 @@
 	}
 
 	// All done, sync the rule.
-	bot.rules().require(*index) = rule;
+	bot.get_rules().require(*index) = rule;
 	client.success("rule-edit");
 }
 
@@ -347,7 +347,7 @@
 	if (!index)
 		throw rule_error(rule_error::invalid_index);
 
-	auto json = rule_util::to_json(bot.rules().require(*index));
+	auto json = rule_util::to_json(bot.get_rules().require(*index));
 
 	json.push_back({"command", "rule-info"});
 	client.write(std::move(json));
@@ -366,7 +366,7 @@
 {
 	auto array = nlohmann::json::array();
 
-	for (const auto& rule : bot.rules().list())
+	for (const auto& rule : bot.get_rules().list())
 		array.push_back(rule_util::to_json(rule));
 
 	client.write({
@@ -428,13 +428,13 @@
 		return;
 	}
 
-	if (*from >= bot.rules().list().size())
+	if (*from >= bot.get_rules().list().size())
 		throw rule_error(rule_error::error::invalid_index);
 
-	const auto save = bot.rules().list()[*from];
+	const auto save = bot.get_rules().list()[*from];
 
-	bot.rules().remove(*from);
-	bot.rules().insert(save, *to > bot.rules().list().size() ? bot.rules().list().size() : *to);
+	bot.get_rules().remove(*from);
+	bot.get_rules().insert(save, *to > bot.get_rules().list().size() ? bot.get_rules().list().size() : *to);
 	client.success("rule-move");
 }
 
@@ -451,10 +451,10 @@
 {
 	const auto index = args.get<std::size_t>("index");
 
-	if (!index || *index >= bot.rules().list().size())
+	if (!index || *index >= bot.get_rules().list().size())
 		throw rule_error(rule_error::invalid_index);
 
-	bot.rules().remove(*index);
+	bot.get_rules().remove(*index);
 	client.success("rule-remove");
 }
 
@@ -471,10 +471,10 @@
 {
 	auto server = server_util::from_json(bot.get_service(), args);
 
-	if (bot.servers().has(server->get_id()))
+	if (bot.get_servers().has(server->get_id()))
 		throw server_error(server_error::already_exists);
 
-	bot.servers().add(std::move(server));
+	bot.get_servers().add(std::move(server));
 	client.success("server-connect");
 }
 
@@ -492,15 +492,15 @@
 	const auto it = args.find("server");
 
 	if (it == args.end())
-		bot.servers().clear();
+		bot.get_servers().clear();
 	else {
 		if (!it->is_string() || !string_util::is_identifier(it->get<std::string>()))
 			throw server_error(server_error::invalid_identifier);
 
 		const auto name = it->get<std::string>();
 
-		bot.servers().require(name);
-		bot.servers().remove(name);
+		bot.get_servers().require(name);
+		bot.get_servers().remove(name);
 	}
 
 	client.success("server-disconnect");
@@ -522,7 +522,7 @@
 	if (!id || !string_util::is_identifier(*id))
 		throw server_error(server_error::invalid_identifier);
 
-	const auto server = bot.servers().require(*id);
+	const auto server = bot.get_servers().require(*id);
 
 	// Construct the JSON response.
 	auto response = document::object();
@@ -567,7 +567,7 @@
 	if (!channel || channel->empty())
 		throw server_error(server_error::invalid_channel);
 
-	bot.servers().require(*id)->invite(*target, *channel);
+	bot.get_servers().require(*id)->invite(*target, *channel);
 	client.success("server-invite");
 }
 
@@ -593,7 +593,7 @@
 	if (!password)
 		throw server_error(server_error::invalid_password);
 
-	bot.servers().require(*id)->join(*channel, *password);
+	bot.get_servers().require(*id)->join(*channel, *password);
 	client.success("server-join");
 }
 
@@ -622,7 +622,7 @@
 	if (!reason)
 		throw server_error(server_error::invalid_message);
 
-	bot.servers().require(*id)->kick(*target, *channel, *reason);
+	bot.get_servers().require(*id)->kick(*target, *channel, *reason);
 	client.success("server-kick");
 }
 
@@ -640,7 +640,7 @@
 	auto json = nlohmann::json::object();
 	auto list = nlohmann::json::array();
 
-	for (const auto& server : bot.servers().list())
+	for (const auto& server : bot.get_servers().list())
 		list.push_back(server->get_id());
 
 	client.write({
@@ -671,7 +671,7 @@
 	if (!message)
 		throw server_error(server_error::invalid_message);
 
-	bot.servers().require(*id)->me(*channel, *message);
+	bot.get_servers().require(*id)->me(*channel, *message);
 	client.success("server-me");
 }
 
@@ -697,7 +697,7 @@
 	if (!message)
 		throw server_error(server_error::invalid_message);
 
-	bot.servers().require(*id)->message(*channel, *message);
+	bot.get_servers().require(*id)->message(*channel, *message);
 	client.success("server-message");
 }
 
@@ -728,7 +728,7 @@
 	if (!limit || !user || !mask)
 		throw server_error(server_error::invalid_mode);
 
-	bot.servers().require(*id)->mode(*channel, *mode, *limit, *user, *mask);
+	bot.get_servers().require(*id)->mode(*channel, *mode, *limit, *user, *mask);
 	client.success("server-mode");
 }
 
@@ -751,7 +751,7 @@
 	if (!nick || nick->empty())
 		throw server_error(server_error::invalid_nickname);
 
-	bot.servers().require(*id)->set_nickname(*nick);
+	bot.get_servers().require(*id)->set_nickname(*nick);
 	client.success("server-nick");
 }
 
@@ -777,7 +777,7 @@
 	if (!message)
 		throw server_error(server_error::invalid_message);
 
-	bot.servers().require(*id)->notice(*channel, *message);
+	bot.get_servers().require(*id)->notice(*channel, *message);
 	client.success("server-notice");
 }
 
@@ -803,7 +803,7 @@
 	if (!reason)
 		throw server_error(server_error::invalid_message);
 
-	bot.servers().require(*id)->part(*channel, *reason);
+	bot.get_servers().require(*id)->part(*channel, *reason);
 	client.success("server-part");
 }
 
@@ -821,12 +821,12 @@
 	const auto it = args.find("server");
 
 	if (it == args.end())
-		bot.servers().reconnect();
+		bot.get_servers().reconnect();
 	else {
 		if (!it->is_string() || !string_util::is_identifier(it->get<std::string>()))
 			throw server_error(server_error::invalid_identifier);
 
-		bot.servers().reconnect(it->get<std::string>());
+		bot.get_servers().reconnect(it->get<std::string>());
 	}
 
 	client.success("server-reconnect");
@@ -854,7 +854,7 @@
 	if (!topic)
 		throw server_error(server_error::invalid_message);
 
-	bot.servers().require(*id)->topic(*channel, *topic);
+	bot.get_servers().require(*id)->topic(*channel, *topic);
 	client.success("server-topic");
 }
 
--- a/libirccd-js/irccd/js/plugin_api.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/libirccd-js/irccd/js/plugin_api.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -212,7 +212,7 @@
 		daemon::plugin* plg;
 
 		if (duk_get_top(ctx) >= 1)
-			plg = duk::type_traits<bot>::self(ctx).plugins().get(duk_require_string(ctx, 0)).get();
+			plg = duk::type_traits<bot>::self(ctx).get_plugins().get(duk_require_string(ctx, 0)).get();
 		else
 			plg = std::addressof(duk::type_traits<plugin>::self(ctx));
 
@@ -254,7 +254,7 @@
 
 	duk_push_array(ctx);
 
-	for (const auto& plg : duk::type_traits<bot>::self(ctx).plugins().list()) {
+	for (const auto& plg : duk::type_traits<bot>::self(ctx).get_plugins().list()) {
 		duk::push(ctx, plg->get_id());
 		duk_put_prop_index(ctx, -2, i++);
 	}
@@ -282,7 +282,7 @@
 auto Plugin_load(duk_context* ctx) -> duk_idx_t
 {
 	return wrap(ctx, [&] {
-		duk::type_traits<bot>::self(ctx).plugins().load(
+		duk::type_traits<bot>::self(ctx).get_plugins().load(
 			duk::require<std::string_view>(ctx, 0), "");
 
 		return 0;
@@ -308,7 +308,7 @@
 auto Plugin_reload(duk_context* ctx) -> duk_idx_t
 {
 	return wrap(ctx, [&] {
-		duk::type_traits<bot>::self(ctx).plugins().reload(duk::require<std::string>(ctx, 0));
+		duk::type_traits<bot>::self(ctx).get_plugins().reload(duk::require<std::string>(ctx, 0));
 
 		return 0;
 	});
@@ -333,7 +333,7 @@
 auto Plugin_unload(duk_context* ctx) -> duk_idx_t
 {
 	return wrap(ctx, [&] {
-		duk::type_traits<bot>::self(ctx).plugins().unload(duk::require<std::string>(ctx, 0));
+		duk::type_traits<bot>::self(ctx).get_plugins().unload(duk::require<std::string>(ctx, 0));
 
 		return 0;
 	});
--- a/libirccd-js/irccd/js/server_api.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/libirccd-js/irccd/js/server_api.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -671,7 +671,7 @@
 auto Server_add(duk_context* ctx) -> duk_ret_t
 {
 	return wrap(ctx, [] (auto ctx) {
-		duk::type_traits<bot>::self(ctx).servers().add(
+		duk::type_traits<bot>::self(ctx).get_servers().add(
 			duk::require<std::shared_ptr<server>>(ctx, 0));
 
 		return 0;
@@ -699,7 +699,7 @@
 {
 	return wrap(ctx, [] (auto ctx) {
 		auto id = duk::require<std::string>(ctx, 0);
-		auto server = duk::type_traits<bot>::self(ctx).servers().get(id);
+		auto server = duk::type_traits<bot>::self(ctx).get_servers().get(id);
 
 		if (!server)
 			return 0;
@@ -727,7 +727,7 @@
 {
 	duk_push_object(ctx);
 
-	for (const auto& server : duk::type_traits<bot>::self(ctx).servers().list()) {
+	for (const auto& server : duk::type_traits<bot>::self(ctx).get_servers().list()) {
 		duk::push(ctx, server);
 		duk_put_prop_string(ctx, -2, server->get_id().c_str());
 	}
@@ -751,7 +751,7 @@
  */
 auto Server_remove(duk_context* ctx) -> duk_ret_t
 {
-	duk::type_traits<bot>::self(ctx).servers().remove(duk_require_string(ctx, 0));
+	duk::type_traits<bot>::self(ctx).get_servers().remove(duk_require_string(ctx, 0));
 
 	return 0;
 }
--- a/libirccd-test/irccd/test/cli_fixture.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/libirccd-test/irccd/test/cli_fixture.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -61,11 +61,11 @@
 	auto acceptor = std::make_unique<ip_acceptor>(bot_.get_service(), std::move(raw_acceptor));
 
 	for (const auto& f : daemon::transport_command::registry())
-		bot_.transports().get_commands().push_back(f());
+		bot_.get_transports().get_commands().push_back(f());
 
-	bot_.servers().add(server_);
-	bot_.transports().add(std::make_unique<daemon::transport_server>(std::move(acceptor)));
-	bot_.plugins().add_loader(std::make_unique<test_plugin_loader>());
+	bot_.get_servers().add(server_);
+	bot_.get_transports().add(std::make_unique<daemon::transport_server>(std::move(acceptor)));
+	bot_.get_plugins().add_loader(std::make_unique<test_plugin_loader>());
 	server_->clear();
 }
 
--- a/libirccd-test/irccd/test/command_fixture.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/libirccd-test/irccd/test/command_fixture.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -34,10 +34,10 @@
 {
 	// 1. Add all commands.
 	for (const auto& f : daemon::transport_command::registry())
-		bot_.transports().get_commands().push_back(f());
+		bot_.get_transports().get_commands().push_back(f());
 
-	bot_.servers().add(server_);
-	bot_.plugins().add(plugin_);
+	bot_.get_servers().add(server_);
+	bot_.get_plugins().add(plugin_);
 	server_->disconnect();
 	server_->clear();
 	plugin_->clear();
@@ -45,7 +45,7 @@
 
 auto command_fixture::request(nlohmann::json json) -> nlohmann::json
 {
-	const auto& list = bot_.transports().get_commands();
+	const auto& list = bot_.get_transports().get_commands();
 	const auto cmd = std::find_if(list.begin(), list.end(), [&] (const auto& c) {
 		return c->get_name() == json["command"].template get<std::string>();
 	});
--- a/libirccd-test/irccd/test/irccd_fixture.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/libirccd-test/irccd/test/irccd_fixture.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -31,7 +31,7 @@
 irccd_fixture::irccd_fixture()
 {
 	bot_.set_log(make_unique<silent_sink>());
-	bot_.plugins().add_loader(make_unique<test_plugin_loader>());
+	bot_.get_plugins().add_loader(make_unique<test_plugin_loader>());
 }
 
 } // !irccd
--- a/libirccd-test/irccd/test/js_plugin_fixture.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/libirccd-test/irccd/test/js_plugin_fixture.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -50,8 +50,8 @@
 
 	bot_.set_log(std::make_unique<silent_sink>());
 	bot_.get_log().set_verbose(false);
-	bot_.plugins().add(plugin_);
-	bot_.servers().add(server_);
+	bot_.get_plugins().add(plugin_);
+	bot_.get_servers().add(server_);
 
 	server_->disconnect();
 	server_->set_nickname("irccd");
--- a/tests/src/irccdctl/cli-plugin-config/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/irccdctl/cli-plugin-config/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -41,8 +41,8 @@
 			{ "v2", "456" }
 		});
 
-		bot_.plugins().add(std::move(conf1));
-		bot_.plugins().add(std::move(conf2));
+		bot_.get_plugins().add(std::move(conf1));
+		bot_.get_plugins().add(std::move(conf2));
 	}
 };
 
--- a/tests/src/irccdctl/cli-plugin-info/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/irccdctl/cli-plugin-info/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -40,7 +40,7 @@
 
 BOOST_AUTO_TEST_CASE(simple)
 {
-	bot_.plugins().add(std::make_unique<mock_plugin>("test"));
+	bot_.get_plugins().add(std::make_unique<mock_plugin>("test"));
 	start();
 
 	const auto [code, out, err] = exec({ "plugin-info", "test" });
--- a/tests/src/irccdctl/cli-plugin-list/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/irccdctl/cli-plugin-list/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -40,8 +40,8 @@
 
 BOOST_AUTO_TEST_CASE(output)
 {
-	bot_.plugins().add(std::make_unique<mock_plugin>("p1"));
-	bot_.plugins().add(std::make_unique<mock_plugin>("p2"));
+	bot_.get_plugins().add(std::make_unique<mock_plugin>("p1"));
+	bot_.get_plugins().add(std::make_unique<mock_plugin>("p2"));
 	start();
 
 	const auto [code, out, err] = exec({ "plugin-list" });
--- a/tests/src/irccdctl/cli-plugin-load/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/irccdctl/cli-plugin-load/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -46,8 +46,8 @@
 
 BOOST_AUTO_TEST_CASE(simple)
 {
-	bot_.plugins().add(std::make_unique<mock_plugin>("p1"));
-	bot_.plugins().add(std::make_unique<mock_plugin>("p2"));
+	bot_.get_plugins().add(std::make_unique<mock_plugin>("p1"));
+	bot_.get_plugins().add(std::make_unique<mock_plugin>("p2"));
 	start();
 
 	// Load a plugin first.
--- a/tests/src/irccdctl/cli-plugin-reload/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/irccdctl/cli-plugin-reload/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -39,7 +39,7 @@
 	plugin_reload_fixture()
 		: cli_fixture(IRCCDCTL_EXECUTABLE)
 	{
-		bot_.plugins().add(plugin_);
+		bot_.get_plugins().add(plugin_);
 	}
 };
 
--- a/tests/src/irccdctl/cli-plugin-unload/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/irccdctl/cli-plugin-unload/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -39,7 +39,7 @@
 	plugin_unload_fixture()
 		: cli_fixture(IRCCDCTL_EXECUTABLE)
 	{
-		bot_.plugins().add(plugin_);
+		bot_.get_plugins().add(plugin_);
 	}
 };
 
@@ -55,7 +55,7 @@
 	BOOST_TEST(out.size() == 0U);
 	BOOST_TEST(err.size() == 0U);
 	BOOST_TEST(plugin_->find("handle_unload").size() == 1U);
-	BOOST_TEST(!bot_.plugins().has("p"));
+	BOOST_TEST(!bot_.get_plugins().has("p"));
 }
 
 BOOST_AUTO_TEST_SUITE_END()
--- a/tests/src/irccdctl/cli-rule-edit/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/irccdctl/cli-rule-edit/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -34,7 +34,7 @@
 	rule_edit_fixture()
 		: cli_fixture(IRCCDCTL_EXECUTABLE)
 	{
-		bot_.rules().add({
+		bot_.get_rules().add({
 			{ "s1", "s2" },
 			{ "c1", "c2" },
 			{ "o1", "o2" },
--- a/tests/src/irccdctl/cli-rule-info/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/irccdctl/cli-rule-info/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -41,7 +41,7 @@
 
 BOOST_AUTO_TEST_CASE(info)
 {
-	bot_.rules().add({
+	bot_.get_rules().add({
 		{ "s1", "s2" },
 		{ "c1", "c2" },
 		{ "o1", "o2" },
--- a/tests/src/irccdctl/cli-rule-list/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/irccdctl/cli-rule-list/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -41,7 +41,7 @@
 
 BOOST_AUTO_TEST_CASE(simple)
 {
-	bot_.rules().add({
+	bot_.get_rules().add({
 		{ "s1", "s2" },
 		{ "c1", "c2" },
 		{ "o1", "o2" },
--- a/tests/src/irccdctl/cli-rule-move/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/irccdctl/cli-rule-move/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -34,7 +34,7 @@
 	rule_move_fixture()
 		: cli_fixture(IRCCDCTL_EXECUTABLE)
 	{
-		bot_.rules().add({
+		bot_.get_rules().add({
 			{ "s1" },
 			{ "c1" },
 			{ "o1" },
@@ -42,7 +42,7 @@
 			{ "onTopic" },
 			rule::action_type::accept
 		});
-		bot_.rules().add({
+		bot_.get_rules().add({
 			{ "s2" },
 			{ "c2" },
 			{ "o2" },
@@ -50,7 +50,7 @@
 			{ "onCommand" },
 			rule::action_type::drop
 		});
-		bot_.rules().add({
+		bot_.get_rules().add({
 			{ "s3" },
 			{ "c3" },
 			{ "o3" },
--- a/tests/src/irccdctl/cli-rule-remove/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/irccdctl/cli-rule-remove/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -34,7 +34,7 @@
 	rule_remove_fixture()
 		: cli_fixture(IRCCDCTL_EXECUTABLE)
 	{
-		bot_.rules().add({
+		bot_.get_rules().add({
 			{ "s1" },
 			{ "c1" },
 			{ "o1" },
@@ -42,7 +42,7 @@
 			{ "onTopic" },
 			rule::action_type::accept
 		});
-		bot_.rules().add({
+		bot_.get_rules().add({
 			{ "s2" },
 			{ "c2" },
 			{ "o2" },
@@ -50,7 +50,7 @@
 			{ "onCommand" },
 			rule::action_type::drop
 		});
-		bot_.rules().add({
+		bot_.get_rules().add({
 			{ "s3" },
 			{ "c3" },
 			{ "o3" },
--- a/tests/src/irccdctl/cli-server-disconnect/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/irccdctl/cli-server-disconnect/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -42,8 +42,8 @@
 	const auto s1 = std::make_shared<mock_server>(bot_.get_service(), "s1", "localhost");
 	const auto s2 = std::make_shared<mock_server>(bot_.get_service(), "s2", "localhost");
 
-	bot_.servers().add(s1);
-	bot_.servers().add(s2);
+	bot_.get_servers().add(s1);
+	bot_.get_servers().add(s2);
 	s1->clear();
 	s2->clear();
 	start();
@@ -63,8 +63,8 @@
 	const auto s1 = std::make_shared<mock_server>(bot_.get_service(), "s1", "localhost");
 	const auto s2 = std::make_shared<mock_server>(bot_.get_service(), "s2", "localhost");
 
-	bot_.servers().add(s1);
-	bot_.servers().add(s2);
+	bot_.get_servers().add(s1);
+	bot_.get_servers().add(s2);
 	s1->clear();
 	s2->clear();
 	start();
--- a/tests/src/irccdctl/cli-server-list/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/irccdctl/cli-server-list/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -39,8 +39,8 @@
 
 BOOST_AUTO_TEST_CASE(output)
 {
-	bot_.servers().add(std::make_unique<mock_server>(bot_.get_service(), "s1", "localhost"));
-	bot_.servers().add(std::make_unique<mock_server>(bot_.get_service(), "s2", "localhost"));
+	bot_.get_servers().add(std::make_unique<mock_server>(bot_.get_service(), "s1", "localhost"));
+	bot_.get_servers().add(std::make_unique<mock_server>(bot_.get_service(), "s2", "localhost"));
 	start();
 
 	const auto [code, out, err] = exec({ "server-list" });
--- a/tests/src/irccdctl/cli-server-reconnect/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/irccdctl/cli-server-reconnect/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -42,8 +42,8 @@
 	const auto s1 = std::make_shared<mock_server>(bot_.get_service(), "s1", "localhost");
 	const auto s2 = std::make_shared<mock_server>(bot_.get_service(), "s2", "localhost");
 
-	bot_.servers().add(s1);
-	bot_.servers().add(s2);
+	bot_.get_servers().add(s1);
+	bot_.get_servers().add(s2);
 	s1->clear();
 	s2->clear();
 	start();
@@ -66,8 +66,8 @@
 	const auto s1 = std::make_shared<mock_server>(bot_.get_service(), "s1", "localhost");
 	const auto s2 = std::make_shared<mock_server>(bot_.get_service(), "s2", "localhost");
 
-	bot_.servers().add(s1);
-	bot_.servers().add(s2);
+	bot_.get_servers().add(s1);
+	bot_.get_servers().add(s2);
 	s1->clear();
 	s2->clear();
 	start();
--- a/tests/src/libirccd-daemon/command-plugin-config/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-daemon/command-plugin-config/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -41,7 +41,7 @@
 		{ "value",      "falsy"         }
 	});
 
-	const auto config = bot_.plugins().require("test")->get_options();
+	const auto config = bot_.get_plugins().require("test")->get_options();
 
 	BOOST_TEST(json.size() == 1U);
 	BOOST_TEST(json["command"].get<std::string>() == "plugin-config");
@@ -57,8 +57,8 @@
 		{ "x1", "10" },
 		{ "x2", "20" }
 	});
-	bot_.plugins().clear();
-	bot_.plugins().add(std::move(plugin));
+	bot_.get_plugins().clear();
+	bot_.get_plugins().add(std::move(plugin));
 
 	const auto json = request({
 		{ "command",    "plugin-config" },
@@ -80,8 +80,8 @@
 		{ "x1", "10" },
 		{ "x2", "20" }
 	});
-	bot_.plugins().clear();
-	bot_.plugins().add(std::move(plugin));
+	bot_.get_plugins().clear();
+	bot_.get_plugins().add(std::move(plugin));
 
 	const auto json = request({
 		{ "command",    "plugin-config" },
--- a/tests/src/libirccd-daemon/command-plugin-list/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-daemon/command-plugin-list/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -29,9 +29,9 @@
 public:
 	plugin_list_fixture()
 	{
-		bot_.plugins().clear();
-		bot_.plugins().add(std::make_unique<test::mock_plugin>("t1"));
-		bot_.plugins().add(std::make_unique<test::mock_plugin>("t2"));
+		bot_.get_plugins().clear();
+		bot_.get_plugins().add(std::make_unique<test::mock_plugin>("t1"));
+		bot_.get_plugins().add(std::make_unique<test::mock_plugin>("t2"));
 	}
 };
 
--- a/tests/src/libirccd-daemon/command-plugin-load/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-daemon/command-plugin-load/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -29,8 +29,8 @@
 public:
 	plugin_load_fixture()
 	{
-		bot_.plugins().clear();
-		bot_.plugins().add(std::make_unique<test::mock_plugin>("already"));
+		bot_.get_plugins().clear();
+		bot_.get_plugins().add(std::make_unique<test::mock_plugin>("already"));
 	}
 };
 
@@ -47,7 +47,7 @@
 
 	BOOST_TEST(json.size() == 1U);
 	BOOST_TEST(json["command"].get<std::string>() == "plugin-load");
-	BOOST_TEST(bot_.plugins().has("mock"));
+	BOOST_TEST(bot_.get_plugins().has("mock"));
 }
 
 BOOST_AUTO_TEST_SUITE(errors)
--- a/tests/src/libirccd-daemon/command-plugin-reload/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-daemon/command-plugin-reload/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -32,9 +32,9 @@
 
 	plugin_reload_fixture()
 	{
-		bot_.plugins().clear();
-		bot_.plugins().add(plugin_);
-		bot_.plugins().add(std::make_unique<test::broken_plugin>("broken"));
+		bot_.get_plugins().clear();
+		bot_.get_plugins().add(plugin_);
+		bot_.get_plugins().add(std::make_unique<test::broken_plugin>("broken"));
 	}
 };
 
--- a/tests/src/libirccd-daemon/command-plugin-unload/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-daemon/command-plugin-unload/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -32,9 +32,9 @@
 
 	plugin_unload_fixture()
 	{
-		bot_.plugins().clear();
-		bot_.plugins().add(plugin_);
-		bot_.plugins().add(std::make_unique<test::broken_plugin>("broken"));
+		bot_.get_plugins().clear();
+		bot_.get_plugins().add(plugin_);
+		bot_.get_plugins().add(std::make_unique<test::broken_plugin>("broken"));
 	}
 };
 
@@ -90,7 +90,7 @@
 	BOOST_TEST(json["command"].get<std::string>() == "plugin-unload");
 	BOOST_TEST(json["error"].get<int>() == daemon::plugin_error::exec_error);
 	BOOST_TEST(json["errorCategory"].get<std::string>() == "plugin");
-	BOOST_TEST(!bot_.plugins().has("broken"));
+	BOOST_TEST(!bot_.get_plugins().has("broken"));
 }
 
 BOOST_AUTO_TEST_SUITE_END()
--- a/tests/src/libirccd-daemon/command-rule-edit/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-daemon/command-rule-edit/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -31,7 +31,7 @@
 public:
 	rule_edit_fixture()
 	{
-		bot_.rules().add(daemon::rule{
+		bot_.get_rules().add(daemon::rule{
 			{ "s1", "s2" },
 			{ "c1", "c2" },
 			{ "o1", "o2" },
--- a/tests/src/libirccd-daemon/command-rule-info/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-daemon/command-rule-info/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -31,7 +31,7 @@
 public:
 	rule_info_fixture()
 	{
-		bot_.rules().add(daemon::rule{
+		bot_.get_rules().add(daemon::rule{
 			{ "s1", "s2" },
 			{ "c1", "c2" },
 			{ "o1", "o2" },
@@ -39,7 +39,7 @@
 			{ "onMessage", "onCommand" },
 			daemon::rule::action_type::drop
 		});
-		bot_.rules().add(daemon::rule{
+		bot_.get_rules().add(daemon::rule{
 			{ "s1", },
 			{ "c1", },
 			{ "o1", },
--- a/tests/src/libirccd-daemon/command-rule-list/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-daemon/command-rule-list/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -31,7 +31,7 @@
 public:
 	rule_list_fixture()
 	{
-		bot_.rules().add(daemon::rule{
+		bot_.get_rules().add(daemon::rule{
 			{ "s1", "s2" },
 			{ "c1", "c2" },
 			{ "o1", "o2" },
@@ -39,7 +39,7 @@
 			{ "onMessage", "onCommand" },
 			daemon::rule::action_type::drop
 		});
-		bot_.rules().add(daemon::rule{
+		bot_.get_rules().add(daemon::rule{
 			{ "s1", },
 			{ "c1", },
 			{ "o1", },
@@ -96,8 +96,8 @@
 
 BOOST_AUTO_TEST_CASE(empty)
 {
-	bot_.rules().remove(0);
-	bot_.rules().remove(0);
+	bot_.get_rules().remove(0);
+	bot_.get_rules().remove(0);
 
 	const auto json = request({{ "command", "rule-list" }});
 
--- a/tests/src/libirccd-daemon/command-rule-move/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-daemon/command-rule-move/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -31,7 +31,7 @@
 public:
 	rule_move_fixture()
 	{
-		bot_.rules().add(daemon::rule{
+		bot_.get_rules().add(daemon::rule{
 			{ "s0" },
 			{ "c0" },
 			{ "o0" },
@@ -39,7 +39,7 @@
 			{ "onMessage" },
 			daemon::rule::action_type::drop
 		});
-		bot_.rules().add(daemon::rule{
+		bot_.get_rules().add(daemon::rule{
 			{ "s1", },
 			{ "c1", },
 			{ "o1", },
@@ -47,7 +47,7 @@
 			{ "onMessage", },
 			daemon::rule::action_type::accept
 		});
-		bot_.rules().add(daemon::rule{
+		bot_.get_rules().add(daemon::rule{
 			{ "s2", },
 			{ "c2", },
 			{ "o2", },
--- a/tests/src/libirccd-daemon/command-rule-remove/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-daemon/command-rule-remove/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -31,7 +31,7 @@
 public:
 	rule_remove_fixture()
 	{
-		bot_.rules().add(daemon::rule{
+		bot_.get_rules().add(daemon::rule{
 			{ "s1", "s2" },
 			{ "c1", "c2" },
 			{ "o1", "o2" },
@@ -39,7 +39,7 @@
 			{ "onMessage", "onCommand" },
 			daemon::rule::action_type::drop
 		});
-		bot_.rules().add(daemon::rule{
+		bot_.get_rules().add(daemon::rule{
 			{ "s1", },
 			{ "c1", },
 			{ "o1", },
--- a/tests/src/libirccd-daemon/command-server-connect/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-daemon/command-server-connect/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -35,7 +35,7 @@
 		{ "hostname",   "irc.example.org"   }
 	});
 
-	const auto s = bot_.servers().get("local");
+	const auto s = bot_.get_servers().get("local");
 
 	BOOST_TEST(json.size() == 1U);
 	BOOST_TEST(json["command"].get<std::string>() == "server-connect");
@@ -68,7 +68,7 @@
 		{ "joinInvite",         true                    }
 	});
 
-	const auto s = bot_.servers().get("local2");
+	const auto s = bot_.get_servers().get("local2");
 
 	BOOST_TEST(json.size() == 1U);
 	BOOST_TEST(json["command"].get<std::string>() == "server-connect");
@@ -95,7 +95,7 @@
 
 BOOST_AUTO_TEST_CASE(already_exists)
 {
-	bot_.servers().add(std::make_unique<test::mock_server>(ctx_, "local"));
+	bot_.get_servers().add(std::make_unique<test::mock_server>(ctx_, "local"));
 
 	const auto json = request({
 		{ "command",    "server-connect"        },
--- a/tests/src/libirccd-daemon/command-server-disconnect/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-daemon/command-server-disconnect/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -34,8 +34,8 @@
 		: s1_(new test::mock_server(ctx_, "s1", "localhost"))
 		, s2_(new test::mock_server(ctx_, "s2", "localhost"))
 	{
-		bot_.servers().add(s1_);
-		bot_.servers().add(s2_);
+		bot_.get_servers().add(s1_);
+		bot_.get_servers().add(s2_);
 	}
 };
 
@@ -51,8 +51,8 @@
 	BOOST_TEST(json.size() == 1U);
 	BOOST_TEST(json["command"].get<std::string>() == "server-disconnect");
 	BOOST_TEST(s1_->find("disconnect").size() == 1U);
-	BOOST_TEST(!bot_.servers().has("s1"));
-	BOOST_TEST(bot_.servers().has("s2"));
+	BOOST_TEST(!bot_.get_servers().has("s1"));
+	BOOST_TEST(bot_.get_servers().has("s2"));
 }
 
 BOOST_AUTO_TEST_CASE(all)
@@ -63,8 +63,8 @@
 	BOOST_TEST(json["command"].get<std::string>() == "server-disconnect");
 	BOOST_TEST(s1_->find("disconnect").size() == 1U);
 	BOOST_TEST(s2_->find("disconnect").size() == 1U);
-	BOOST_TEST(!bot_.servers().has("s1"));
-	BOOST_TEST(!bot_.servers().has("s2"));
+	BOOST_TEST(!bot_.get_servers().has("s1"));
+	BOOST_TEST(!bot_.get_servers().has("s2"));
 }
 
 BOOST_AUTO_TEST_SUITE(errors)
--- a/tests/src/libirccd-daemon/command-server-info/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-daemon/command-server-info/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -40,8 +40,8 @@
 	server->set_command_char("@");
 	server->set_ping_timeout(20000);
 
-	bot_.servers().clear();
-	bot_.servers().add(std::move(server));
+	bot_.get_servers().clear();
+	bot_.get_servers().add(std::move(server));
 
 	const auto json = request({
 		{ "command",    "server-info"   },
--- a/tests/src/libirccd-daemon/command-server-list/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-daemon/command-server-list/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -29,9 +29,9 @@
 protected:
 	server_list_fixture()
 	{
-		bot_.servers().clear();
-		bot_.servers().add(std::make_unique<test::mock_server>(ctx_, "s1", "localhost"));
-		bot_.servers().add(std::make_unique<test::mock_server>(ctx_, "s2", "localhost"));
+		bot_.get_servers().clear();
+		bot_.get_servers().add(std::make_unique<test::mock_server>(ctx_, "s1", "localhost"));
+		bot_.get_servers().add(std::make_unique<test::mock_server>(ctx_, "s2", "localhost"));
 	}
 };
 
--- a/tests/src/libirccd-daemon/command-server-reconnect/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-daemon/command-server-reconnect/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -34,9 +34,9 @@
 		: s1_(new test::mock_server(ctx_, "s1", "localhost"))
 		, s2_(new test::mock_server(ctx_, "s2", "localhost"))
 	{
-		bot_.servers().clear();
-		bot_.servers().add(s1_);
-		bot_.servers().add(s2_);
+		bot_.get_servers().clear();
+		bot_.get_servers().add(s1_);
+		bot_.get_servers().add(s2_);
 		s1_->clear();
 		s2_->clear();
 	}
--- a/tests/src/libirccd-js/js-plugin/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/libirccd-js/js-plugin/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -112,13 +112,13 @@
 		for (const auto& f : js::api::registry())
 			loader->get_modules().push_back(f());
 
-		bot_.plugins().add_loader(std::move(loader));
+		bot_.get_plugins().add_loader(std::move(loader));
 	}
 
 	void load(std::string name, std::string path)
 	{
-		bot_.plugins().load(name, path);
-		plugin_ = bot_.plugins().require(name);
+		bot_.get_plugins().load(name, path);
+		plugin_ = bot_.get_plugins().require(name);
 	}
 };
 
--- a/tests/src/plugins/plugin/main.cpp	Tue Apr 30 13:49:11 2019 +0200
+++ b/tests/src/plugins/plugin/main.cpp	Fri Jun 14 20:53:00 2019 +0200
@@ -74,7 +74,7 @@
 	test_fixture()
 		: js_plugin_fixture(PLUGIN_PATH)
 	{
-		bot_.plugins().add(std::make_shared<fake_plugin>("fake"));
+		bot_.get_plugins().add(std::make_shared<fake_plugin>("fake"));
 
 		plugin_->set_formats({
 			{ "usage", "usage=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}" },
@@ -133,7 +133,7 @@
 BOOST_AUTO_TEST_CASE(format_too_long)
 {
 	for (int i = 0; i < 100; ++i)
-		bot_.plugins().add(std::make_shared<fake_plugin>(str(format("plugin-n-%1%") % i)));
+		bot_.get_plugins().add(std::make_shared<fake_plugin>(str(format("plugin-n-%1%") % i)));
 
 	plugin_->handle_command(bot_, { server_, "jean!jean@localhost", "#staff", "list" });