var http = require('http').createServer(handler) , io = require('socket.io').listen(http).set('log level', 1); http.listen(8080); console.log('Chatserver listening on port 8080'); var nicknames = {}; var log = {}; var userArray={}; function handler(req, res) { res.writeHead(200); res.end(); } function tstamp() { var currentTime = new Date(); var days = new Array('Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sat'); var day = currentTime.getDay(); var hours = currentTime.getHours(); var minutes = currentTime.getMinutes(); if (minutes < 10) { minutes = "0" + minutes; } if (hours > 11) { var ap = 'p'; } else { var ap = 'a'; } if (hours > 12) { hours = hours - 12; } return "["+ days[day] + " " + hours + ":" + minutes + ap + "m] "; } function linkify(inputText) { //URLs starting with http://, https://, or ftp:// var replacePattern1 = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim; var replacedText = inputText.replace(replacePattern1, '$1'); //URLs starting with www. (without // before it, or it'd re-link the ones done above) var replacePattern2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim; var replacedText = replacedText.replace(replacePattern2, '$1$2'); //Change email addresses to mailto:: links var replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim; var replacedText = replacedText.replace(replacePattern3, '$1'); return replacedText } function updateLog(type, nick, msg) { var curTime = new Date(); if (typeof 'type' != 'undefined') { log[curTime.getTime()] = {'type': type, 'nick': nick, 'msg': msg}; } var i; for (i in log) { // Cull the log, removing entries older than a half hour. if (i < (curTime.getTime() - 1800000)) { delete log[i]; } } } io.sockets.on('connection', function (socket) { socket.on('user message', function (msg) { socket.broadcast.emit('user message', tstamp(), socket.nickname, linkify(msg)); updateLog('user message', socket.nickname, msg); }); socket.on('private message', function(data) { updateLog('private message', socket.nickname, data.message); io.sockets.socket(userArray[data.to]).emit("private message", tstamp(), socket.nickname, linkify(data.message)); //io.sockets.emit("private", { from: socket.nickname, to: data.to, msg: data.msg }); }); socket.on('get log', function () { updateLog(); // Ensure old entries are cleared out before sending it. io.sockets.emit('chat log', log); }); socket.on('nickname', function (nick, fn) { var i = 1; var orignick = nick; while (nicknames[nick]) { nick = orignick+i; i++; } fn(nick); nicknames[nick] = socket.nickname = nick; userArray[socket.nickname]=socket.id; socket.broadcast.emit('announcement', nick + ' connected'); socket.broadcast.emit('announcement', userArray[nick] + ' connected'); io.sockets.emit('nicknames', nicknames); }); socket.on('disconnect', function () { if (!socket.nickname) return; delete nicknames[socket.nickname]; delete userArray[socket.nickname]; socket.broadcast.emit('announcement', socket.nickname + ' disconnected'); socket.broadcast.emit('nicknames', nicknames); }); });