diff --git a/chat.js b/chat.js index 59b86f8..154f9bc 100644 --- a/chat.js +++ b/chat.js @@ -1,190 +1,207 @@ -var app = require('express')(); -var http = require('http').Server(app); -var io = require('socket.io')(http); -var convert = require('color-convert'); +const app = require('express')(); +const http = require('http').Server(app); +const io = require('socket.io')(http); +const convert = require('color-convert'); function randint(min, max) { - return min + Math.floor(Math.random() * (max-min)); + return min + Math.floor(Math.random() * (max - min)); } 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) { - return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1); -} - -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 usernameTaken(list, username) { + return Object.values(list).filter(m => m.name.toLowerCase() === username.toLowerCase()).length > 0; } function escapeHtml(unsafe) { - return unsafe - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"') - .replace(/'/g, '''); + return unsafe + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +function connectUser(list, socket) { + const iid = randint(0, 9999999); + const u = { + name: 'anonymous#' + ('0000' + randint(0, 9999)).slice(-4), + color: randomColor() + }; + list[iid] = u; + console.log(u.name + ' connected'); + socket.emit('chat message', { + color: '#fff', + name: '', + text: 'Welcome to the server' + }); + setTimeout(function () { + socket.emit('new name', u.name); + socket.emit('new color', u.color); + }, 1000); + io.emit('chat message', { + color: '#fff', + name: '', + text: '' + escapeHtml(u.name) + ' connected.' + }); + return iid; +} + +function disconnectUser(list, iid) { + const u = list[iid]; + if (!u) + return; + delete list[iid]; + console.log(u.name + ' disconnected'); + io.emit('chat message', { + color: '#fff', + name: '', + text: '' + escapeHtml(u.name) + ' 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' + }); + return; + } + if (!msg.trim()) + return; + console.log(u.name + '>' + msg); + if (msg[0] === '/') { + const arg1 = msg.split(' ')[1]; + switch (msg.split(' ')[0]) { + case '/help': + socket.emit('chat message', { + color: '#fff', + name: '', + text: '' + + 'List of commands :
' + + '/color (color) : change color (random if blank)
' + + '/img [url] : show image
' + + '/list : list users
' + + '/me : express yourself
' + + '/nick [username] : change username
' + }); + break; + case '/color': + if (arg1 && /^#[0-9a-fA-F]{3,6}|[a-zA-Z-_]*$/.test(arg1)) { + u.color = arg1; + } else { + u.color = randomColor(); + } + socket.emit('chat message', { + color: '#fff', + name: '', + text: 'Your new color is ' + escapeHtml(u.color) + '.' + }); + socket.emit('new color', u.color); + break; + case '/img': + if (!arg1) { + socket.emit('chat message', { + color: '#f00', + name: '', + text: 'Please specify url' + }); + } else { + io.emit('chat message', { + color: '#fff', + name: '', + text: '' + escapeHtml(u.name) + '

' + + '' + encodeURI(arg1) + '' + }); + } + break; + case '/list': + const keys = Object.keys(list); + let text = keys.length + ' users :'; + keys.forEach(function (iid2) { + const m = list[iid2]; + text += '
' + escapeHtml(m.name) + '' + }); + socket.emit('chat message', { + color: '#fff', + name: '', + text: text + }); + break; + case '/nick': + let name = msg.trim().substr(msg.indexOf(' ') + 1); + if (name) { + name = name.substr(0, 200); + if (!usernameTaken(list, name)) { + let oldname = u.name; + u.name = name; + io.emit('chat message', { + color: '#fff', + name: '', + text: '' + escapeHtml(oldname) + ' is now ' + escapeHtml(u.name) + '.' + }); + socket.emit('new name', u.name); + } else { + socket.emit('chat message', { + color: '#f00', + name: '', + text: 'Username already taken' + }); + } + } else { + socket.emit('chat message', { + color: '#f00', + name: '', + text: 'Please specify username' + }); + } + break; + case '/me': + io.emit('chat message', { + color: u.color, + name: '', + text: '*' + escapeHtml(u.name) + ' ' + escapeHtml(msg.trim().substr(msg.indexOf(' ') + 1)) + '*' + }); + break; + default: + socket.emit('chat message', { + color: '#f00', + name: '', + text: 'Unknown command ' + msg.split(' ')[0] + '
type /help for list of commands' + }); + break; + } + } else { + io.emit('chat message', { + color: u.color, + name: u.name, + text: msg.substr(0, 2000) + }); + } } app.get('/', function (req, res) { - res.sendFile(__dirname + '/chat.html'); + res.sendFile(__dirname + '/chat.html'); }); -var list = {}; +const list = {}; io.on('connection', function (socket) { - socket.iid = randint(9999999); - 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', { - color: '#fff', - name: '', - text: 'Welcome to the server' - }); - setTimeout(function(){ - socket.emit('new name', socket.name); - socket.emit('new color', socket.color); - },1000); - io.emit('chat message', { - color: '#fff', - name: '', - text: '' + escapeHtml(socket.name) + ' connected.' - }); - socket.on('disconnect', function () { - delete list['u'+socket.iid]; - console.log(socket.name + ' disconnected'); - io.emit('chat message', { - color: '#fff', - name: '', - text: '' + escapeHtml(socket.name) + ' disconnected.' - }); - }); - socket.on('chat message', function (msg) { - if (!msg.trim()) - return; - console.log(socket.name + '>' + msg); - if (msg[0] === '/') { - switch (msg.split(' ')[0]) { - case '/help': - socket.emit('chat message', { - color: '#fff', - name: '', - text: '' + - 'List of commands :
' + - '/color (color) : change color (random if blank)
' + - '/img [url] : show image
' + - '/list : list users
' + - '/me : express yourself
' + - '/nick [username] : change username
' - }); - break; - case '/color': - var arg1 = msg.split(' ')[1]; - if (arg1 && /^#[0-9a-fA-F]{3,6}|[a-zA-Z-_]*$/.test(arg1)) { - socket.color = arg1; - } else { - socket.color = randomColor(); - } - socket.emit('chat message', { - color: '#fff', - name: '', - text: 'Your new color is ' + escapeHtml(socket.color) + '.' - }); - socket.emit('new color', socket.color); - break; - case '/img': - var arg1 = msg.split(' ')[1]; - if(!arg1){ - socket.emit('chat message', { - color: '#f00', - name: '', - text: 'Please specify url' - }); - }else{ - io.emit('chat message', { - color: '#fff', - name: '', - text: '' + escapeHtml(socket.name) + '

' + - '' - }); - } - break; - case '/list': - var keys = Object.keys(list); - var text = keys.length + ' users :'; - keys.forEach(function (iid) { - var m = list[iid]; - text += '
' + escapeHtml(m.name) + '' - }); - socket.emit('chat message', { - color: '#fff', - name: '', - text: text - }); - break; - case '/nick': - var name = msg.trim().substr(msg.indexOf(' ') + 1); - if (name) { - name = name.substr(0,200); - if (!usernameTaken(socket.iid, name)) { - var oldname = socket.name; - socket.name = name; - io.emit('chat message', { - color: '#fff', - name: '', - text: '' + escapeHtml(oldname) + ' is now ' + escapeHtml(socket.name) + '.' - }); - socket.emit('new name', socket.name); - } else { - socket.emit('chat message', { - color: '#f00', - name: '', - text: 'Username already taken' - }); - } - } else { - socket.emit('chat message', { - color: '#f00', - name: '', - text: 'Please specify username' - }); - } - break; - case '/me': - io.emit('chat message', { - color: socket.color, - name: '', - text: '*' + escapeHtml(socket.name) + ' ' + escapeHtml(msg.trim().substr(msg.indexOf(' ') + 1)) + '*' - }); - break; - default: - socket.emit('chat message', { - color: '#f00', - name: '', - text: 'Unknown command ' + msg.split(' ')[0] + '
type /help for list of commands' - }); - break; - } - } else { - io.emit('chat message', { - color: socket.color, - name: socket.name, - text: msg.substr(0,2000) - }); - } - }); + const iid = connectUser(list, socket); + + socket.on('disconnect', function () { + disconnectUser(list, iid); + }); + socket.on('chat message', function (msg) { + userAction(list, iid, socket, msg); + }); }); http.listen(3000, function () { - console.log('listening on *:3000'); + console.log('listening on *:3000'); }); \ No newline at end of file