changeset 129:49d1a5eeef6f

Irccd: store server name in object like plugin, #488
author David Demelier <markand@malikania.fr>
date Wed, 11 May 2016 21:00:49 +0200
parents 2d8343b86e2e
children 483c862b5a52
files lib/irccd/cmd-server-connect.cpp lib/irccd/cmd-server-info.cpp lib/irccd/cmd-server-list.cpp lib/irccd/config.cpp lib/irccd/js-server.cpp lib/irccd/server-state-connected.cpp lib/irccd/server-state-connecting.cpp lib/irccd/server-state-disconnected.cpp lib/irccd/server.cpp lib/irccd/server.hpp lib/irccd/service-server.cpp
diffstat 11 files changed, 115 insertions(+), 97 deletions(-) [+]
line wrap: on
line diff
--- a/lib/irccd/cmd-server-connect.cpp	Wed May 11 13:58:42 2016 +0200
+++ b/lib/irccd/cmd-server-connect.cpp	Wed May 11 21:00:49 2016 +0200
@@ -18,12 +18,16 @@
 
 #include <limits>
 
+#include <format.h>
+
 #include "cmd-server-connect.hpp"
 #include "irccd.hpp"
 #include "server.hpp"
 #include "service-server.hpp"
 #include "util.hpp"
 
+using namespace fmt::literals;
+
 namespace irccd {
 
 namespace command {
@@ -76,11 +80,7 @@
 {
 	ServerInfo info;
 
-	/* Mandatory */
-	info.name = readInfoName(object);
 	info.host = readInfoHost(object);
-
-	/* Optional */
 	info.port = readInfoPort(object);
 
 	if (object.valueOr("ssl", json::Type::Boolean, false).toBool())
@@ -155,10 +155,11 @@
 
 json::Value ServerConnect::exec(Irccd &irccd, const json::Value &request) const
 {
-	auto server = std::make_shared<Server>(readInfo(request), readIdentity(request), readSettings(request));
+	auto server = std::make_shared<Server>(readInfoName(request), readInfo(request), readIdentity(request),
+					       readSettings(request));
 
-	if (irccd.serverService().hasServer(server->info().name)) {
-		throw std::invalid_argument("server '" + server->info().name + "' already exists");
+	if (irccd.serverService().hasServer(server->name())) {
+		throw std::invalid_argument("server '{}' already exists"_format(server->name()));
 	}
 
 	irccd.serverService().addServer(std::move(server));
--- a/lib/irccd/cmd-server-info.cpp	Wed May 11 13:58:42 2016 +0200
+++ b/lib/irccd/cmd-server-info.cpp	Wed May 11 21:00:49 2016 +0200
@@ -57,7 +57,7 @@
 	auto response = RemoteCommand::exec(irccd, request);
 
 	/* General stuff */
-	response.insert("name", server->info().name);
+	response.insert("name", server->name());
 	response.insert("host", server->info().host);
 	response.insert("port", server->info().port);
 	response.insert("nickname", server->identity().nickname);
--- a/lib/irccd/cmd-server-list.cpp	Wed May 11 13:58:42 2016 +0200
+++ b/lib/irccd/cmd-server-list.cpp	Wed May 11 21:00:49 2016 +0200
@@ -43,7 +43,7 @@
 	auto list = json::array({});
 
 	for (const auto &server : irccd.serverService().servers()) {
-		list.append(server->info().name);
+		list.append(server->name());
 	}
 
 	json.insert("list", std::move(list));
--- a/lib/irccd/config.cpp	Wed May 11 13:58:42 2016 +0200
+++ b/lib/irccd/config.cpp	Wed May 11 21:00:49 2016 +0200
@@ -318,6 +318,7 @@
 {
 	assert(sc.key() == "server");
 
+	std::string name;
 	ServerInfo info;
 	ServerIdentity identity;
 	ServerSettings settings;
@@ -331,11 +332,11 @@
 		throw std::invalid_argument("server: invalid identifier: {}"_format(it->value()));
 	}
 
-	info.name = it->value();
+	name = it->value();
 
 	// Host
 	if ((it = sc.find("host")) == sc.end()) {
-		throw std::invalid_argument("server {}: missing host"_format(it->value()));
+		throw std::invalid_argument("server {}: missing host"_format(name));
 	}
 
 	info.host = it->value();
@@ -350,7 +351,7 @@
 		try {
 			info.port = util::toNumber<std::uint16_t>(it->value());
 		} catch (const std::exception &) {
-			throw std::invalid_argument("server {}: invalid number for {}: {}"_format(info.name, it->key(), it->value()));
+			throw std::invalid_argument("server {}: invalid number for {}: {}"_format(name, it->key(), it->value()));
 		}
 	}
 
@@ -413,10 +414,10 @@
 			settings.pingTimeout = util::toNumber<std::uint16_t>(it->value());
 		}
 	} catch (const std::exception &) {
-		log::warning("server {}: invalid number for {}: {}"_format(info.name, it->key(), it->value()));
+		log::warning("server {}: invalid number for {}: {}"_format(name, it->key(), it->value()));
 	}
 
-	return std::make_shared<Server>(std::move(info), std::move(identity), std::move(settings));
+	return std::make_shared<Server>(std::move(name), std::move(info), std::move(identity), std::move(settings));
 }
 
 } // !namespace
--- a/lib/irccd/js-server.cpp	Wed May 11 13:58:42 2016 +0200
+++ b/lib/irccd/js-server.cpp	Wed May 11 21:00:49 2016 +0200
@@ -80,7 +80,7 @@
 	auto server = duk::self<duk::Shared<Server>>(ctx);
 
 	duk::push(ctx, duk::Object{});
-	duk::putProperty(ctx, -1, "name", server->info().name);
+	duk::putProperty(ctx, -1, "name", server->name());
 	duk::putProperty(ctx, -1, "host", server->info().host);
 	duk::putProperty<int>(ctx, -1, "port", server->info().port);
 	duk::putProperty<bool>(ctx, -1, "ssl", server->info().flags & ServerInfo::Ssl);
@@ -336,7 +336,7 @@
  */
 duk::Ret toString(duk::ContextPtr ctx)
 {
-	duk::push(ctx, duk::self<duk::Shared<Server>>(ctx)->info().name);
+	duk::push(ctx, duk::self<duk::Shared<Server>>(ctx)->name());
 
 	return 1;
 }
@@ -367,12 +367,13 @@
 	if (!duk_is_constructor_call(ctx))
 		return 0;
 
+	std::string name;
 	ServerInfo info;
 	ServerIdentity identity;
 	ServerSettings settings;
 
-	/* Information part */
-	info.name = duk::getProperty<std::string>(ctx, 0, "name");
+	// Information part.
+	name = duk::getProperty<std::string>(ctx, 0, "name");
 	info.host = duk::getProperty<std::string>(ctx, 0, "host");
 	info.port = duk::optionalProperty<int>(ctx, 0, "port", (int)info.port);
 	info.password = duk::optionalProperty<std::string>(ctx, 0, "password", "");
@@ -381,13 +382,13 @@
 		info.flags |= ServerInfo::Ipv6;
 	}
 
-	/* Identity part */
+	// Identity part.
 	identity.nickname = duk::optionalProperty<std::string>(ctx, 0, "nickname", identity.nickname);
 	identity.username = duk::optionalProperty<std::string>(ctx, 0, "username", identity.username);
 	identity.realname = duk::optionalProperty<std::string>(ctx, 0, "realname", identity.realname);
 	identity.ctcpversion = duk::optionalProperty<std::string>(ctx, 0, "version", identity.ctcpversion);
 
-	/* Settings part */
+	// Settings part.
 	for (const auto &chan: duk::getProperty<std::vector<std::string>>(ctx, 0, "channels")) {
 		settings.channels.push_back(Server::splitChannel(chan));
 	}
@@ -403,7 +404,8 @@
 	}
 
 	try {
-		duk::construct(ctx, duk::Shared<Server>{std::make_shared<Server>(std::move(info), std::move(identity), std::move(settings))});
+		duk::construct(ctx, duk::Shared<Server>{std::make_shared<Server>(std::move(name), std::move(info),
+							std::move(identity), std::move(settings))});
 	} catch (const std::exception &ex) {
 		duk::raise(ctx, duk::Error(ex.what()));
 	}
@@ -470,7 +472,7 @@
 	duk::push(ctx, duk::Object{});
 
 	for (const auto &server : duk::getGlobal<duk::RawPointer<Irccd>>(ctx, "\xff""\xff""irccd")->serverService().servers()) {
-		duk::putProperty(ctx, -1, server->info().name, duk::Shared<Server>{server});
+		duk::putProperty(ctx, -1, server->name(), duk::Shared<Server>{server});
 	}
 
 	return 1;
--- a/lib/irccd/server-state-connected.cpp	Wed May 11 13:58:42 2016 +0200
+++ b/lib/irccd/server-state-connected.cpp	Wed May 11 21:00:49 2016 +0200
@@ -31,19 +31,18 @@
 
 void Connected::prepare(Server &server, fd_set &setinput, fd_set &setoutput, net::Handle &maxfd)
 {
-	const ServerInfo &info = server.info();
 	const ServerSettings &settings = server.settings();
 
 	if (!irc_is_connected(server.session())) {
-		log::warning() << "server " << info.name << ": disconnected" << std::endl;
+		log::warning() << "server " << server.name() << ": disconnected" << std::endl;
 
 		if (settings.reconnectDelay > 0) {
-			log::warning("server {}: retrying in {} seconds"_format(info.name, settings.reconnectDelay));
+			log::warning("server {}: retrying in {} seconds"_format(server.name(), settings.reconnectDelay));
 		}
 
 		server.next(std::make_unique<state::Disconnected>());
 	} else if (server.cache().pingTimer.elapsed() >= settings.pingTimeout * 1000) {
-		log::warning() << "server " << info.name << ": ping timeout after "
+		log::warning() << "server " << server.name() << ": ping timeout after "
 			       << (server.cache().pingTimer.elapsed() / 1000) << " seconds" << std::endl;
 		server.next(std::make_unique<state::Disconnected>());
 	} else {
--- a/lib/irccd/server-state-connecting.cpp	Wed May 11 13:58:42 2016 +0200
+++ b/lib/irccd/server-state-connecting.cpp	Wed May 11 21:00:49 2016 +0200
@@ -94,14 +94,14 @@
 		const ServerSettings &settings = server.settings();
 
 		if (m_timer.elapsed() > static_cast<unsigned>(settings.reconnectDelay * 1000)) {
-			log::warning() << "server " << info.name << ": timeout while connecting" << std::endl;
+			log::warning() << "server " << server.name() << ": timeout while connecting" << std::endl;
 			server.next(std::make_unique<state::Disconnected>());
 		} else if (!irc_is_connected(server.session())) {
-			log::warning() << "server " << info.name << ": error while connecting: ";
+			log::warning() << "server " << server.name() << ": error while connecting: ";
 			log::warning() << irc_strerror(irc_errno(server.session())) << std::endl;
 
 			if (settings.reconnectTries != 0) {
-				log::warning("server {}: retrying in {} seconds"_format(info.name, settings.reconnectDelay));
+				log::warning("server {}: retrying in {} seconds"_format(server.name(), settings.reconnectDelay));
 			}
 
 			server.next(std::make_unique<state::Disconnected>());
@@ -118,10 +118,10 @@
 #if !defined(IRCCD_SYSTEM_WINDOWS)
 		(void)res_init();
 #endif
-		log::info() << "server " << info.name << ": trying to connect to " << info.host << ", port " << info.port << std::endl;
+		log::info("server {}: trying to connect to {}, port {}"_format(server.name(), info.host, info.port));
 
 		if (!connect(server)) {
-			log::warning() << "server " << info.name << ": disconnected while connecting: ";
+			log::warning() << "server " << server.name() << ": disconnected while connecting: ";
 			log::warning() << irc_strerror(irc_errno(server.session())) << std::endl;
 			server.next(std::make_unique<state::Disconnected>());
 		} else {
--- a/lib/irccd/server-state-disconnected.cpp	Wed May 11 13:58:42 2016 +0200
+++ b/lib/irccd/server-state-disconnected.cpp	Wed May 11 21:00:49 2016 +0200
@@ -32,10 +32,10 @@
 	ServerCache &cache = server.cache();
 
 	if (settings.reconnectTries == 0) {
-		log::warning() << "server " << info.name << ": reconnection disabled, skipping" << std::endl;
+		log::warning() << "server " << server.name() << ": reconnection disabled, skipping" << std::endl;
 		server.onDie();
 	} else if (settings.reconnectTries > 0 && cache.reconnectCurrent > settings.reconnectTries) {
-		log::warning() << "server " << info.name << ": giving up" << std::endl;
+		log::warning() << "server " << server.name() << ": giving up" << std::endl;
 		server.onDie();
 	} else {
 		if (m_timer.elapsed() > static_cast<unsigned>(settings.reconnectDelay * 1000)) {
--- a/lib/irccd/server.cpp	Wed May 11 13:58:42 2016 +0200
+++ b/lib/irccd/server.cpp	Wed May 11 21:00:49 2016 +0200
@@ -130,7 +130,7 @@
 
 	/* Auto join listed channels. */
 	for (const ServerChannel &channel : m_settings.channels) {
-		log::info() << "server " << m_info.name << ": auto joining " << channel.name << std::endl;
+		log::info() << "server " << m_name << ": auto joining " << channel.name << std::endl;
 		join(channel.name, channel.password);
 	}
 }
@@ -362,8 +362,9 @@
 	return ServerChannel{value, ""};
 }
 
-Server::Server(ServerInfo info, ServerIdentity identity, ServerSettings settings)
-	: m_info(std::move(info))
+Server::Server(std::string name, ServerInfo info, ServerIdentity identity, ServerSettings settings)
+	: m_name(std::move(name))
+	, m_info(std::move(info))
 	, m_settings(std::move(settings))
 	, m_identity(std::move(identity))
 	, m_session(std::make_unique<Session>())
@@ -447,7 +448,7 @@
 void Server::update() noexcept
 {
 	if (m_stateNext) {
-		log::debug("server {}: switch state {} -> {}"_format(m_info.name, m_state->ident(), m_stateNext->ident()));
+		log::debug("server {}: switch state {} -> {}"_format(m_name, m_state->ident(), m_stateNext->ident()));
 
 		m_state = std::move(m_stateNext);
 		m_stateNext = nullptr;
--- a/lib/irccd/server.hpp	Wed May 11 13:58:42 2016 +0200
+++ b/lib/irccd/server.hpp	Wed May 11 21:00:49 2016 +0200
@@ -98,7 +98,6 @@
 		SslVerify	= (1 << 2)		//!< Verify SSL
 	};
 
-	std::string name;				//!< Server's name
 	std::string host;				//!< Hostname
 	std::string password;				//!< Optional server password
 	std::uint16_t port{6667};			//!< Server's port
@@ -373,22 +372,26 @@
 	Signal<ServerWhois> onWhois;
 
 private:
+	// Identifier.
+	std::string m_name;
+
+	// Various settings.
 	ServerInfo m_info;
 	ServerSettings m_settings;
 	ServerIdentity m_identity;
 	ServerCache m_cache;
 
-	/* queue of requests to send */
+	// Queue of requests to send.
 	std::queue<std::function<bool ()>> m_queue;
 
-	/* libircclient session (bridge) */
+	// libircclient session (bridge).
 	std::unique_ptr<Session> m_session;
 
-	/* States */
+	// States.
 	std::unique_ptr<ServerState> m_state;
 	std::unique_ptr<ServerState> m_stateNext;
 
-	/* Handle libircclient callbacks */
+	// Handle libircclient callbacks.
 	void handleChannel(const char *, const char **) noexcept;
 	void handleChannelMode(const char *, const char **) noexcept;
 	void handleChannelNotice(const char *, const char **) noexcept;
@@ -418,11 +421,12 @@
 	/**
 	 * Construct a server.
 	 *
+	 * \param name the identifier
 	 * \param info the information
 	 * \param identity the identity
 	 * \param settings the settings
 	 */
-	Server(ServerInfo info, ServerIdentity identity = {}, ServerSettings settings = {});
+	Server(std::string name, ServerInfo info, ServerIdentity identity = {}, ServerSettings settings = {});
 
 	/**
 	 * Destructor. Close the connection if needed.
@@ -430,6 +434,16 @@
 	virtual ~Server();
 
 	/**
+	 * Get the server identifier.
+	 *
+	 * \return the id
+	 */
+	inline const std::string &name() const noexcept
+	{
+		return m_name;
+	}
+
+	/**
 	 * Get the server information.
 	 *
 	 * \return the server information
--- a/lib/irccd/service-server.cpp	Wed May 11 13:58:42 2016 +0200
+++ b/lib/irccd/service-server.cpp	Wed May 11 21:00:49 2016 +0200
@@ -42,7 +42,7 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onChannelMode:\n";
+	log::debug() << "server " << server->name() << ": event onChannelMode:\n";
 	log::debug() << "  origin: " << origin << "\n";
 	log::debug() << "  channel: " << channel << "\n";
 	log::debug() << "  mode: " << mode << "\n";
@@ -50,7 +50,7 @@
 
 	m_irccd.transportService().broadcast(json::object({
 		{ "event",	"onChannelMode"		},
-		{ "server",	server->info().name	},
+		{ "server",	server->name()		},
 		{ "origin",	origin			},
 		{ "channel",	channel			},
 		{ "mode",	mode			},
@@ -58,7 +58,7 @@
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, origin, channel,
+	m_irccd.post(ServerEvent(server->name(), origin, channel,
 		[=] (Plugin &) -> std::string {
 			return "onChannelMode";
 		},
@@ -77,21 +77,21 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onChannelNotice:\n";
+	log::debug() << "server " << server->name() << ": event onChannelNotice:\n";
 	log::debug() << "  origin: " << origin << "\n";
 	log::debug() << "  channel: " << channel << "\n";
 	log::debug() << "  message: " << message << std::endl;
 
 	m_irccd.transportService().broadcast(json::object({
 		{ "event",	"onChannelNotice"	},
-		{ "server",	server->info().name	},
+		{ "server",	server->name()		},
 		{ "origin",	origin			},
 		{ "channel",	channel			},
 		{ "message",	message			}
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, origin, channel,
+	m_irccd.post(ServerEvent(server->name(), origin, channel,
 		[=] (Plugin &) -> std::string {
 			return "onChannelNotice";
 		},
@@ -110,15 +110,15 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onConnect" << std::endl;
+	log::debug() << "server " << server->name() << ": event onConnect" << std::endl;
 
 	m_irccd.transportService().broadcast(json::object({
 		{ "event",	"onConnect"		},
-		{ "server",	server->info().name	}
+		{ "server",	server->name()		}
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, /* origin */ "", /* channel */ "",
+	m_irccd.post(ServerEvent(server->name(), /* origin */ "", /* channel */ "",
 		[=] (Plugin &) -> std::string {
 			return "onConnect";
 		},
@@ -137,20 +137,20 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onInvite:\n";
+	log::debug() << "server " << server->name() << ": event onInvite:\n";
 	log::debug() << "  origin: " << origin << "\n";
 	log::debug() << "  channel: " << channel << "\n";
 	log::debug() << "  target: " << target << std::endl;
 
 	m_irccd.transportService().broadcast(json::object({
 		{ "event",	"onInvite"		},
-		{ "server",	server->info().name	},
+		{ "server",	server->name()		},
 		{ "origin",	origin			},
 		{ "channel",	channel			}
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, origin, channel,
+	m_irccd.post(ServerEvent(server->name(), origin, channel,
 		[=] (Plugin &) -> std::string {
 			return "onInvite";
 		},
@@ -169,19 +169,19 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onJoin:\n";
+	log::debug() << "server " << server->name() << ": event onJoin:\n";
 	log::debug() << "  origin: " << origin << "\n";
 	log::debug() << "  channel: " << channel << std::endl;
 
 	m_irccd.transportService().broadcast(json::object({
 		{ "event",	"onJoin"		},
-		{ "server",	server->info().name	},
+		{ "server",	server->name()		},
 		{ "origin",	origin			},
 		{ "channel",	channel			}
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, origin, channel,
+	m_irccd.post(ServerEvent(server->name(), origin, channel,
 		[=] (Plugin &) -> std::string {
 			return "onJoin";
 		},
@@ -200,7 +200,7 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onKick:\n";
+	log::debug() << "server " << server->name() << ": event onKick:\n";
 	log::debug() << "  origin: " << origin << "\n";
 	log::debug() << "  channel: " << channel << "\n";
 	log::debug() << "  target: " << target << "\n";
@@ -208,7 +208,7 @@
 
 	m_irccd.transportService().broadcast(json::object({
 		{ "event",	"onKick"		},
-		{ "server",	server->info().name	},
+		{ "server",	server->name()		},
 		{ "origin",	origin			},
 		{ "channel",	channel			},
 		{ "target",	target			},
@@ -216,7 +216,7 @@
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, origin, channel,
+	m_irccd.post(ServerEvent(server->name(), origin, channel,
 		[=] (Plugin &) -> std::string {
 			return "onKick";
 		},
@@ -235,21 +235,21 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onMessage:\n";
+	log::debug() << "server " << server->name() << ": event onMessage:\n";
 	log::debug() << "  origin: " << origin << "\n";
 	log::debug() << "  channel: " << channel << "\n";
 	log::debug() << "  message: " << message << std::endl;
 
 	m_irccd.transportService().broadcast(json::object({
 		{ "event",	"onMessage"		},
-		{ "server",	server->info().name	},
+		{ "server",	server->name()		},
 		{ "origin",	origin			},
 		{ "channel",	channel			},
 		{ "message",	message			}
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, origin, channel,
+	m_irccd.post(ServerEvent(server->name(), origin, channel,
 		[=] (Plugin &plugin) -> std::string {
 			return util::parseMessage(message, server->settings().command, plugin.name()).second == util::MessageType::Command ? "onCommand" : "onMessage";
 		},
@@ -273,21 +273,21 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onMe:\n";
+	log::debug() << "server " << server->name() << ": event onMe:\n";
 	log::debug() << "  origin: " << origin << "\n";
 	log::debug() << "  target: " << target << "\n";
 	log::debug() << "  message: " << message << std::endl;
 
 	m_irccd.transportService().broadcast(json::object({
 		{ "event",	"onMe"			},
-		{ "server",	server->info().name	},
+		{ "server",	server->name()		},
 		{ "origin",	origin			},
 		{ "target",	target			},
 		{ "message",	message			}
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, origin, target,
+	m_irccd.post(ServerEvent(server->name(), origin, target,
 		[=] (Plugin &) -> std::string {
 			return "onMe";
 		},
@@ -306,19 +306,19 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onMode\n";
+	log::debug() << "server " << server->name() << ": event onMode\n";
 	log::debug() << "  origin: " << origin << "\n";
 	log::debug() << "  mode: " << mode << std::endl;
 
 	m_irccd.transportService().broadcast(json::object({
 		{ "event",	"onMode"		},
-		{ "server",	server->info().name	},
+		{ "server",	server->name()		},
 		{ "origin",	origin			},
 		{ "mode",	mode			}
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, origin, /* channel */ "",
+	m_irccd.post(ServerEvent(server->name(), origin, /* channel */ "",
 		[=] (Plugin &) -> std::string {
 			return "onMode";
 		},
@@ -337,7 +337,7 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onNames:\n";
+	log::debug() << "server " << server->name() << ": event onNames:\n";
 	log::debug() << "  channel: " << channel << "\n";
 	log::debug() << "  names: " << util::join(nicknames.begin(), nicknames.end(), ", ") << std::endl;
 
@@ -345,13 +345,13 @@
 
 	m_irccd.transportService().broadcast(json::object({
 		{ "event",	"onNames"		},
-		{ "server",	server->info().name	},
+		{ "server",	server->name()		},
 		{ "channel",	channel			},
 		{ "names",	std::move(names)	}
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, /* origin */ "", channel,
+	m_irccd.post(ServerEvent(server->name(), /* origin */ "", channel,
 		[=] (Plugin &) -> std::string {
 			return "onNames";
 		},
@@ -370,19 +370,19 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onNick:\n";
+	log::debug() << "server " << server->name() << ": event onNick:\n";
 	log::debug() << "  origin: " << origin << "\n";
 	log::debug() << "  nickname: " << nickname << std::endl;
 
 	m_irccd.transportService().broadcast(json::object({
 		{ "event",	"onNick"		},
-		{ "server",	server->info().name	},
+		{ "server",	server->name()		},
 		{ "origin",	origin			},
 		{ "nickname",	nickname		}
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, origin, /* channel */ "",
+	m_irccd.post(ServerEvent(server->name(), origin, /* channel */ "",
 		[=] (Plugin &) -> std::string {
 			return "onNick";
 		},
@@ -401,19 +401,19 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onNotice:\n";
+	log::debug() << "server " << server->name() << ": event onNotice:\n";
 	log::debug() << "  origin: " << origin << "\n";
 	log::debug() << "  message: " << message << std::endl;
 
 	m_irccd.transportService().broadcast(json::object({
 		{ "event",	"onNotice"		},
-		{ "server",	server->info().name	},
+		{ "server",	server->name()		},
 		{ "origin",	origin			},
 		{ "message",	message			}
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, origin, /* channel */ "",
+	m_irccd.post(ServerEvent(server->name(), origin, /* channel */ "",
 		[=] (Plugin &) -> std::string {
 			return "onNotice";
 		},
@@ -432,21 +432,21 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onPart:\n";
+	log::debug() << "server " << server->name() << ": event onPart:\n";
 	log::debug() << "  origin: " << origin << "\n";
 	log::debug() << "  channel: " << channel << "\n";
 	log::debug() << "  reason: " << reason << std::endl;
 
 	m_irccd.transportService().broadcast(json::object({
 		{ "event",	"onPart"		},
-		{ "server",	server->info().name	},
+		{ "server",	server->name()		},
 		{ "origin",	origin			},
 		{ "channel",	channel			},
 		{ "reason",	reason			}
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, origin, channel,
+	m_irccd.post(ServerEvent(server->name(), origin, channel,
 		[=] (Plugin &) -> std::string {
 			return "onPart";
 		},
@@ -465,19 +465,19 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onQuery:\n";
+	log::debug() << "server " << server->name() << ": event onQuery:\n";
 	log::debug() << "  origin: " << origin << "\n";
 	log::debug() << "  message: " << message << std::endl;
 
 	m_irccd.transportService().broadcast(json::object({
 		{ "event",	"onQuery"		},
-		{ "server",	server->info().name	},
+		{ "server",	server->name()		},
 		{ "origin",	origin			},
 		{ "message",	message			}
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, origin, /* channel */ "",
+	m_irccd.post(ServerEvent(server->name(), origin, /* channel */ "",
 		[=] (Plugin &plugin) -> std::string {
 			return util::parseMessage(message, server->settings().command, plugin.name()).second == util::MessageType::Command ? "onQueryCommand" : "onQuery";
 		},
@@ -501,21 +501,21 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onTopic:\n";
+	log::debug() << "server " << server->name() << ": event onTopic:\n";
 	log::debug() << "  origin: " << origin << "\n";
 	log::debug() << "  channel: " << channel << "\n";
 	log::debug() << "  topic: " << topic << std::endl;
 
 	m_irccd.transportService().broadcast(json::object({
 		{ "event",	"onTopic"		},
-		{ "server",	server->info().name	},
+		{ "server",	server->name()		},
 		{ "origin",	origin			},
 		{ "channel",	channel			},
 		{ "topic",	topic			}
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, origin, channel,
+	m_irccd.post(ServerEvent(server->name(), origin, channel,
 		[=] (Plugin &) -> std::string {
 			return "onTopic";
 		},
@@ -534,7 +534,7 @@
 		return;
 	}
 
-	log::debug() << "server " << server->info().name << ": event onWhois\n";
+	log::debug() << "server " << server->name() << ": event onWhois\n";
 	log::debug() << "  nickname: " << whois.nick << "\n";
 	log::debug() << "  username: " << whois.user << "\n";
 	log::debug() << "  host: " << whois.host << "\n";
@@ -542,7 +542,7 @@
 	log::debug() << "  channels: " << util::join(whois.channels.begin(), whois.channels.end()) << std::endl;
 
 	m_irccd.transportService().broadcast(json::object({
-		{ "server",	server->info().name	},
+		{ "server",	server->name()		},
 		{ "nickname",	whois.nick		},
 		{ "username",	whois.user		},
 		{ "host",	whois.host		},
@@ -550,7 +550,7 @@
 	}).toJson(0));
 
 #if defined(WITH_JS)
-	m_irccd.post(ServerEvent(server->info().name, /* origin */ "", /* channel */ "",
+	m_irccd.post(ServerEvent(server->name(), /* origin */ "", /* channel */ "",
 		[=] (Plugin &) -> std::string {
 			return "onWhois";
 		},
@@ -583,14 +583,14 @@
 
 bool ServerService::hasServer(const std::string &name) const noexcept
 {
-	return std::count_if(m_servers.cbegin(), m_servers.end(), [&] (const auto &sv) {
-		return sv->info().name == name;
+	return std::count_if(m_servers.cbegin(), m_servers.end(), [&] (const auto &server) {
+		return server->name() == name;
 	}) > 0;
 }
 
 void ServerService::addServer(std::shared_ptr<Server> server) noexcept
 {
-	assert(!hasServer(server->info().name));
+	assert(!hasServer(server->name()));
 
 	using namespace std::placeholders;
 
@@ -617,7 +617,7 @@
 			auto server = ptr.lock();
 
 			if (server) {
-				log::info("server {}: removed"_format(server->info().name));
+				log::info("server {}: removed"_format(server->name()));
 				m_servers.erase(std::find(m_servers.begin(), m_servers.end(), server));
 			}
 		});
@@ -629,7 +629,7 @@
 std::shared_ptr<Server> ServerService::getServer(const std::string &name) const noexcept
 {
 	auto it = std::find_if(m_servers.begin(), m_servers.end(), [&] (const auto &server) {
-		return server->info().name == name;
+		return server->name() == name;
 	});
 
 	if (it == m_servers.end()) {
@@ -653,7 +653,7 @@
 void ServerService::removeServer(const std::string &name)
 {
 	auto it = std::find_if(m_servers.begin(), m_servers.end(), [&] (const auto &server) {
-		return server->info().name == name;
+		return server->name() == name;
 	});
 
 	if (it != m_servers.end()) {