diff --git a/src/server.js b/src/server.js index 7f725f4..fa6572d 100644 --- a/src/server.js +++ b/src/server.js @@ -18,7 +18,19 @@ server.create = function create() { let server = net.createServer((socket) => { const user = new User(socket) socket.on('data', function (data) { - let tokenized = data.toString("ascii").split("\r\n")[0].split(" ") + let splitted = data.toString("ascii").split("\r\n")[0].split(" ") + let tokenized = [] + let lastParam = -1 + for(let i = 0; i < splitted.length; i++) { + if (lastParam > 0) { + tokenized[lastParam] = tokenized[lastParam] + " " + splitted[i] + } else if (splitted[i].charAt(0) == ":" && i > 0) { + lastParam = i + tokenized[lastParam] = splitted[i] + } else { + tokenized[i] = splitted[i] + } + } let command = tokenized[0].toUpperCase() switch (command) { case "PING": @@ -43,6 +55,13 @@ server.create = function create() { } break; + + case "USER": + // ignoring servername and hostname, not useful these days + user.register(tokenized[1], tokenized[4]) + let address = user.getAddress() + socket.write(`001 ${user.nickname} :Welcome to the example IRC Project ${user.nickname}!~${user.username}@${address}`) + break; default: console.error(`Unknown command: ${command}`); } diff --git a/src/user.js b/src/user.js index 8b34c83..a71219f 100644 --- a/src/user.js +++ b/src/user.js @@ -1,19 +1,27 @@ -const userlist = require("../src/userlist.js") - function User(socket) { + this.registered = false + this.nickname = "" + this.connection = socket + this.realname = "" + this.username = "" + + this.setNickname = function(nickname) { + this.nickname = nickname + } - this.nickname = "" - this.user = "" - this.realname = "" + this.getNickname = function(nickname) { + return this.nickname + } - this.connection = socket + this.register = function(username, realname) { + this.username = username + this.realname = realname + this.registered = true + } - this.setNickname = function (nickname) { - this.nickname = nickname - } - this.setRealName = function (realname) { - this.realname = realname - } + this.getAddress = function() { + return this.connection.address().address + } } module.exports = User diff --git a/test/command_user.js b/test/command_user.js new file mode 100644 index 0000000..5d459c8 --- /dev/null +++ b/test/command_user.js @@ -0,0 +1,24 @@ +const assert = require('assert'); +const EventEmitter = require('events'); +const IRCServer = require("../src/server.js"); + +describe("USER OK", function () { + it("should handle a USER command -> USER guest tolmoon tolsun :Ronnie Reagan", function (done) { + const server = IRCServer.create() + let mockedSock = new EventEmitter() + mockedSock.address = function() { + return { port: 12346, family: 'IPv4', address: '127.0.0.1' } + } + mockedSock.write = function (data) { + assert.equal(data.toString("ascii"), "001 some_nick :Welcome to the example IRC Project some_nick!~guest@127.0.0.1") + done() + } + mockedSock.destroy = function () { + done("Destroyed socket without answering") + } + + server.emit("connection", mockedSock) + mockedSock.emit('data', Buffer.from("NICK some_nick\r\n", "ascii")) + mockedSock.emit('data', Buffer.from("USER guest tolmoon tolsun :Ronnie Reagan\r\n", "ascii")) + }) +})