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.

99 lines
3.3 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_NONICKNAMEGIVEN = '431'
  10. const ERR_NICKNAMEINUSE = '433'
  11. const ERR_NEEDMOREPARAMS = '461'
  12. let server = {}
  13. server.create = function create() {
  14. let userlist = {}
  15. let server = net.createServer((socket) => {
  16. const user = new User(socket)
  17. socket.on('data', function (data) {
  18. let splitted = data.toString("ascii").split("\r\n")[0].split(" ")
  19. let tokenized = []
  20. let lastParam = -1
  21. for(let i = 0; i < splitted.length; i++) {
  22. if (lastParam > 0) {
  23. tokenized[lastParam] = tokenized[lastParam] + " " + splitted[i]
  24. } else if (splitted[i].charAt(0) == ":" && i > 0) {
  25. lastParam = i
  26. tokenized[lastParam] = splitted[i]
  27. } else {
  28. tokenized[i] = splitted[i]
  29. }
  30. }
  31. let command = tokenized[0].toUpperCase()
  32. switch (command) {
  33. case "PING":
  34. if (tokenized[1] && tokenized[1] === "irc.example.com") {
  35. socket.write("PONG irc.example.com\r\n")
  36. }
  37. break;
  38. case "NICK":
  39. if (tokenized[1]) {
  40. let nickname = tokenized[1]
  41. // nick collision test
  42. if (!Object.keys(userlist).includes(nickname)) {
  43. user.setNickname(nickname)
  44. userlist[user.nickname] = user
  45. } else {
  46. socket.write(ERR_NICKNAMEINUSE, " nickname in use")
  47. }
  48. } else {
  49. socket.write(ERR_NONICKNAMEGIVEN, "ERROR: NO NICKNAME PROVIDED")
  50. }
  51. break;
  52. case "USER":
  53. // ignoring servername and hostname, not useful these days
  54. user.register(tokenized[1], tokenized[4])
  55. let address = user.getAddress()
  56. socket.write(`001 ${user.nickname} :Welcome to the example IRC Project ${user.nickname}!~${user.username}@${address}`)
  57. break;
  58. case "QUIT":
  59. server.closeConnection(user)
  60. default:
  61. console.error(`Unknown command: ${command}`);
  62. }
  63. }).on('error', (err) => {
  64. console.error(err);
  65. })
  66. }).on('error', (err) => {
  67. console.error(err);
  68. throw err;
  69. });
  70. server.getUserlist = function() {
  71. return userlist
  72. }
  73. server.getUserObjectFromNickName = function (nickname) {
  74. user_list = server.getUserlist()
  75. if (nickname in user_list)
  76. return user_list[nickname]
  77. }
  78. server.closeConnection = function (user_nickname) {
  79. console.log(user_nickname)
  80. userObject = server.getUserObjectFromNickName(user_nickname)
  81. userObject.closeConnection()
  82. delete server.getUserlist()[user_nickname]
  83. }
  84. return server
  85. }
  86. module.exports = server