/** * Module dependencies. */ var express = require('express'), routes = require('./routes'), user = require('./routes/user'), http = require('http'), path = require('path'), io = require('socket.io').listen(app), passport = require('passport'), FacebookStrategy = require('passport-facebook').Strategy, mongoose = require('mongoose'); var app = express(); var server = http.createServer(app); app.configure(function(){ app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.methodOverride()); app.use(express.cookieParser()); app.use(express.bodyParser()); app.use(express.session({ secret: 'keyboard cat' })); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); }); app.configure('development', function(){ app.use(express.errorHandler()); mongoose.connect('mongodb://localhost/waiting'); }); io.configure('production', function(){ io.enable('browser client minification'); // send minified client io.enable('browser client etag'); // apply etag caching logic based on version number io.enable('browser client gzip'); // gzip the file io.set('log level', 1); // reduce logging io.set('transports', [ // enable all transports (optional if you want flashsocket) 'websocket' , 'flashsocket' , 'htmlfile' , 'xhr-polling' , 'jsonp-polling' ]); }); io.configure('development', function(){ io.set('transports', ['websocket']); }); passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); }); passport.use(new FacebookStrategy({ clientID: "287721021330454", clientSecret: "67757ad86113da449165c175b292a75e", callbackURL: "http://localhost:3000/auth/facebook/callback" }, function(accessToken, refreshToken, profile, done) { User.findOne({ facebookId: profile.id }, function (err, user) { if(user) { console.log('User: ' + user.firstname + ' ' + user.lastname + ' found and logged in!'); current_user = user; done(null, user); } else { var newuser = new User(); newuser.facebookId = profile.id; newuser.firstname = profile.name.givenName; newuser.lastname = profile.name.familyName; newuser.save(function(err) { if(err) { throw err; } console.log('New user: ' + newuser.firstname + ' ' + newuser.lastname + ' created and logged in!'); current_user = newuser; return done(null, newuser); }); } }); } )); app.get('/', routes.index); app.get('/auth/facebook', passport.authenticate('facebook')); app.get('/auth/facebook/callback', passport.authenticate('facebook', { successRedirect: '/', failureRedirect: '/' })); server.listen(app.get('port'), function(){ console.log("Express server listening on port " + app.get('port')); }); app.get('/totals', function(req, res){ //var users = User.find({}).sort('count').limit(10); User.find({}).sort('count').limit(10).execFind(function(err,users){ res.render('total', { title: 'How Long Can You Wait?', users: users }); }); }); var db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); db.once('open', function callback () { // yay! }); var userSchema = mongoose.Schema({ image: String, firstname: String, lastname: String, facebookId: Number, count: { type: Number, default: 0 } }); var User = mongoose.model('User', userSchema); var io = require("socket.io").listen(server), userCount = 0, users = {}, timeout; io.sockets.on('connection', function (socket) { userCount++; socket.emit('news', { hello: 'world' }); io.sockets.emit('count', { number: userCount }); socket.on('current', function(data){ var json; try { json = JSON.parse(data); } catch(SyntaxError) { console.log('Invalid JSON: ') console.log(data) return false; } var now = Date.now() users[json.user] = now; socket.user = json.user; socket.connected = now; }); timeout = setInterval(function(){ io.sockets.emit('update', users); }, 1000); socket.on('disconnect', function(data){ // decrement the usercount userCount--; User.findById(socket.user, function(err, user){ if (err) throw err; if (!user) return; var count = user.count; var time = (Date.now() - socket.connected) / 1000; var newCount = count + time; User.update({ id: count.id }, { count: newCount }, function (err, numberAffected, raw) { if (err) return handleError(err); }); }); delete users[data.user]; io.sockets.emit('count', { number: userCount }); }); });