/** * 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('/hover', routes.hover); 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 ); function updateTime ( user, now, connected ) { var time = ( now - connected ); var newCount = user.count + time; user.count = newCount; user.save(function(err) { if(err) { throw err; } }); } function getHighScores (callback) { return User.find({}).sort('-count').limit(10).exec(callback); } var io = require("socket.io").listen(server), userCount = 0, users = {}, timeout; timeout = setInterval(function(){ io.sockets.emit('update', { 'now': Date.now() }); }, 1000); io.sockets.on('connection', function (socket) { getHighScores(function(err, scoreUsers) { scores = []; for (var i = 0; i < scoreUsers.length; i++) { scores.push({ firstname: scoreUsers[i].firstname, lastname: scoreUsers[i].lastname, count: scoreUsers[i].count, id: scoreUsers[i].id }); } socket.emit('scores', { 'scores': scores, 'users': users, 'now': Date.now() }) }); userCount++; socket.on('joined', function(data){ var now = Date.now(); try { data = JSON.parse(data); } catch (e) { return; } User.findById(data.id, function(err, user){ if (err || ! user) return; socket.user = user; socket.user_id = user.id; socket.connected = now; users[user.id] = { id: user.id, firstname: user.firstname, lastname: user.lastname, image: user.image, count: user.count, connected: now, current: 0, active: true, x: 0, y: -9999 }; io.sockets.emit('count', { users: users, now: now }); }) }); socket.on('mouse', function(data){ if (! socket.user || ! data || ! data.x || ! data.y || !( socket.user.id in users )) return; users[socket.user.id].x = data.x; users[socket.user.id].y = data.y; io.sockets.volatile.emit('mouse', data); }); socket.on('blur', function(data){ if (! socket.user) return; var now = Date.now(); if (socket.user.id in users) { users[socket.user.id].active = false; users[socket.user.id].current += now - socket.connected; } updateTime(socket.user, now, socket.connected); socket.connected = now; io.sockets.emit('blur', data); }); socket.on('focus', function(data){ if (!socket.user) return; var now = Date.now(); socket.connected = now; if (socket.user.id in users) { users[socket.user.id].active = true; } io.sockets.emit('focus', data); }); socket.on('disconnect', function(data){ userCount--; if (!socket.user) return; var now = Date.now(); updateTime(socket.user, now, socket.connected); delete users[socket.user.id]; io.sockets.emit('count', { users: users, now: now }); }); });