server.js 3.8 KB

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