summaryrefslogtreecommitdiff
path: root/app.js
diff options
context:
space:
mode:
authorJonathan Vingiano <jvingiano@gmail.com>2013-01-17 15:34:15 -0500
committerJonathan Vingiano <jvingiano@gmail.com>2013-01-17 15:34:15 -0500
commite53a355ae0425c1d5f5a485d2748c692f1131024 (patch)
tree5f56678da6e7ad2a52f35a0ce70e8ce89c728fb1 /app.js
waiting2init
Diffstat (limited to 'app.js')
-rw-r--r--app.js178
1 files changed, 178 insertions, 0 deletions
diff --git a/app.js b/app.js
new file mode 100644
index 0000000..6391c73
--- /dev/null
+++ b/app.js
@@ -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
+ });
+
+ });
+
+});