topical media & game development
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.