From 7ba5268e90b9ccb765c6a7572add0c4ba9adbc3b Mon Sep 17 00:00:00 2001 From: Les De Ridder Date: Wed, 24 May 2017 00:27:54 +0200 Subject: [PATCH] Check if the user is allowed to join a channel --- source/ircd/connection.d | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/source/ircd/connection.d b/source/ircd/connection.d index 101bd6f..a086884 100644 --- a/source/ircd/connection.d +++ b/source/ircd/connection.d @@ -331,16 +331,39 @@ class Connection } auto channelList = message.parameters[0].split(','); - foreach(channel; channelList) + foreach(channelName; channelList) { //TODO: Check if the user isn't already on the channel - if(!Server.isValidChannelName(channel)) + if(!Server.isValidChannelName(channelName)) { - sendErrNoSuchChannel(channel); + sendErrNoSuchChannel(channelName); } else { - _server.join(this, channel); + auto channelRange = _server.findChannelByName(channelName); + if(channelRange.empty) + { + _server.join(this, channelName); + } + else + { + auto channel = channelRange[0]; + if(channel.maskLists['b'].any!(m => matchesMask(m))) + { + send(Message(_server.name, "474", [nick, channelName, "Cannot join channel (+b)"], true)); + } + //TODO: Also account for invites from the INVITE command + else if(channel.modes.canFind('i') && !channel.maskLists['I'].any!(m => matchesMask(m))) + { + send(Message(_server.name, "473", [nick, channelName, "Cannot join channel (+i)"], true)); + } + //TODO: Implement channel limit + //TODO: Implement channel key + else + { + _server.join(this, channelName); + } + } } } }