var express = require('express'); var fbId = process.env.FACEBOOK_APP_ID || "YOUR FACEBOOK APP IP", fbSecret = process.env.FACEBOOK_SECRET || "YOUR FACEBOOK SECRET", sessionSecret = process.env.SESSION_SECRET || "SOME RANDOM STRING", port = process.env.PORT || 3000; var app = express.createServer( express.logger(), express.static(__dirname + '/public'), express.bodyParser(), express.cookieParser(), express.session({ secret: sessionSecret }), require('faceplate').middleware({ app_id: fbId, secret: fbSecret, scope: 'email' }) ); app.listen(port); function login_page(req,res) { if(req.facebook.token) { req.facebook.me(function(user) { req.session.user_id = user.id; req.session.user_name = user.name; res.redirect('/game'); }); } else { req.facebook.app(function(app) { res.render('login.ejs', { layout: false, req: req, app: app }); }); } } app.get('/',login_page); app.post('/',login_page); function authenticated(method) { return function(req,res) { if (req.session.user_id) { method(req,res); } else { res.redirect('/'); } } } var clickTime = 5000, dbMethods = {}; require("mongodb").connect(process.env.MONGOHQ_URL || "mongodb://localhost/blob_clicker", {}, function(error,db) { db.collection('users', function(err, collection){ dbMethods.fetchUser = function(session,callback) { collection.findOne({ user_id: session.user_id }, function(error,user) { if(!user) { user = { user_id: session.user_id, name: session.user_name, clicks: 0, next_click: new Date().getTime() } } callback(user); }); }; dbMethods.clickUser = function(user, callback) { var now = new Date().getTime(); if(user.next_click <= now) { user.clicks += 1; user.next_click = now + clickTime; collection.save(user, function() { callback(user); }); } else { callback(false); } }; dbMethods.topTen = function(callback) { collection.find().sort({ clicks: -1 }).limit(10).toArray(function(error,results) { var output = []; for(var i in results) { output.push([ results[i].name, results[i].clicks ]); } callback(output); }); }; }); }); app.get('/game',authenticated(function(req,res) { dbMethods.fetchUser(req.session,function(user) { var now = new Date().getTime(), nextClick = (user.next_click - now)/1000; res.render('game.ejs', { layout: false, req: req, user: user, nextClick: nextClick }); }); })); app.post("/click",authenticated(function(req,res) { dbMethods.fetchUser(req.session,function(user) { dbMethods.clickUser(user,function(clicked) { if(clicked) { var now = new Date().getTime(), nextClick = (user.next_click - now)/1000; res.json({ clicked: true, user: clicked, nextClick: nextClick }); } else { res.json({ clicked: false }) } }); }); })); app.get('/top-ten',authenticated(function(req,res) { dbMethods.topTen(function(results) { res.json({ users: results }); }); }));