{
"name": "binb",
"dependencies": {
- "async": "latest",
- "canvas": "latest",
- "connect": "latest",
- "connect-redis": "latest",
- "express": "latest",
- "express-form": "latest",
- "jade": "latest",
- "redis-url": "latest",
- "socket.io": "latest"
+ "async": "0.1.x",
+ "canvas": "0.11.x",
+ "connect": "1.8.x",
+ "connect-redis": "1.3.x",
+ "express": "2.5.x",
+ "express-form": "0.6.x",
+ "jade": "0.24.x",
+ "redis-url": "0.1.x",
+ "socket.io": "0.9.x"
},
"subdomain": "binb",
"scripts": {
"engines": {
"node": "0.6.x"
},
- "version": "0.3.0-1"
+ "version": "0.3.0-3"
}
\ No newline at end of file
#users li, #tracks li, #chat li {
color: #404040;
}
+#users li {
+ height: 18px;
+ position: relative;
+}
#users .private {
display: none;
font-size: 9.75px;
position: absolute;
left: -19px;
}
-#users .private, #users .name, .gameover .name {
- margin-right: 4px;
-}
-.registered, #users .round-rank {
- display: inline-block;
- vertical-align: middle;
-}
.registered, .round-rank {
height: 16px;
width: 16px;
- margin-right:2px;
+ margin: 1px 2px 0px 0px;
}
.registered {
background: url('/static/images/sprites.png') no-repeat 0px -16px;
.registered:hover {
background: url('/static/images/sprites.png') no-repeat -16px -16px;
}
+#users .name {
+ margin-right: 4px;
+}
#users .name, .registered {
cursor: pointer;
}
}
#users .guess-time {
font-size: 11px;
- line-height: 1px;
+ line-height: 18px;
}
#toggle-chat {
position: absolute;
background: -ms-linear-gradient(center top , #FBFBFB, #F5F5F5);
background: linear-gradient(center top , #FBFBFB, #F5F5F5);
}
-#tracks img.artwork, #tracks .info, #tracks .round-rank, #tracks .round-points, #copy, #facebook-button, #twitter-button, #github-button {
+.registered, #users .name, #users .points, .round-rank, .round-points, #users .guess-time, #tracks img.artwork, #tracks .info, #copy, #facebook-button, #twitter-button, #github-button {
float:left;
}
#tracks img.artwork {
'Try again'];
var DOM = {};
+ String.prototype.encodeEntities = function() {
+ return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
+ };
+
// Exact match version of jQuery :contains selector
$.expr[":"].econtains = function(obj, index, meta, stack) {
- return (obj.textContent || obj.innerText ||
- $(obj).text() || "").toLowerCase() === meta[3].toLowerCase();
+ return $(obj).html() === meta[0].replace(/^[\s\S]+:econtains\(([\s\S]+)\)$/, "$1");
};
// Prompt for name and send it.
var found = false;
for (var i=0; i<users.length; i++) {
var user = users[i];
- var li = $('<li class="relative"></li>');
+ var li = $('<li></li>');
var pvt = $('<span class="private label label-info">P</span>');
var username = $('<span class="name"></span>').text(user.nickname);
var points = $('<span class="points">('+user.points+')</span>');
var guesstime = $('<span class="guess-time"></span>');
li.append(pvt, username, points, roundrank, roundpointsel, guesstime);
if (user.registered) {
- var href = 'href="/user/'+username.text().replace(/"/g, """)+'"';
+ var href = 'href="/user/'+encodeURI(username.html())+'"';
pvt.after('<a class="registered" target="_blank" '+href+'></a>');
}
DOM.users.append(li);
var width = DOM.recipient.outerWidth(true) + 1;
DOM.recipient.hide();
DOM.messagebox.animate({'width':'-='+width+'px'}, "fast", function() {DOM.recipient.show();});
- var el = $("span.name:econtains("+usrname+")");
+ var el = $("span.name:econtains("+usrname.encodeEntities()+")");
el.prevAll(".private").show();
el.unbind('click');
el.click(clearPrivate);
DOM.recipient.css('margin-right','0');
DOM.recipient.text("");
DOM.messagebox.animate({'width':'+='+width+'px'}, "fast");
- var el = $("span.name:econtains("+pvtmsgto+")");
+ var el = $("span.name:econtains("+pvtmsgto.encodeEntities()+")");
el.prevAll(".private").hide();
el.unbind("click");
el.click(function() {
html += '</thead><tbody>';
for(var i=0;i<3;i++) {
if (data.users[i]) {
- var playername = data.users[i].nickname.replace(/</g, "<")
- .replace(/>/g, ">").replace(/"/g, """);
+ var playername = data.users[i].nickname.encodeEntities();
html += '<tr><td><div class="medals rank'+(i+1)+'"></div></td>';
html += '<td class="name">'+playername+'</td>';
html += '<td>'+data.users[i].points+'</td>';
}
},
swfPath: "/static/swf/",
- solution: "flash, html",
+ //solution: "flash, html",
supplied: "m4a",
preload: "auto",
volume: 1
// Routes
http.get("/", function(req, res) {
if (req.session.user) {
- res.local('loggedin', req.session.user);
+ res.local('loggedin', req.session.user.replace(/&/g, "&"));
}
res.render("index", {rooms:config.rooms});
});
http.get("/:room", function(req, res) {
if (config.rooms.indexOf(req.params.room) !== -1) {
if (req.session.user) {
- res.local('loggedin', req.session.user);
+ res.local('loggedin', req.session.user.replace(/&/g, "&"));
}
res.render("room", {roomname:req.params.room,rooms:config.rooms});
}
usersdb.exists(key, function(err, data) {
if (data === 1) {
usersdb.hgetall(key, function(e, obj) {
+ obj.username = obj.username.replace(/&/g, "&");
obj.bestguesstime = (obj.bestguesstime/1000).toFixed(1);
obj.worstguesstime = (obj.worstguesstime/1000).toFixed(1);
if (obj.guessed !== "0") {