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.

61 lines
2.1 KiB

  1. const net = require("net")
  2. const User = require("../src/user.js")
  3. const RPL_WELCOME = '001'
  4. const ERR_NOSUCHNICK = '401'
  5. const ERR_NOSUCHCHANNEL = '403'
  6. const ERR_CANNOTSENDTOCHAN = '404'
  7. const ERR_UNKNOWNCOMMAND = '421'
  8. const ERR_ERRONEUSNICKNAME = '432'
  9. const ERR_NICKNAMEINUSE = '433'
  10. const ERR_NEEDMOREPARAMS = '461'
  11. const ERR_NONICKNAMEGIVEN = '431'
  12. let server = {}
  13. let registeredUserlist = require("../src/userlist.js")
  14. server.create = function create() {
  15. return net.createServer((socket) => {
  16. const user = new User(socket)
  17. socket.on('data', function (data) {
  18. let tokenized = data.toString("ascii").split("\r\n")[0].split(" ")
  19. let command = tokenized[0].toUpperCase()
  20. switch (command) {
  21. case "PING":
  22. if (tokenized[1] && tokenized[1] === "irc.example.com") {
  23. socket.write("PONG irc.example.com\r\n")
  24. }
  25. break;
  26. case "NICK":
  27. if (tokenized[1]) {
  28. let nickname = tokenized[1]
  29. // nick collision test
  30. console.log(Object.keys(registeredUserlist));
  31. if (!Object.keys(registeredUserlist).includes(nickname)) {
  32. user.setNickname(nickname)
  33. registeredUserlist[nickname] = user
  34. socket.write(RPL_WELCOME, " nick " + nickname + " succesfully added.\r\n")
  35. } else {
  36. socket.write(ERR_NICKNAMEINUSE, " nickname in use\r\n")
  37. }
  38. } else {
  39. socket.write(ERR_NONICKNAMEGIVEN, " :No nickname given\r\n")
  40. }
  41. break;
  42. default:
  43. console.error(`Unknown command: ${command}`);
  44. }
  45. }).on('error', (err) => {
  46. console.error(err);
  47. })
  48. }).on('error', (err) => {
  49. console.error(err);
  50. throw err;
  51. });
  52. }
  53. module.exports = server