forked from lesderid/salty-ircd
Implement channel member limit and channel key (password)
This commit is contained in:
parent
786a3f17e8
commit
9543e78c5c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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";
|
||||||
|
|
Loading…
Reference in New Issue