summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--app.js178
-rw-r--r--package.json16
-rw-r--r--public/stylesheets/style.css8
-rw-r--r--routes/index.js8
-rw-r--r--routes/login.js8
-rw-r--r--routes/user.js8
-rw-r--r--views/index.ejs37
-rw-r--r--views/total.ejs16
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
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
+ });
+
+ });
+
+});
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>