You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
3.0 KiB

const net = require("net")
const User = require("../src/user.js")
const RPL_WELCOME = '001'
const ERR_NOSUCHNICK = '401'
const ERR_NOSUCHCHANNEL = '403'
const ERR_CANNOTSENDTOCHAN = '404'
const ERR_UNKNOWNCOMMAND = '421'
const ERR_ERRONEUSNICKNAME = '432'
const ERR_NONICKNAMEGIVEN = '431'
const ERR_NICKNAMEINUSE = '433'
const ERR_NEEDMOREPARAMS = '461'
let server = {}
server.create = function create() {
let userlist = {}
let server = net.createServer((socket) => {
const user = new User(socket)
socket.on('data', function (data) {
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].slice(1)
} else {
tokenized[i] = splitted[i]
}
}
let command = tokenized[0].toUpperCase()
switch (command) {
case "PING":
if (tokenized[1] && tokenized[1] === "irc.example.com") {
socket.write("PONG irc.example.com\r\n")
}
break;
case "NICK":
if (tokenized[1]) {
let nickname = tokenized[1]
// nick collision test
if (!Object.keys(userlist).includes(nickname)) {
user.setNickname(nickname)
userlist[user.nickname] = user
} else {
socket.write(ERR_NICKNAMEINUSE, " nickname in use")
}
} else {
socket.write(ERR_NONICKNAMEGIVEN, "ERROR: NO NICKNAME PROVIDED")
}
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;
case "PRIVMSG":
let target = userlist[tokenized[1]]
let message = tokenized[2]
target.sendMsg(user, message)
break;
default:
console.error(`Unknown command: ${command}`);
}
}).on('error', (err) => {
console.error(err);
})
}).on('error', (err) => {
console.error(err);
throw err;
});
server.getUserlist = function() {
return userlist
}
return server
}
module.exports = server