Improve USER command handling

This commit is contained in:
Les De Ridder 2017-03-17 04:03:29 +01:00
parent 10bd22734d
commit c198279238
No known key found for this signature in database
GPG Key ID: 5EC132DFA85DB372
1 changed files with 60 additions and 10 deletions

View File

@ -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;
}
} }