diff --git a/source/ircd/channel.d b/source/ircd/channel.d index a569ca5..517e057 100644 --- a/source/ircd/channel.d +++ b/source/ircd/channel.d @@ -21,6 +21,7 @@ class Channel string key; Nullable!uint userLimit; + Connection[] inviteHolders; private Server _server; @@ -43,6 +44,11 @@ class Channel { memberModes[connection] = []; } + + if(inviteHolders.canFind(connection)) + { + inviteHolders = inviteHolders.remove!(c => c == connection); + } } void part(Connection connection, string partMessage) @@ -63,6 +69,11 @@ class Channel memberModes.remove(connection); } + void invite(Connection connection) + { + inviteHolders ~= connection; + } + void sendNames(Connection connection, bool sendRplEndOfNames = true) { string channelType; @@ -196,6 +207,8 @@ class Channel modes ~= mode; + //TODO: If RFC-strictness is off, clear the invite list when +i is set + return true; } diff --git a/source/ircd/connection.d b/source/ircd/connection.d index a086884..03747db 100644 --- a/source/ircd/connection.d +++ b/source/ircd/connection.d @@ -352,8 +352,7 @@ class Connection { 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))) + else if(channel.modes.canFind('i') && !(channel.maskLists['I'].any!(m => matchesMask(m)) || channel.inviteHolders.canFind(this))) { send(Message(_server.name, "473", [nick, channelName, "Cannot join channel (+i)"], true)); } diff --git a/source/ircd/server.d b/source/ircd/server.d index 7ef8a95..7270e5c 100644 --- a/source/ircd/server.d +++ b/source/ircd/server.d @@ -323,6 +323,10 @@ class Server void invite(Connection inviter, string target, string channelName) { auto user = findConnectionByNick(target)[0]; + auto channel = findChannelByName(channelName)[0]; + + channel.invite(user); + user.send(Message(inviter.prefix, "INVITE", [user.nick, channelName])); }