Files
node/node_modules/derby-examples/chat/lib/chat/index.js
2012-05-30 23:00:06 -04:00

100 lines
3.4 KiB
JavaScript

// Generated by CoffeeScript 1.3.1
var NUM_USER_IMAGES, get, getRoom, ready, view, _ref;
_ref = require('derby').createApp(module), get = _ref.get, view = _ref.view, ready = _ref.ready;
NUM_USER_IMAGES = 10;
get('/:room?', function(page, model, _arg) {
var room, userId, _room;
room = _arg.room;
if (!(room && /^[-\w ]+$/.test(room))) {
return page.redirect('/lobby');
}
_room = room.toLowerCase().replace(/[_ ]/g, '-');
if (_room !== room) {
return page.redirect("/" + _room);
}
if (userId = model.get('_session.userId')) {
return getRoom(page, model, room, userId);
}
return model.async.incr('configs.1.nextUserId', function(err, userId) {
model.set('_session.userId', userId);
model.set("users." + userId, {
name: 'User ' + userId,
picClass: 'pic' + (userId % NUM_USER_IMAGES)
});
return getRoom(page, model, room, userId);
});
});
getRoom = function(page, model, roomName, userId) {
return model.subscribe("rooms." + roomName, 'users', function(err, room, users) {
model.ref('_room', room);
model.setNull('_room.messages', []);
model.set('_newComment', '');
model.ref('_user', "users." + userId);
model.fn('_numMessages', '_room.messages', function(messages) {
return messages.length;
});
return page.render();
});
};
ready(function(model) {
var atBottom, displayTime, i, message, messageList, messages, months, _i, _len, _ref1;
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
displayTime = function(time) {
var hours, minutes, period;
time = new Date(time);
hours = time.getHours();
period = hours < 12 ? ' am, ' : ' pm, ';
hours = (hours % 12) || 12;
minutes = time.getMinutes();
if (minutes < 10) {
minutes = '0' + minutes;
}
return hours + ':' + minutes + period + months[time.getMonth()] + ' ' + time.getDate() + ', ' + time.getFullYear();
};
_ref1 = model.get('_room.messages');
for (i = _i = 0, _len = _ref1.length; _i < _len; i = ++_i) {
message = _ref1[i];
model.set("_room.messages." + i + "._displayTime", displayTime(message.time));
}
model.set('_showReconnect', true);
exports.connect = function() {
model.set('_showReconnect', false);
setTimeout((function() {
return model.set('_showReconnect', true);
}), 1000);
return model.socket.socket.connect();
};
exports.reload = function() {
return window.location.reload();
};
messages = document.getElementById('messages');
messageList = document.getElementById('messageList');
atBottom = true;
model.on('pre:push', '_room.messages', function() {
var bottom, containerHeight, scrollBottom;
bottom = messageList.offsetHeight;
containerHeight = messages.offsetHeight;
scrollBottom = messages.scrollTop + containerHeight;
return atBottom = bottom < containerHeight || scrollBottom === bottom;
});
model.on('push', '_room.messages', function(message, len, isLocal) {
if (isLocal || atBottom) {
messages.scrollTop = messageList.offsetHeight;
}
return model.set("_room.messages." + (len - 1) + "._displayTime", displayTime(message.time));
});
return exports.postMessage = function() {
model.push('_room.messages', {
userId: model.get('_session.userId'),
comment: model.get('_newComment'),
time: +(new Date)
});
return model.set('_newComment', '');
};
});