Skip to content

Commit

Permalink
Notes into the stream, when a user enters the room
Browse files Browse the repository at this point in the history
Adds a log level for Socket.io to config
  • Loading branch information
ozten committed Jan 18, 2013
1 parent a24c07f commit 1f3575f
Show file tree
Hide file tree
Showing 8 changed files with 98 additions and 51 deletions.
20 changes: 18 additions & 2 deletions client/js/rooms.js
Expand Up @@ -62,6 +62,13 @@ window.connect = function (audience, roomId) {
else
$('#stream ol').append(h);
};

var renderNewUser = function (profile) {
profile.date = (new Date()).toISOString();
var h = _.template($("#new_user_template").html())(profile);
$('#stream ol').prepend(h);
};

socket.on('post message', function (data) {
if (! knownEmails[currentUser]) {
knownEmails[currentUser] = true;
Expand All @@ -70,15 +77,24 @@ window.connect = function (audience, roomId) {
knownEmails[data.email] = true;
$('#members').load('/widgets/members/' + roomId);
}
console.log(data);
renderMessage(data);
//window.scrollTo(0, 1000000);
});
socket.on('new user', function (profile) {
renderNewUser(profile);
});
socket.on('sync update', function (data) {
console.log('SYNC UPDATE', data);
for (var i=0; i < data.events.length; i++) {
renderMessage(data.events[i]);
console.log(i, data.events[i]);
try {
var event = JSON.parse(data.events[i].message);
if (event.name) renderNewUser(event);
} catch (e) {
console.log(e);
// TODO Unify POST are a string, while NEW USER are JSON
renderMessage(data.events[i]);
}
}
});

Expand Down
7 changes: 7 additions & 0 deletions server/etc/config.js-dist
Expand Up @@ -11,3 +11,10 @@ exports.mysqlPort = 3306;
exports.mysqlUser = "user";
exports.mysqlPassword = "password";
exports.mysqlDBName = "dev_roomr";

// Log Level
exports.DEBUG = 3;
exports.INFO = 2;
exports.WARN = 1;
exports.DEBUG = 0;
exports.logLevel = 1;
34 changes: 14 additions & 20 deletions server/lib/db.js
Expand Up @@ -66,12 +66,9 @@ exports.createRoom = function (email, roomName, cb) {
finCb();
return cb (err);
}
exports.addMemberToRoom(email, roomId, function (err) {
if (err) {
return cb(err);
}
return cb(null, roomId);
}, conn, finCb);
finCb();
return cb(null, roomId);


});
});
Expand All @@ -85,10 +82,10 @@ exports.addMemberToRoom = function (email, roomId, cb, conn, finCb) {
if (err) {
console.error('Error adding member to room' + err);
_finCb();
return cb(err);
return cb(err, false);
}
_finCb();
cb(null);
cb(null, res.affectedRows > 0);
});
};
if (! conn) {
Expand Down Expand Up @@ -238,16 +235,15 @@ exports.addEvent = function (roomId, email, type, value, cb) {
return cb(err);
}
var insertCb = function (err, res) {
finCb();
if (err) {
console.error(err);
finCb();
cb(err);
cb(err);
} else {
return cb(null, res.insertId);
finCb();
}
};
conn.query('INSERT INTO events (rooms_id, member_email, etype, evalue) ' +
'VALUES (?, ?, ?, ?)', [roomId, email, type, value], insertCb);
});
Expand All @@ -264,20 +260,18 @@ exports.syncEvents = function (roomId, email, lastId, cb) {
return cb(err);
}
var selectCb = function (err, res) {
finCb();
if (err) {
console.error(err);
finCb();
cb(err);
cb(err);
} else {
var sync = { roomId: roomId, events: []};
for (var i=0; i < res.length; i++) {
// db column type is blob...
res[i].message = new Buffer(res[i].message, 'utf8').toString();
sync.events.push(res[i]);
}

// db column type is blob...
res[i].message = new Buffer(res[i].message, 'utf8').toString();
sync.events.push(res[i]);
}
return cb(null, sync);
finCb();
}
};
conn.query(sel, [roomId, email, roomId, lastId], selectCb);
Expand Down
6 changes: 0 additions & 6 deletions server/routes.js
Expand Up @@ -63,12 +63,6 @@ app.get('/r/:roomUrl', function (req, res) {
} else if (! room.room.name) {
return res.render('unknown_room.html');
} else {
db.addMemberToRoom(req.session.email, roomId, function (err) {
if (err) console.error('Unable to add user to room ' + err);
});
console.log('room =');
console.log(room);

return res.render('room.html', {
audience: config.audience,
room: room.room,
Expand Down
63 changes: 42 additions & 21 deletions server/sockets.js
@@ -1,4 +1,5 @@
var cookieReader = require('./lib/client_sessions_cookie_reader'),
var config = require('./etc/config'),
cookieReader = require('./lib/client_sessions_cookie_reader'),
crypto = require('crypto'),
db = require('./lib/db'),
socket_io = require('socket.io');
Expand All @@ -13,6 +14,7 @@ exports.setup = function (app) {
var io = socket_io.listen(app);

io.configure(function () {
io.set('log level', config.logLevel);
io.set('authorization', function (handshakeData, cb) {
cookieReader(handshakeData.headers.cookie, function (err, session) {
console.log('SESSION=', session);
Expand Down Expand Up @@ -42,9 +44,28 @@ exports.setup = function (app) {
*/

socket.on('subscribe room', function (data) {
console.log('== SIO subscribe room ' + data.roomId);
// checkMemberOfRoom(data.roomId, function (err, isMember) {})
socket.join(data.roomId);
var email = socket.handshake.email;
socket.join(data.roomId);
// checkMemberOfRoom(data.roomId, function (err, isMember) {})
db.addMemberToRoom(email, data.roomId, function (err, newUser) {
if (err) {
console.error(err);
}
if (newUser) {
db.getProfile(email, function (err, profile) {
profile.avatar40 = avatar(email, 40);
db.addEvent(data.roomId, email, 'NEWUSER', JSON.stringify(profile), function (err, eventId) {
if (err) {
console.log('ERROR saving post room event');
console.log(err);
} else {
profile.event_id = eventId;
io.sockets.in(data.roomId).emit('new user', profile);
}
});
});
}
});
});

/**
Expand All @@ -53,38 +74,38 @@ exports.setup = function (app) {
socket.on('sync room', function (data) {
console.log('== SIO sync room ' + data.roomId + ' ' + data.eventId);
// checkMemberOfRoom(data.roomId, function (err, isMember) {})
db.syncEvents(data.roomId, socket.handshake.email, data.eventId, function (err, syncData) {
if (err) {
console.error('Unable to get sync data from db');
console.log(err);
} else {
db.syncEvents(data.roomId, socket.handshake.email, data.eventId, function (err, syncData) {
if (err) {
console.error('Unable to get sync data from db');
console.log(err);
} else {
// socket.emit send only to that user
// io.sockets.in(room).emit sends to all users of a room
// io.sockets.emit sends to all users (???)
socket.emit('sync update', syncData);
}
});
socket.emit('sync update', syncData);
}
});
});
socket.on('post room', function (data) {
//roomId memberEmail, type, value
console.log('== SIO post room', data, socket.handshake.email);
db.addEvent(data.roomId, socket.handshake.email, 'POST', data.message, function (err, eventId) {
if (err) {
console.log('ERROR saving post room event');
console.log(err);
} else {
if (err) {
console.log('ERROR saving post room event');
console.log(err);
} else {
socket.get('email', function (err, email) {
if (! err) {
var post = {
var post = {
id: eventId,
message: data.message,
email: email,
avatar40: avatar(email, 40) };
io.sockets.in(data.roomId).emit('post message', post);
}
io.sockets.in(data.roomId).emit('post message', post);
}
});
}
});
}
});
// checkMemberOfRoom(data.roomId, function (err, isMember) {})
//socket.get('email')}

Expand Down
1 change: 0 additions & 1 deletion server/views/layout.html
Expand Up @@ -28,7 +28,6 @@
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="/js/libs/jquery-1.7.1.min.js"><\/script>')</script>
<script src="/js/libs/underscore-min.1.4.3.js"></script>
<script src="/js/libs/md5.js"></script>
<script src="/js/libs/jquery.timeago.js"></script>
<script src="https://login.persona.org/include.js"></script>
<script>
Expand Down
6 changes: 5 additions & 1 deletion server/views/room.html
Expand Up @@ -54,8 +54,12 @@
{% for member in members %}
knownEmails['{{member.email}}'] = true;
{% endfor %}
var once = true;
$('body').bind('page_loaded_user_ready', function (e) {
connect('{{audience}}', '{{room.id}}');
if (once) {
once = false;
connect('{{audience}}', '{{room.id}}');
}
});

</script>
Expand Down
12 changes: 12 additions & 0 deletions server/views/widget/templates.html
Expand Up @@ -10,4 +10,16 @@
</div>
</li>
</div>
<div id="new_user_template" style="display: none;">
<li class="new_user message">
<div class="avatar">
<img src="${avatar40}" alt=":)"/>
</div>
<div class="content">
<div class="name"><a href="${email}">${name}</a></div>
<div class="text">Entered the room</div>
<div class="date"><time class="timeago" datetime="${date}">${date}</time></div>
</div>
</li>
</div>

0 comments on commit 1f3575f

Please sign in to comment.