From ee1e8ff950afccb0e0bbda89c877c20eede697eb Mon Sep 17 00:00:00 2001 From: Les De Ridder Date: Sat, 11 Mar 2017 06:14:48 +0100 Subject: [PATCH] Refactor --- .gitignore | 2 +- source/app.d | 129 --------------------------------------- source/ircd/app.d | 24 ++++++++ source/ircd/connection.d | 76 +++++++++++++++++++++++ source/ircd/message.d | 76 +++++++++++++++++++++++ 5 files changed, 177 insertions(+), 130 deletions(-) delete mode 100644 source/app.d create mode 100644 source/ircd/app.d create mode 100644 source/ircd/connection.d create mode 100644 source/ircd/message.d diff --git a/.gitignore b/.gitignore index ad58b69..5ea5ee9 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ __dummy.html *.o *.obj __test__*__ -ircd +/ircd diff --git a/source/app.d b/source/app.d deleted file mode 100644 index 191bde2..0000000 --- a/source/app.d +++ /dev/null @@ -1,129 +0,0 @@ -import vibe.d; - -import std.stdio; -import std.functional; -import std.array; -import std.algorithm; -import std.conv; - -shared static this() -{ - listenTCP(6667, toDelegate(&handleConnection), "127.0.0.1"); -} - -struct Message -{ - string prefix; - string command; - string[] parameters; - bool prefixedParameter; - - static Message fromString(string line) - { - string prefix = null; - if(line.startsWith(':')) - { - line = line[1 .. $]; - prefix = line[0 .. line.indexOf(' ')]; - line = line[prefix.length + 1 .. $]; - } - - auto command = line[0 .. line.indexOf(' ')]; - line = line[command.length + 1 .. $]; - string[] params = []; - bool prefixedParam; - while(true) - { - if(line.startsWith(':')) - { - params ~= line[1 .. $]; - prefixedParam = true; - break; - } - else if(line.canFind(' ')) - { - auto param = line[0 .. line.indexOf(' ')]; - line = line[param.length + 1 .. $]; - params ~= param; - } - else - { - params ~= line; - break; - } - } - - return Message(prefix, command, params, prefixedParam); - } - - string toString() - { - auto message = ""; - if(prefix != null) - { - message = ":" ~ prefix ~ " "; - } - - message ~= command ~ " "; - if(parameters.length > 1) - { - message ~= parameters[0 .. $-1].join(' ') ~ " "; - } - if(parameters[$-1].canFind(' ') || prefixedParameter) - { - message ~= ":"; - } - message ~= parameters[$-1]; - - return message; - } -} - -void send(TCPConnection connection, Message message) -{ - string messageString = message.toString; - writeln("S> " ~ messageString); - connection.write(messageString ~ "\r\n"); -} - -void handleConnection(TCPConnection connection) -{ - string nick; - string user; - string realname; - while(connection.connected) - { - auto message = Message.fromString((cast(string)connection.readLine()).chomp); - writeln("C> " ~ message.toString); - - switch(message.command) - { - case "NICK": - nick = message.parameters[0]; - writeln("nick: " ~ nick); - break; - case "USER": - user = message.parameters[0]; - realname = message.parameters[3]; - - writeln("user: " ~ user); - writeln("mode: " ~ message.parameters[1]); - writeln("unused: " ~ message.parameters[2]); - writeln("realname: " ~ realname); - - connection.send(Message("localhost", "001", [nick, "Welcome to the Internet Relay Network " ~ nick ~ "!" ~ user ~ "@hostname"], true)); - connection.send(Message("localhost", "002", [nick, "Your host is ircd, running version 0.01"], true)); - connection.send(Message("localhost", "003", [nick, "This server was created 2017-03-11"], true)); - connection.send(Message("localhost", "004", [nick, "ircd", "0.01", "w", "snt"])); - break; - case "PING": - connection.send(Message(null, "PONG", [message.parameters[0]])); - break; - default: - writeln("unknown command '", message.command, "'"); - break; - } - } -} - - diff --git a/source/ircd/app.d b/source/ircd/app.d new file mode 100644 index 0000000..cecd3f2 --- /dev/null +++ b/source/ircd/app.d @@ -0,0 +1,24 @@ +module ircd.app; + +import std.stdio; +import std.algorithm; +import core.time; + +import vibe.d; + +import ircd.message; +import ircd.connection; + +shared static this() +{ + Connection[] connections = []; + + listenTCP(6667, delegate(TCPConnection connection) + { + auto c = new Connection(connection); + connections ~= c; + c.handle(); + connections = connections.filter!(a => a != c).array; + },"127.0.0.1"); +} + diff --git a/source/ircd/connection.d b/source/ircd/connection.d new file mode 100644 index 0000000..bc94fc5 --- /dev/null +++ b/source/ircd/connection.d @@ -0,0 +1,76 @@ +module ircd.connection; + +import std.stdio; + +import vibe.d; + +import ircd.message; + +class Connection +{ + private TCPConnection _connection; + + //TODO: Make into auto-properties (via template) + string nick; + string user; + string realname; + + bool connected; + + this(TCPConnection connection) + { + _connection = connection; + } + + void send(Message message) + { + string messageString = message.toString; + writeln("S> " ~ messageString); + _connection.write(messageString ~ "\r\n"); + } + + void handle() + { + connected = true; + while(connected) + { + auto message = Message.fromString((cast(string)_connection.readLine()).chomp); + writeln("C> " ~ message.toString); + + switch(message.command) + { + case "NICK": + //TODO: Check availablity and validity etc. + nick = message.parameters[0]; + writeln("nick: " ~ nick); + break; + case "USER": + user = message.parameters[0]; + realname = message.parameters[3]; + + writeln("user: " ~ user); + writeln("mode: " ~ message.parameters[1]); + writeln("unused: " ~ message.parameters[2]); + writeln("realname: " ~ realname); + + send(Message("localhost", "001", [nick, "Welcome to the Internet Relay Network " ~ nick ~ "!" ~ user ~ "@hostname"], true)); + send(Message("localhost", "002", [nick, "Your host is ircd, running version 0.01"], true)); + send(Message("localhost", "003", [nick, "This server was created 2017-03-11"], true)); + send(Message("localhost", "004", [nick, "ircd", "0.01", "w", "snt"])); + break; + case "PING": + send(Message(null, "PONG", [message.parameters[0]])); + break; + case "QUIT": + send(Message(null, "ERROR", ["Bye!"])); + connected = false; + break; + default: + writeln("unknown command '", message.command, "'"); + break; + } + } + } + +} + diff --git a/source/ircd/message.d b/source/ircd/message.d new file mode 100644 index 0000000..c6e4dc8 --- /dev/null +++ b/source/ircd/message.d @@ -0,0 +1,76 @@ +module ircd.message; + +import std.string; +import std.functional; +import std.array; +import std.algorithm; +import std.conv; + +struct Message +{ + string prefix; + string command; + string[] parameters; + bool prefixedParameter; + + static Message fromString(string line) + { + string prefix = null; + if(line.startsWith(':')) + { + line = line[1 .. $]; + prefix = line[0 .. line.indexOf(' ')]; + line = line[prefix.length + 1 .. $]; + } + + auto command = line[0 .. line.indexOf(' ')]; + line = line[command.length + 1 .. $]; + string[] params = []; + bool prefixedParam; + while(true) + { + if(line.startsWith(':')) + { + params ~= line[1 .. $]; + prefixedParam = true; + break; + } + else if(line.canFind(' ')) + { + auto param = line[0 .. line.indexOf(' ')]; + line = line[param.length + 1 .. $]; + params ~= param; + } + else + { + params ~= line; + break; + } + } + + return Message(prefix, command, params, prefixedParam); + } + + string toString() + { + auto message = ""; + if(prefix != null) + { + message = ":" ~ prefix ~ " "; + } + + message ~= command ~ " "; + if(parameters.length > 1) + { + message ~= parameters[0 .. $-1].join(' ') ~ " "; + } + if(parameters[$-1].canFind(' ') || prefixedParameter) + { + message ~= ":"; + } + message ~= parameters[$-1]; + + return message; + } +} +