Implement channel member limit and channel key (password)

This commit is contained in:
Les De Ridder 2020-02-12 15:18:19 +01:00
parent 786a3f17e8
commit 9543e78c5c
2 changed files with 36 additions and 22 deletions

View File

@ -21,7 +21,7 @@ class Channel
string[][char] maskLists; string[][char] maskLists;
string key; string key;
Nullable!uint userLimit; Nullable!uint memberLimit;
Connection[] inviteHolders; Connection[] inviteHolders;
private Server _server; private Server _server;
@ -175,12 +175,12 @@ class Channel
specialModeParameters ~= key; specialModeParameters ~= key;
} }
if (members.canFind(user) && !userLimit.isNull) if (members.canFind(user) && !memberLimit.isNull)
{ {
import std.conv : to; import std.conv : to;
specialModes ~= "l"; specialModes ~= "l";
specialModeParameters ~= userLimit.to!string; specialModeParameters ~= memberLimit.to!string;
} }
user.send(Message(_server.name, "324", [ user.send(Message(_server.name, "324", [
@ -330,19 +330,19 @@ class Channel
return true; return true;
} }
void setUserLimit(uint userLimit) void setMemberLimit(uint memberLimit)
{ {
this.userLimit = userLimit; this.memberLimit = memberLimit;
} }
bool unsetUserLimit() bool unsetMemberLimit()
{ {
if (userLimit.isNull) if (memberLimit.isNull)
{ {
return false; return false;
} }
userLimit.nullify(); memberLimit.nullify();
return true; return true;
} }

View File

@ -286,7 +286,7 @@ class Connection
if (!_server.isNickAvailable(newNick) && newNick.toIRCLower != nick.toIRCLower) if (!_server.isNickAvailable(newNick) && newNick.toIRCLower != nick.toIRCLower)
{ {
send(Message(_server.name, "433", [ send(Message(_server.name, "433", [
nick, newNick, "Nickname already in use" nick, newNick, "Nickname is already in use"
])); ]));
return; return;
} }
@ -396,7 +396,8 @@ class Connection
} }
auto channelList = message.parameters[0].split(','); auto channelList = message.parameters[0].split(',');
foreach (channelName; channelList) auto channelKeys = message.parameters.length > 1 ? message.parameters[1].split(',') : null;
foreach (i, channelName; channelList)
{ {
if (!Server.isValidChannelName(channelName)) if (!Server.isValidChannelName(channelName))
{ {
@ -418,14 +419,12 @@ class Connection
return; return;
} }
//TODO: Implement channel limit if (!channel.memberLimit.isNull
//TODO: Implement channel key && channel.members.length >= channel.memberLimit.get)
if (channel.maskLists['b'].any!(m => matchesMask(m)))
{ {
send(Message(_server.name, "474", [ send(Message(_server.name, "471", [
nick, channelName, "Cannot join channel (+b)" nick, channelName, "Cannot join channel (+l)"
], true)); ]));
} }
else if (channel.modes.canFind('i') else if (channel.modes.canFind('i')
&& !(channel.maskLists['I'].any!(m => matchesMask(m)) && !(channel.maskLists['I'].any!(m => matchesMask(m))
@ -433,7 +432,20 @@ class Connection
{ {
send(Message(_server.name, "473", [ send(Message(_server.name, "473", [
nick, channelName, "Cannot join channel (+i)" nick, channelName, "Cannot join channel (+i)"
], true)); ]));
}
else if (channel.maskLists['b'].any!(m => matchesMask(m)))
{
send(Message(_server.name, "474", [
nick, channelName, "Cannot join channel (+b)"
]));
}
else if (channel.key !is null && (channelKeys.length < i + 1
|| channelKeys[i] != channel.key))
{
send(Message(_server.name, "475", [
nick, channelName, "Cannot join channel (+k)"
]));
} }
else else
{ {
@ -1157,7 +1169,7 @@ class Connection
processedParameters ~= mask; processedParameters ~= mask;
} }
break; break;
case 'k': //TODO: Implement channel key case 'k':
if (i + 1 == message.parameters.length) if (i + 1 == message.parameters.length)
{ {
//TODO: Figure out what to do when we need more mode parameters //TODO: Figure out what to do when we need more mode parameters
@ -1176,7 +1188,7 @@ class Connection
processedParameters ~= key; processedParameters ~= key;
} }
break; break;
case 'l': //TODO: Implement user limit case 'l':
if (add) if (add)
{ {
if (i + 1 == message.parameters.length) if (i + 1 == message.parameters.length)
@ -1196,14 +1208,14 @@ class Connection
break Lforeach; break Lforeach;
} }
channel.setUserLimit(limit); channel.setMemberLimit(limit);
processedModes ~= mode; processedModes ~= mode;
processedParameters ~= limitString; processedParameters ~= limitString;
} }
else else
{ {
if (channel.unsetUserLimit()) if (channel.unsetMemberLimit())
{ {
processedModes ~= mode; processedModes ~= mode;
} }
@ -1280,6 +1292,8 @@ class Connection
], true)); ], true));
} }
//TODO: Refactor numeric replies
void sendWhoReply(string channel, Connection user, string nickPrefix, uint hopCount) void sendWhoReply(string channel, Connection user, string nickPrefix, uint hopCount)
{ {
auto flags = user.modes.canFind('a') ? "G" : "H"; auto flags = user.modes.canFind('a') ? "G" : "H";