forked from lesderid/salty-ircd
Improve USER command handling
This commit is contained in:
parent
10bd22734d
commit
c198279238
|
@ -23,7 +23,8 @@ class Connection
|
||||||
string nick;
|
string nick;
|
||||||
string user;
|
string user;
|
||||||
string realname;
|
string realname;
|
||||||
string hostname = "HOSTNAME";
|
string hostname;
|
||||||
|
char[] modes;
|
||||||
|
|
||||||
@property string mask() { return nick ~ "!" ~ user ~ "@" ~ hostname; }
|
@property string mask() { return nick ~ "!" ~ user ~ "@" ~ hostname; }
|
||||||
|
|
||||||
|
@ -52,7 +53,7 @@ class Connection
|
||||||
void send(Message message)
|
void send(Message message)
|
||||||
{
|
{
|
||||||
string messageString = message.toString;
|
string messageString = message.toString;
|
||||||
writeln("S> " ~ messageString ~ " (" ~ nick.to!string ~ ")");
|
writeln("S> " ~ messageString);
|
||||||
_connection.write(messageString ~ "\r\n");
|
_connection.write(messageString ~ "\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,10 +159,21 @@ class Connection
|
||||||
|
|
||||||
void onUser(Message message)
|
void onUser(Message message)
|
||||||
{
|
{
|
||||||
//TODO: Parse user mode
|
if(message.parameters.length < 4)
|
||||||
|
{
|
||||||
|
sendErrNeedMoreParams(message.command);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(user !is null)
|
||||||
|
{
|
||||||
|
send(Message(_server.name, "462", [nick, "Unauthorized command (already registered)"], true));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: Maybe do something with the unused parameter?
|
||||||
user = message.parameters[0];
|
user = message.parameters[0];
|
||||||
writeln("mode: " ~ message.parameters[1]);
|
modes = modeMaskToModes(message.parameters[1]);
|
||||||
writeln("unused: " ~ message.parameters[2]);
|
|
||||||
realname = message.parameters[3];
|
realname = message.parameters[3];
|
||||||
hostname = getHost();
|
hostname = getHost();
|
||||||
|
|
||||||
|
@ -188,6 +200,12 @@ class Connection
|
||||||
|
|
||||||
void onJoin(Message message)
|
void onJoin(Message message)
|
||||||
{
|
{
|
||||||
|
if(message.parameters.length == 0)
|
||||||
|
{
|
||||||
|
sendErrNeedMoreParams(message.command);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
auto channel = message.parameters[0];
|
auto channel = message.parameters[0];
|
||||||
if(!Server.isValidChannelName(channel))
|
if(!Server.isValidChannelName(channel))
|
||||||
{
|
{
|
||||||
|
@ -201,6 +219,12 @@ class Connection
|
||||||
|
|
||||||
void onPart(Message message)
|
void onPart(Message message)
|
||||||
{
|
{
|
||||||
|
if(message.parameters.length == 0)
|
||||||
|
{
|
||||||
|
sendErrNeedMoreParams(message.command);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//TODO: Support channel lists
|
//TODO: Support channel lists
|
||||||
//TODO: Check if user is member of channel(s)
|
//TODO: Check if user is member of channel(s)
|
||||||
auto channel = message.parameters[0];
|
auto channel = message.parameters[0];
|
||||||
|
@ -271,21 +295,26 @@ class Connection
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendErrNoSuchChannel(string name)
|
|
||||||
{
|
|
||||||
send(Message(_server.name, "403", [nick, name, "No such channel"], true));
|
|
||||||
}
|
|
||||||
|
|
||||||
void sendErrNoSuchNick(string name)
|
void sendErrNoSuchNick(string name)
|
||||||
{
|
{
|
||||||
send(Message(_server.name, "401", [nick, name, "No such nick/channel"], true));
|
send(Message(_server.name, "401", [nick, name, "No such nick/channel"], true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sendErrNoSuchChannel(string name)
|
||||||
|
{
|
||||||
|
send(Message(_server.name, "403", [nick, name, "No such channel"], true));
|
||||||
|
}
|
||||||
|
|
||||||
void sendErrNoNickGiven()
|
void sendErrNoNickGiven()
|
||||||
{
|
{
|
||||||
send(Message(_server.name, "431", [nick, "No nickname given"], true));
|
send(Message(_server.name, "431", [nick, "No nickname given"], true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sendErrNeedMoreParams(string command)
|
||||||
|
{
|
||||||
|
send(Message(_server.name, "461", [nick, command, "Not enough parameters"], true));
|
||||||
|
}
|
||||||
|
|
||||||
string getHost()
|
string getHost()
|
||||||
{
|
{
|
||||||
auto address = parseAddress(_connection.peerAddress);
|
auto address = parseAddress(_connection.peerAddress);
|
||||||
|
@ -296,5 +325,26 @@ class Connection
|
||||||
}
|
}
|
||||||
return hostname;
|
return hostname;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char[] modeMaskToModes(string maskString)
|
||||||
|
{
|
||||||
|
import std.conv : to;
|
||||||
|
import std.exception : ifThrown;
|
||||||
|
|
||||||
|
auto mask = maskString.to!ubyte.ifThrown(0);
|
||||||
|
|
||||||
|
char[] modes;
|
||||||
|
|
||||||
|
if(mask & 0b100)
|
||||||
|
{
|
||||||
|
modes ~= 'w';
|
||||||
|
}
|
||||||
|
if(mask & 0b1000)
|
||||||
|
{
|
||||||
|
modes ~= 'i';
|
||||||
|
}
|
||||||
|
|
||||||
|
return modes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue