Files
cs-252/lab12/chatServer.js
2026-04-07 15:37:21 -07:00

80 lines
2.3 KiB
JavaScript

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 <newname>" + 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 <name> <msg>" + 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);