Fixed chat

This commit is contained in:
Klemek
2019-06-09 17:03:53 +02:00
parent eb84248f2a
commit 911f18ee8a
+76 -59
View File
@@ -1,7 +1,7 @@
var app = require('express')(); const app = require('express')();
var http = require('http').Server(app); const http = require('http').Server(app);
var io = require('socket.io')(http); const io = require('socket.io')(http);
var convert = require('color-convert'); const convert = require('color-convert');
function randint(min, max) { function randint(min, max) {
return min + Math.floor(Math.random() * (max - min)); return min + Math.floor(Math.random() * (max - min));
@@ -11,18 +11,8 @@ function randomColor() {
return '#' + convert.hsl.hex([randint(0, 256), randint(50, 200), randint(150, 256)]); return '#' + convert.hsl.hex([randint(0, 256), randint(50, 200), randint(150, 256)]);
} }
function rgbToHex(r, g, b) { function usernameTaken(list, username) {
return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1); return Object.values(list).filter(m => m.name.toLowerCase() === username.toLowerCase()).length > 0;
}
function usernameTaken(i, username) {
var keys = Object.keys(list);
var taken = false;
keys.forEach(function (iid) {
if (i !== iid && list[iid].name.toLowerCase() === username.toLowerCase())
taken = true;
});
return taken;
} }
function escapeHtml(unsafe) { function escapeHtml(unsafe) {
@@ -34,46 +24,59 @@ function escapeHtml(unsafe) {
.replace(/'/g, '&#039;'); .replace(/'/g, '&#039;');
} }
app.get('/', function (req, res) { function connectUser(list, socket) {
res.sendFile(__dirname + '/chat.html'); const iid = randint(0, 9999999);
}); const u = {
name: 'anonymous#' + ('0000' + randint(0, 9999)).slice(-4),
var list = {}; color: randomColor()
};
io.on('connection', function (socket) { list[iid] = u;
socket.iid = randint(9999999); console.log(u.name + ' connected');
socket.name = 'anonymous#' + ('0000' + randint(0,9999)).slice(-4);
socket.color = randomColor();
list['u'+socket.iid] = socket;
console.log(socket.name + ' connected');
socket.emit('chat message', { socket.emit('chat message', {
color: '#fff', color: '#fff',
name: '', name: '',
text: 'Welcome to the server' text: 'Welcome to the server'
}); });
setTimeout(function () { setTimeout(function () {
socket.emit('new name', socket.name); socket.emit('new name', u.name);
socket.emit('new color', socket.color); socket.emit('new color', u.color);
}, 1000); }, 1000);
io.emit('chat message', { io.emit('chat message', {
color: '#fff', color: '#fff',
name: '', name: '',
text: '<span style="color:' + socket.color + '">' + escapeHtml(socket.name) + '</span> connected.' text: '<span style="color:' + u.color + '">' + escapeHtml(u.name) + '</span> connected.'
}); });
socket.on('disconnect', function () { return iid;
delete list['u'+socket.iid]; }
console.log(socket.name + ' disconnected');
function disconnectUser(list, iid) {
const u = list[iid];
if (!u)
return;
delete list[iid];
console.log(u.name + ' disconnected');
io.emit('chat message', { io.emit('chat message', {
color: '#fff', color: '#fff',
name: '', name: '',
text: '<span style="color:' + socket.color + '">' + escapeHtml(socket.name) + '</span> disconnected.' text: '<span style="color:' + u.color + '">' + escapeHtml(u.name) + '</span> disconnected.'
}); });
}
function userAction(list, iid, socket, msg) {
const u = list[iid];
if (!u) {
socket.emit('chat message', {
color: '#f00',
name: '',
text: 'You are not registered on the server'
}); });
socket.on('chat message', function (msg) { return;
}
if (!msg.trim()) if (!msg.trim())
return; return;
console.log(socket.name + '>' + msg); console.log(u.name + '>' + msg);
if (msg[0] === '/') { if (msg[0] === '/') {
const arg1 = msg.split(' ')[1];
switch (msg.split(' ')[0]) { switch (msg.split(' ')[0]) {
case '/help': case '/help':
socket.emit('chat message', { socket.emit('chat message', {
@@ -89,21 +92,19 @@ io.on('connection', function (socket) {
}); });
break; break;
case '/color': case '/color':
var arg1 = msg.split(' ')[1];
if (arg1 && /^#[0-9a-fA-F]{3,6}|[a-zA-Z-_]*$/.test(arg1)) { if (arg1 && /^#[0-9a-fA-F]{3,6}|[a-zA-Z-_]*$/.test(arg1)) {
socket.color = arg1; u.color = arg1;
} else { } else {
socket.color = randomColor(); u.color = randomColor();
} }
socket.emit('chat message', { socket.emit('chat message', {
color: '#fff', color: '#fff',
name: '', name: '',
text: 'Your new color is <span style="color:' + socket.color + '">' + escapeHtml(socket.color) + '</span>.' text: 'Your new color is <span style="color:' + u.color + '">' + escapeHtml(u.color) + '</span>.'
}); });
socket.emit('new color', socket.color); socket.emit('new color', u.color);
break; break;
case '/img': case '/img':
var arg1 = msg.split(' ')[1];
if (!arg1) { if (!arg1) {
socket.emit('chat message', { socket.emit('chat message', {
color: '#f00', color: '#f00',
@@ -114,16 +115,16 @@ io.on('connection', function (socket) {
io.emit('chat message', { io.emit('chat message', {
color: '#fff', color: '#fff',
name: '', name: '',
text: '<span style="color:' + socket.color + '">' + escapeHtml(socket.name) + '</span><br><br>' + text: '<span style="color:' + u.color + '">' + escapeHtml(u.name) + '</span><br><br>' +
'<img title="'+escapeHtml(arg1)+'" src="'+encodeURI(arg1)+'"/>' '<img alt="' + encodeURI(arg1) + '" title="' + escapeHtml(arg1) + '" src="' + encodeURI(arg1) + '"/>'
}); });
} }
break; break;
case '/list': case '/list':
var keys = Object.keys(list); const keys = Object.keys(list);
var text = keys.length + ' users :'; let text = keys.length + ' users :';
keys.forEach(function (iid) { keys.forEach(function (iid2) {
var m = list[iid]; const m = list[iid2];
text += '<br>&gt;&nbsp;<span style="color:' + m.color + '">' + escapeHtml(m.name) + '</span>' text += '<br>&gt;&nbsp;<span style="color:' + m.color + '">' + escapeHtml(m.name) + '</span>'
}); });
socket.emit('chat message', { socket.emit('chat message', {
@@ -133,18 +134,18 @@ io.on('connection', function (socket) {
}); });
break; break;
case '/nick': case '/nick':
var name = msg.trim().substr(msg.indexOf(' ') + 1); let name = msg.trim().substr(msg.indexOf(' ') + 1);
if (name) { if (name) {
name = name.substr(0, 200); name = name.substr(0, 200);
if (!usernameTaken(socket.iid, name)) { if (!usernameTaken(list, name)) {
var oldname = socket.name; let oldname = u.name;
socket.name = name; u.name = name;
io.emit('chat message', { io.emit('chat message', {
color: '#fff', color: '#fff',
name: '', name: '',
text: '<span style="color:' + socket.color + '">' + escapeHtml(oldname) + '</span> is now <span style="color:' + socket.color + '">' + escapeHtml(socket.name) + '</span>.' text: '<span style="color:' + socket.color + '">' + escapeHtml(oldname) + '</span> is now <span style="color:' + u.color + '">' + escapeHtml(u.name) + '</span>.'
}); });
socket.emit('new name', socket.name); socket.emit('new name', u.name);
} else { } else {
socket.emit('chat message', { socket.emit('chat message', {
color: '#f00', color: '#f00',
@@ -162,9 +163,9 @@ io.on('connection', function (socket) {
break; break;
case '/me': case '/me':
io.emit('chat message', { io.emit('chat message', {
color: socket.color, color: u.color,
name: '', name: '',
text: '*<b>' + escapeHtml(socket.name) + '</b> ' + escapeHtml(msg.trim().substr(msg.indexOf(' ') + 1)) + '*' text: '*<b>' + escapeHtml(u.name) + '</b> ' + escapeHtml(msg.trim().substr(msg.indexOf(' ') + 1)) + '*'
}); });
break; break;
default: default:
@@ -177,11 +178,27 @@ io.on('connection', function (socket) {
} }
} else { } else {
io.emit('chat message', { io.emit('chat message', {
color: socket.color, color: u.color,
name: socket.name, name: u.name,
text: msg.substr(0, 2000) text: msg.substr(0, 2000)
}); });
} }
}
app.get('/', function (req, res) {
res.sendFile(__dirname + '/chat.html');
});
const list = {};
io.on('connection', function (socket) {
const iid = connectUser(list, socket);
socket.on('disconnect', function () {
disconnectUser(list, iid);
});
socket.on('chat message', function (msg) {
userAction(list, iid, socket, msg);
}); });
}); });