server.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  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/:time/:increment', function(req, res) {
  30. res.render('play', {
  31. 'token': req.params.token,
  32. 'time': req.params.time,
  33. 'increment': req.params.increment
  34. });
  35. });
  36. var server = http.createServer(app).listen(app.get('port'), app.get('ipaddress'), function() {
  37. console.log("Express server listening on port " + app.get('port'));
  38. });
  39. var games = {};
  40. var timer;
  41. /**
  42. * Sockets
  43. */
  44. var io = require('socket.io').listen(server, {log: false});
  45. if (process.env.OPENSHIFT_NODEJS_IP) {
  46. io.configure(function(){
  47. io.set('transports', ['websocket']);
  48. });
  49. }
  50. io.sockets.on('connection', function (socket) {
  51. socket.on('start', function (data) {
  52. var token;
  53. var b = new Buffer(Math.random() + new Date().getTime() + socket.id);
  54. token = b.toString('base64').slice(12, 32);
  55. games[token] = {
  56. 'creator': socket,
  57. 'players': [],
  58. 'interval': null
  59. };
  60. socket.emit('created', {
  61. 'token': token
  62. });
  63. });
  64. socket.on('join', function (data) {
  65. var game, color, time = data.time;
  66. if (!(data.token in games)) {
  67. return;
  68. }
  69. game = games[data.token];
  70. if (game.players.length >= 2) {
  71. socket.emit('full');
  72. return;
  73. } else if (game.players.length === 1) {
  74. if (game.players[0].color === 'black') {
  75. color = 'white';
  76. } else {
  77. color = 'black';
  78. }
  79. } else {
  80. var colors = ['black', 'white'];
  81. color = colors[Math.floor(Math.random() * 2)];
  82. }
  83. //join room
  84. socket.join(data.token);
  85. games[data.token].players.push({
  86. 'id': socket.id,
  87. 'socket': socket,
  88. 'color': color,
  89. 'time': data.time - data.increment,
  90. 'increment': data.increment
  91. });
  92. game.creator.emit('ready', {});
  93. socket.emit('joined', {
  94. 'color': color
  95. });
  96. });
  97. socket.on('timer-white', function (data) {
  98. runTimer('white', data.token, socket);
  99. });
  100. socket.on('timer-black', function (data) {
  101. runTimer('black', data.token, socket);
  102. });
  103. socket.on('timer-clear-interval', function (data) {
  104. if (data.token in games) {
  105. clearInterval(games[data.token].interval);
  106. }
  107. });
  108. socket.on('new-move', function (data) {
  109. var receiver, game;
  110. if (!(data.token in games)) {
  111. return;
  112. }
  113. game = games[data.token];
  114. if (game.players[0].id == socket.id) {
  115. receiver = game.players[1].socket;
  116. } else if (game.players[1].id == socket.id) {
  117. receiver = game.players[0].socket;
  118. } else {
  119. return;
  120. }
  121. receiver.emit('move', {
  122. 'move': data.move,
  123. });
  124. });
  125. socket.on('resign', function (data) {
  126. if (data.token in games) {
  127. clearInterval(games[data.token].interval);
  128. io.sockets.in(data.token).emit('player-resigned', {
  129. 'color': data.color
  130. });
  131. }
  132. });
  133. socket.on('disconnect', function (data) {
  134. var player, opponent, game;
  135. for (var token in games) {
  136. game = games[token];
  137. for (var j in game.players) {
  138. player = game.players[j];
  139. if (player.socket === socket) {
  140. opponent = game.players[Math.abs(j - 1)];
  141. opponent.socket.emit('opponent-disconnected');
  142. clearInterval(games[token].interval);
  143. delete games[token];
  144. }
  145. }
  146. }
  147. });
  148. socket.on('send-message', function (data) {
  149. if (data.token in games) {
  150. var opponent = getOpponent(data.token, socket);
  151. opponent.socket.emit('receive-message', data);
  152. }
  153. });
  154. });
  155. function runTimer(color, token, socket) {
  156. var player, time_left, game = games[token];
  157. if (!game) return;
  158. for (var i in game.players) {
  159. player = game.players[i];
  160. if (player.socket === socket && player.color === color) {
  161. clearInterval(games[token].interval);
  162. games[token].players[i].time += games[token].players[i].increment + 1;
  163. return games[token].interval = setInterval(function() {
  164. games[token].players[i].time -= 1;
  165. time_left = games[token].players[i].time;
  166. if (time_left >= 0) {
  167. io.sockets.in(token).emit('countdown', {
  168. 'time': time_left,
  169. 'color': color
  170. });
  171. } else {
  172. io.sockets.in(token).emit('countdown-gameover', {
  173. 'color': color
  174. });
  175. clearInterval(games[token].interval);
  176. }
  177. }, 1000);
  178. }
  179. }
  180. }
  181. function getOpponent(token, socket) {
  182. var player, game = games[token];
  183. for (var j in game.players) {
  184. player = game.players[j];
  185. if (player.socket === socket) {
  186. var opponent = game.players[Math.abs(j - 1)];
  187. return opponent;
  188. }
  189. }
  190. }