diff options
| author | Jonathan Vingiano <jvingiano@gmail.com> | 2013-01-17 15:34:15 -0500 |
|---|---|---|
| committer | Jonathan Vingiano <jvingiano@gmail.com> | 2013-01-17 15:34:15 -0500 |
| commit | e53a355ae0425c1d5f5a485d2748c692f1131024 (patch) | |
| tree | 5f56678da6e7ad2a52f35a0ce70e8ce89c728fb1 /app.js | |
waiting2init
Diffstat (limited to 'app.js')
| -rw-r--r-- | app.js | 178 |
1 files changed, 178 insertions, 0 deletions
@@ -0,0 +1,178 @@ + +/** + * 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 + }); + + }); + +}); |
