server.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. var express = require('express');
  2. var fs = require('fs');
  3. var app = express.createServer();
  4. var io = require('socket.io').listen(app);
  5. var mongoose = require('../db.js').mongoose;
  6. app.configure(function() {
  7. app.use(express.static(__dirname+'/static'));
  8. app.use(express.errorHandler({dumpExceptions: true, showStack: true}));
  9. app.set('dbUri', 'mongodb://localhost/fc');
  10. });
  11. mongoose.connect(app.set('dbUri'));
  12. mongoose.connection.db.serverConfig.connection.autoReconnect = true;
  13. var Post = mongoose.model('Post');
  14. var clients = {};
  15. var posts = {};
  16. app.listen('8080');
  17. io.sockets.on('connection', function(socket) {
  18. socket.on('subscribe', function(lecture) {
  19. var id = socket.id;
  20. clients[id] = {
  21. socket: socket,
  22. lecture: lecture
  23. }
  24. Post.find({'lecture': lecture}, function(err, res) {
  25. posts[lecture] = res ? res : [];
  26. socket.json.send({posts: res});
  27. })
  28. })
  29. socket.on('post', function(res) {
  30. var post = new Post;
  31. var _post = res.post;
  32. var lecture = res.lecture;
  33. post.lecture = lecture;
  34. if ( _post.anonymous ) {
  35. post.userid = 0;
  36. post.userName = 'Anonymous';
  37. post.userAffil = 'N/A';
  38. } else {
  39. post.userName = _post.userName;
  40. post.userAffil = _post.userAffil;
  41. }
  42. post.date = new Date();
  43. post.body = _post.body;
  44. post.votes = 0;
  45. post.save(function(err) {
  46. if (err) {
  47. // XXX some error handling
  48. console.log(err)
  49. } else {
  50. posts[lecture].push(post);
  51. publish({post: post}, lecture);
  52. }
  53. })
  54. });
  55. socket.on('vote', function(res) {
  56. var vote = res.vote;
  57. var lecture = res.lecture;
  58. posts[lecture] = posts[lecture].map(function(post) {
  59. if(post._id == vote.parentid) {
  60. post.votes++;
  61. post.save(function(err) {
  62. if (err) {
  63. // XXX error handling
  64. } else {
  65. publish({vote: vote}, lecture);
  66. }
  67. })
  68. }
  69. return post;
  70. });
  71. })
  72. socket.on('comment', function(res) {
  73. var comment = res.comment;
  74. var lecture = res.lecture;
  75. console.log('anon', comment.anonymous)
  76. if ( comment.anonymous ) {
  77. comment.userid = 0;
  78. comment.userName = 'Anonymous';
  79. comment.userAffil = 'N/A';
  80. }
  81. posts[lecture] = posts[lecture].map(function(post) {
  82. if(post._id == comment.parentid) {
  83. post.comments.push(comment);
  84. post.date = new Date();
  85. post.save(function(err) {
  86. if (err) {
  87. console.log(err)
  88. } else {
  89. publish({comment: comment}, lecture);
  90. }
  91. })
  92. }
  93. return post;
  94. });
  95. })
  96. socket.on('disconnect', function() {
  97. delete clients[socket.id];
  98. })
  99. });
  100. function publish(data, lecture) {
  101. Object.getOwnPropertyNames(clients).forEach(function(id) {
  102. if (clients[id].lecture === lecture) {
  103. clients[id].socket.json.send(data)
  104. }
  105. })
  106. }