From: Luigi Pinca Date: Thu, 14 Jun 2012 21:16:15 +0000 (+0200) Subject: added leaderboard X-Git-Url: https://git.saalbach.dev/?a=commitdiff_plain;h=fbc454d060cf2642601875dbf04e35191835d7b0;p=binbsis50.git added leaderboard --- diff --git a/app.js b/app.js index bca2c84..c47b4ef 100644 --- a/app.js +++ b/app.js @@ -60,11 +60,12 @@ user.use({db:usersdb}); app.get('/', site.index); app.get('/artworks', site.artworks); -app.get('/signup', site.signup); -app.post('/signup', user.validateSignUp, user.userExists, user.emailExists, user.createAccount); +app.get('/leaderboard', user.leaderboard); app.get('/login', site.login); app.post('/login', user.validateLogin, user.checkUser, user.authenticate); app.get('/logout', user.logout); +app.get('/signup', site.signup); +app.post('/signup', user.validateSignUp, user.userExists, user.emailExists, user.createAccount); app.get('/:room', site.room); app.get('/user/*', user.profile); diff --git a/lib/room.js b/lib/room.js index b096b19..52dea95 100644 --- a/lib/room.js +++ b/lib/room.js @@ -300,13 +300,13 @@ module.exports = function(params) { // Extract a random track from the database and send the load event var sendLoadTrack = function() { songsdb.srandmember(roomname, function(err, res) { - songsdb.hmget(res, 'artistName', 'trackName', 'collectionName', 'previewUrl', + // Check if extracted track is in the list of already played tracks + if (playedtracks.indexOf(res) !== -1) { + return sendLoadTrack(); + } + playedtracks.push(res); + songsdb.hmget('song:'+res, 'artistName', 'trackName', 'collectionName', 'previewUrl', 'artworkUrl60', 'trackViewUrl', function(e, replies) { - // Check if extracted track is in the list of already played tracks - if (playedtracks.indexOf(res) !== -1) { - return sendLoadTrack(); - } - playedtracks.push(res); artistName = replies[0]; artistlcase = artistName.toLowerCase(); trackName = replies[1]; diff --git a/lib/stats.js b/lib/stats.js index c526893..a402005 100644 --- a/lib/stats.js +++ b/lib/stats.js @@ -9,6 +9,8 @@ module.exports = function(db) { if (stats.points) { // Update total points db.hincrby(key, 'totpoints', stats.points); + // Update the score of the member in the sorted set + db.zincrby('users', stats.points, username); } if (stats.userscore) { // Set personal best diff --git a/package.json b/package.json index 1893bc8..2f33062 100644 --- a/package.json +++ b/package.json @@ -17,5 +17,5 @@ "engines": { "node": "0.6.x" }, - "version": "0.3.1-2" + "version": "0.3.1-3" } \ No newline at end of file diff --git a/public/static/css/style.css b/public/static/css/style.css index 935c986..e7a876f 100644 --- a/public/static/css/style.css +++ b/public/static/css/style.css @@ -24,7 +24,7 @@ section { height: 34px; padding-left: 68px; line-height: 40px; - background: url('/static/images/logo.png') no-repeat 0px -54px; + background: url('/static/images/sprites.png') no-repeat 0px -182px; font-size: 25px; } .page-header .logo { @@ -32,13 +32,13 @@ section { height: 54px; padding-left: 109px; line-height: 68px; - background: url('/static/images/logo.png') no-repeat 0 0; + background: url('/static/images/sprites.png') no-repeat 0px -128px; font-size: 34px; color: #0088CC; } .navbar .navbar-text { line-height:19px; - padding: 10px 10px 11px; + padding: 9px 10px 11px; } .form-horizontal .control-group { margin-bottom: 10px; @@ -105,32 +105,62 @@ input { width: 70px; height: 70px; } +.highscores, .profile { + font-weight: bold; +} .profile { font-size: 24px; - font-weight: bold; line-height: 32px; } +.highscores { + font-size: 20px; + line-height: 45px; +} .profile .img { width: 32px; height: 32px; - float: left; margin-right: 5px; background: url('/static/images/sprites.png') no-repeat 0px -56px; } -.stats { +.highscores .img { + width: 80px; + height: 45px; + margin-right:5px; + background: url('/static/images/sprites.png') no-repeat 0px -216px; +} +.leaderboard-wrapper, .stats { border: 1px solid #ccc; border-left: 0; margin-top:8px; } -.stats td { +.leaderboard-wrapper { + height: 349px; + overflow: auto; + margin-bottom:18px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.leaderboard { + margin:0; + border:0; +} +.leaderboard td, .stats td { border-left: 1px solid #ccc; border-top: 1px solid #ccc; vertical-align: middle; } -.stats tbody tr:nth-child(odd) td { +.leaderboard td [class^="icon-"] { + vertical-align: top; + margin-top: 2px; +} +.leaderboard tr:first-child td { + border-top: 0; +} +.leaderboard tbody tr:nth-child(odd) td, .stats tbody tr:nth-child(odd) td { background-color: #ddd; } -.stats tbody tr:hover td { +.leaderboard tbody tr:hover td, .stats tbody tr:hover td { background-color: #dadada; } .room { @@ -555,7 +585,7 @@ input { background: -ms-linear-gradient(center top , #FBFBFB, #F5F5F5); background: linear-gradient(center top , #FBFBFB, #F5F5F5); } -.registered, #users .name, #users .points, .round-rank, .round-points, #users .guess-time, #tracks img.artwork, #tracks .info, #copy, #facebook-button, #twitter-button, #github-button { +.registered, #users .name, #users .points, .round-rank, .round-points, #users .guess-time, #tracks img.artwork, #tracks .info, .highscores .img, .profile .img, #copy, #facebook-button, #twitter-button, #github-button { float:left; } #tracks img.artwork { diff --git a/public/static/images/logo.png b/public/static/images/logo.png deleted file mode 100644 index 2159e70..0000000 Binary files a/public/static/images/logo.png and /dev/null differ diff --git a/public/static/images/sprites.png b/public/static/images/sprites.png index 45b1465..bd671bb 100644 Binary files a/public/static/images/sprites.png and b/public/static/images/sprites.png differ diff --git a/routes/site.js b/routes/site.js index 0dce102..b806d21 100644 --- a/routes/site.js +++ b/routes/site.js @@ -14,7 +14,7 @@ var async = require('async') var task = function(genre) { return function(callback) { db.srandmember(genre, function(err, res) { - db.hget(res, "artworkUrl100", callback); + db.hget('song:'+res, 'artworkUrl100', callback); }); }; }; @@ -32,17 +32,7 @@ exports.index = function(req, res) { if (req.session.user) { res.local('loggedin', req.session.user); } - res.render("index", {rooms:rooms}); -}; - -exports.signup = function(req, res) { - var captcha = new Captcha(); - req.session.captchacode = captcha.getCode(); - res.render("signup", {captchaurl:captcha.toDataURL()}); -}; - -exports.login = function(req, res) { - res.render("login"); + res.render('index', {rooms:rooms}); }; /** @@ -65,12 +55,23 @@ exports.artworks = function(req, res) { }); }; +exports.login = function(req, res) { + res.render('login'); +}; + +exports.signup = function(req, res) { + var captcha = new Captcha(); + req.session.captchacode = captcha.getCode(); + res.render('signup', {captchaurl:captcha.toDataURL()}); +}; + + exports.room = function(req, res) { if (rooms.indexOf(req.params.room) !== -1) { if (req.session.user) { res.local('loggedin', req.session.user); } - res.render("room", {roomname:req.params.room,rooms:rooms}); + res.render('room', {roomname:req.params.room,rooms:rooms}); } else { res.send(404); diff --git a/routes/user.js b/routes/user.js index b7237bb..e1ca586 100644 --- a/routes/user.js +++ b/routes/user.js @@ -18,6 +18,46 @@ String.prototype.isEmail = function() { return this.match(/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/); }; +/** + * Parameters to get users ordered by best guess time. + */ + +var sortparams = [ + 'users' + , 'by' + , 'user:*->bestguesstime' + , 'get' + , '#' + , 'get' + , 'user:*->bestguesstime' + , 'limit' + , '0' + , '30' +]; + +/** + * Leaderboard helper function. + * Rearrange database results in an object. + */ + +var buildLeaderboard = function(pointsresults, timesresults) { + var obj = { + pointsleaderboard: [], + timesleaderboard: [] + } + for (var i=0; i