diff options
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | app.js | 178 | ||||
| -rw-r--r-- | package.json | 16 | ||||
| -rw-r--r-- | public/stylesheets/style.css | 8 | ||||
| -rw-r--r-- | routes/index.js | 8 | ||||
| -rw-r--r-- | routes/login.js | 8 | ||||
| -rw-r--r-- | routes/user.js | 8 | ||||
| -rw-r--r-- | views/index.ejs | 37 | ||||
| -rw-r--r-- | views/total.ejs | 16 |
9 files changed, 280 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules @@ -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 + }); + + }); + +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..be193d1 --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "application-name", + "version": "0.0.1", + "private": true, + "scripts": { + "start": "node app" + }, + "dependencies": { + "express": "3.0.5", + "ejs": "*", + "socket.io": "0.9.x", + "passport": "0.1.x", + "passport-facebook": "0.1.x", + "mongoose": "3.5.x" + } +} diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css new file mode 100644 index 0000000..30e047d --- /dev/null +++ b/public/stylesheets/style.css @@ -0,0 +1,8 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +a { + color: #00B7FF; +}
\ No newline at end of file diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 0000000..0bf1fed --- /dev/null +++ b/routes/index.js @@ -0,0 +1,8 @@ + +/* + * GET home page. + */ + +exports.index = function(req, res){ + res.render('index', { title: 'How Long Can You Wait?', currentUser: req.user }); +}; diff --git a/routes/login.js b/routes/login.js new file mode 100644 index 0000000..bb7888c --- /dev/null +++ b/routes/login.js @@ -0,0 +1,8 @@ + +/* + * POST authentication path. + */ + +exports.login = function(req, res){ + res.send("respond with a resource"); +}; diff --git a/routes/user.js b/routes/user.js new file mode 100644 index 0000000..d5b34aa --- /dev/null +++ b/routes/user.js @@ -0,0 +1,8 @@ + +/* + * GET users listing. + */ + +exports.list = function(req, res){ + res.send("respond with a resource"); +};
\ No newline at end of file diff --git a/views/index.ejs b/views/index.ejs new file mode 100644 index 0000000..a09c60b --- /dev/null +++ b/views/index.ejs @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> + <head> + <title><%= title %></title> + <link rel='stylesheet' href='/stylesheets/style.css' /> + <script src="/socket.io/socket.io.js"></script> + <script> + var socket = io.connect(); + <% if (currentUser) { %> + socket.emit('current', JSON.stringify({ + "user": "<%= currentUser._id %>" + })); + <% } %> + socket.on('update', function(data){ + console.log(data) + if (Object.keys(data).length === 0) return; + var users = document.getElementById('users') + users.innerHTML = ""; + for(k in data){ + var time = Math.round(data[k]), text; + time == 1 ? text = 'second' : text = 'seconds'; + + var li = document.createElement('li').appendChild(document.createTextNode(k + data[k])); + users.appendChild(li); + } + }); + + </script> + </head> + <body> + <h1><%= title %></h1> + <% if (!currentUser) { %> + <a href="/auth/facebook">Login with Facebook</a> + <% } %> + <ul id="users"></ul> + </body> +</html> diff --git a/views/total.ejs b/views/total.ejs new file mode 100644 index 0000000..af7a03e --- /dev/null +++ b/views/total.ejs @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<html> + <head> + <title><%= title %></title> + <link rel='stylesheet' href='/stylesheets/style.css' /> + <script src="/socket.io/socket.io.js"></script> + </head> + <body> + <h1><%= title %></h1> + <% for(user in users){ %> + <%= users[user].firstname %> + <%= users[user].lastname %> + <%= users[user].count %> + <% } %> + </body> +</html> |
