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 = {};
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(targetUser,msg) {
io.sockets.socket(targetUser).emit('private message', tstamp(), socket.nickname, linkify(msg));
updateLog('private message', socket.nickname, 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;
socket.broadcast.emit('announcement', nick + ' connected');
io.sockets.emit('nicknames', nicknames);
});
socket.on('disconnect', function () {
if (!socket.nickname) return;
delete nicknames[socket.nickname];
socket.broadcast.emit('announcement', socket.nickname + ' disconnected');
socket.broadcast.emit('nicknames', nicknames);
});
});