const net = require('net'); const eol = require('os').EOL; const crypto = require('crypto'); const HASH_ALG = 'sha256'; const NAME_LEN = 10; var srvr = net.createServer(); var clientList = []; srvr.on('connection', function (client) { client.name = calcName(client.remoteAddress, client.remotePort); client.write('Welcome, ' + client.name + eol); clientList.push(client); client.on("data", function (data) { if (data.at(0) !== "\\".charCodeAt(0)) { broadcast(data, client); return; } command = data .subarray(1) .toString() .split(/[\s\r\n]+/) .filter((s) => s.length > 0); console.log(command); switch (command[0]) { case "list": const list = clientList.map((c) => c.name).join(eol); client.write("Connected Users" + eol + list + eol); break; case "rename": if (command.length !== 2) { client.write("Usage: \\rename " + eol); break; } const oldName = client.name; client.name = command[1]; client.write("You are now known as " + client.name + eol); broadcast(oldName + " is now known as " + client.name + eol, client); break; case "private": if (command.length < 3) { client.write("Usage: \\private " + eol); break; } const targetName = command[1]; const msg = command.slice(2).join(" "); const targetClient = clientList.find((c) => c.name === targetName); if (targetClient) { targetClient.write("(Private) " + client.name + " says " + msg + eol); client.write("(Private) To " + targetClient.name + ": " + msg + eol); } else { client.write("User " + targetName + " not found." + eol); } break; default: client.write("Unknown command: " + command[0] + eol); } }); }); function calcName(remoteAddress, remotePort) { let data = remoteAddress + ":" + remotePort; let h = crypto.createHash(HASH_ALG).update(data).digest('hex') return h.substring(0, NAME_LEN); } function broadcast(data, client) { for (var i in clientList) { if (client !== clientList[i]) { clientList[i].write(client.name + " says " + data); } } } srvr.listen(9000);