app.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. var express = require('express')
  2. , path = require('path')
  3. , crypto = require('crypto')
  4. , http = require('http');
  5. var app = express();
  6. app.configure(function() {
  7. app.set('port', process.env.PORT || 3000);
  8. app.set('views', __dirname + '/views');
  9. app.set('view engine', 'jade');
  10. app.use(express.favicon());
  11. app.use(express.logger('dev'));
  12. app.use(express.bodyParser());
  13. app.use(express.methodOverride());
  14. app.use(express.cookieParser('45710b553b5b7293753d03bd3601f70a'));
  15. app.use(express.session());
  16. app.use(app.router);
  17. app.use(express.static(path.join(__dirname, 'public')));
  18. });
  19. app.configure('development', function() {
  20. app.use(express.errorHandler());
  21. });
  22. app.get('/', function(req, res) {
  23. res.render('index');
  24. });
  25. app.get('/about', function(req, res) {
  26. res.render('about');
  27. });
  28. app.get('/play/:token', function(req, res) {
  29. res.render('play', {
  30. 'token': req.params.token
  31. });
  32. });
  33. var server = http.createServer(app).listen(app.get('port'), function() {
  34. console.log("Express server listening on port " + app.get('port'));
  35. });
  36. var games = {};
  37. /**
  38. * Sockets
  39. */
  40. var io = require('socket.io').listen(server, {log: false});
  41. io.sockets.on('connection', function (socket) {
  42. socket.on('start', function (data) {
  43. var token;
  44. var b = new Buffer(Math.random() + new Date().getTime() + socket.id);
  45. token = b.toString('base64').slice(12, 32);
  46. games[token] = {
  47. 'creator': socket,
  48. 'players': []
  49. };
  50. socket.emit('created', {
  51. 'token': token
  52. });
  53. });
  54. socket.on('join', function (data) {
  55. var game, color;
  56. if (!(data.token in games)) {
  57. return;
  58. }
  59. game = games[data.token];
  60. if (game.players.length >= 2) {
  61. socket.emit('full');
  62. return;
  63. } else if (game.players.length == 1) {
  64. if (game.players[0].color == 'black') {
  65. color = 'white';
  66. } else {
  67. color = 'black';
  68. }
  69. } else {
  70. var colors = ['black', 'white'];
  71. color = colors[Math.floor(Math.random() * 2)];
  72. }
  73. games[data.token].players.push({
  74. 'id': socket.id,
  75. 'socket': socket,
  76. 'color': color
  77. });
  78. game.creator.emit('ready', {});
  79. socket.emit('joined', {
  80. 'color': color
  81. });
  82. });
  83. socket.on('new-move', function (data) {
  84. var receiver, game;
  85. if (!(data.token in games)) {
  86. return;
  87. }
  88. game = games[data.token];
  89. if (game.players[0].id == socket.id) {
  90. receiver = game.players[1].socket;
  91. } else if (game.players[1].id == socket.id) {
  92. receiver = game.players[0].socket;
  93. } else {
  94. return;
  95. }
  96. receiver.emit('move', {
  97. 'move': data.move,
  98. });
  99. });
  100. socket.on('disconnect', function () {
  101. for (token in games) {
  102. var game = games[token];
  103. for (j in game.players) {
  104. var player = game.players[j];
  105. if (player.socket == socket) {
  106. var opponent = game.players[Math.abs(j - 1)];
  107. delete games[token];
  108. opponent.socket.emit('opponent-disconnected');
  109. }
  110. }
  111. }
  112. });
  113. });