diff --git a/source/ircd/connection.d b/source/ircd/connection.d index 63068d0..abad70a 100644 --- a/source/ircd/connection.d +++ b/source/ircd/connection.d @@ -139,6 +139,15 @@ class Connection { connected = false; send(Message(_server.name, "ERROR", ["Bye!"])); + + if(message.parameters.length > 0) + { + _server.quit(this, message.parameters[0]); + } + else + { + _server.quit(this, null); + } } void onJoin(Message message) diff --git a/source/ircd/server.d b/source/ircd/server.d index 0fbb647..f7a95da 100644 --- a/source/ircd/server.d +++ b/source/ircd/server.d @@ -98,6 +98,38 @@ class Server } channel.members = channel.members.remove!(m => m == connection); + + if(channel.members.length == 0) + { + channels = channels.remove!(c => c == channel); + } + } + + void quit(Connection connection, string quitMessage) + { + Connection[] peers; + foreach(channel; connection.channels) + { + peers ~= channel.members; + channel.members = channel.members.remove!(m => m == connection); + if(channel.members.length == 0) + { + channels = channels.remove!(c => c == channel); + } + } + peers = peers.sort().uniq.filter!(c => c != connection).array; + + foreach(peer; peers) + { + if(quitMessage !is null) + { + peer.send(Message(connection.mask, "QUIT", [quitMessage], true)); + } + else + { + peer.send(Message(connection.mask, "QUIT")); + } + } } void listen(ushort port = 6667)