topical media & game development

talk show tell print

mobile-game-ch20-blob-clicker-web.js / js



  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 });
    });
  }));
  
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.