|  | @@ -32,9 +32,11 @@ app.get('/about', function(req, res) {
 | 
	
		
			
				|  |  |    res.render('about');
 | 
	
		
			
				|  |  |  });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -app.get('/play/:token', function(req, res) {
 | 
	
		
			
				|  |  | +app.get('/play/:token/:time/:increment', function(req, res) {
 | 
	
		
			
				|  |  |    res.render('play', {
 | 
	
		
			
				|  |  | -    'token': req.params.token
 | 
	
		
			
				|  |  | +    'token': req.params.token,
 | 
	
		
			
				|  |  | +    'time': req.params.time,
 | 
	
		
			
				|  |  | +    'increment': req.params.increment
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |  });
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -43,6 +45,7 @@ var server = http.createServer(app).listen(app.get('port'), app.get('ipaddress')
 | 
	
		
			
				|  |  |  });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  var games = {};
 | 
	
		
			
				|  |  | +var timer;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * Sockets
 | 
	
	
		
			
				|  | @@ -56,15 +59,16 @@ if (process.env.OPENSHIFT_NODEJS_IP) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  io.sockets.on('connection', function (socket) {
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  |    socket.on('start', function (data) {
 | 
	
		
			
				|  |  |      var token;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      var b = new Buffer(Math.random() + new Date().getTime() + socket.id);
 | 
	
		
			
				|  |  |      token = b.toString('base64').slice(12, 32);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      games[token] = {
 | 
	
		
			
				|  |  |        'creator': socket,
 | 
	
		
			
				|  |  | -      'players': []
 | 
	
		
			
				|  |  | +      'players': [],
 | 
	
		
			
				|  |  | +      'interval': null
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      socket.emit('created', {
 | 
	
	
		
			
				|  | @@ -73,7 +77,7 @@ io.sockets.on('connection', function (socket) {
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    socket.on('join', function (data) {
 | 
	
		
			
				|  |  | -    var game, color;
 | 
	
		
			
				|  |  | +    var game, color, time = data.time;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if (!(data.token in games)) {
 | 
	
		
			
				|  |  |        return;
 | 
	
	
		
			
				|  | @@ -84,8 +88,8 @@ io.sockets.on('connection', function (socket) {
 | 
	
		
			
				|  |  |      if (game.players.length >= 2) {
 | 
	
		
			
				|  |  |        socket.emit('full');
 | 
	
		
			
				|  |  |        return;
 | 
	
		
			
				|  |  | -    } else if (game.players.length == 1) {
 | 
	
		
			
				|  |  | -      if (game.players[0].color == 'black') {
 | 
	
		
			
				|  |  | +    } else if (game.players.length === 1) {
 | 
	
		
			
				|  |  | +      if (game.players[0].color === 'black') {
 | 
	
		
			
				|  |  |          color = 'white';
 | 
	
		
			
				|  |  |        } else {
 | 
	
		
			
				|  |  |          color = 'black';
 | 
	
	
		
			
				|  | @@ -99,7 +103,9 @@ io.sockets.on('connection', function (socket) {
 | 
	
		
			
				|  |  |      games[data.token].players.push({
 | 
	
		
			
				|  |  |        'id': socket.id,
 | 
	
		
			
				|  |  |        'socket': socket,
 | 
	
		
			
				|  |  | -      'color': color
 | 
	
		
			
				|  |  | +      'color': color,
 | 
	
		
			
				|  |  | +      'time': data.time - data.increment + 1,
 | 
	
		
			
				|  |  | +      'increment': data.increment
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      game.creator.emit('ready', {});
 | 
	
	
		
			
				|  | @@ -109,6 +115,14 @@ io.sockets.on('connection', function (socket) {
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  socket.on('timer-white', function (data) {
 | 
	
		
			
				|  |  | +    runTimer('white', data.token, socket);
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  socket.on('timer-black', function (data) {
 | 
	
		
			
				|  |  | +    runTimer('black', data.token, socket);
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    socket.on('new-move', function (data) {
 | 
	
		
			
				|  |  |      var receiver, game;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -132,45 +146,95 @@ io.sockets.on('connection', function (socket) {
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    socket.on('resign', function (data) {
 | 
	
		
			
				|  |  | -    cancelGame('opponent-resigned', socket);
 | 
	
		
			
				|  |  | +    cancelGame('opponent-resigned', data.token, socket);
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    socket.on('disconnect', function (data) {
 | 
	
		
			
				|  |  | -    cancelGame('opponent-disconnected', socket);
 | 
	
		
			
				|  |  | +    cancelGame('opponent-disconnected', null, socket);
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    socket.on('send-message', function (data) {
 | 
	
		
			
				|  |  | -    var opponent = getOpponent(socket);
 | 
	
		
			
				|  |  | +    var opponent = getOpponent(data.token, socket);
 | 
	
		
			
				|  |  |      opponent.socket.emit('receive-message', data);
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |  });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -function getOpponent(socket) {
 | 
	
		
			
				|  |  | -  for (var token in games) {
 | 
	
		
			
				|  |  | -    var game = games[token];
 | 
	
		
			
				|  |  | +function runTimer(color, token, socket) {
 | 
	
		
			
				|  |  | +  var player, time_left, game = games[token];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  for (var i in game.players) {
 | 
	
		
			
				|  |  | +    player = game.players[i];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (player.socket === socket && player.color === color) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      clearInterval(games[token].interval);
 | 
	
		
			
				|  |  | +      games[token].players[i].time += games[token].players[i].increment;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      return games[token].interval = setInterval(function() {
 | 
	
		
			
				|  |  | +        games[token].players[i].time -= 1;
 | 
	
		
			
				|  |  | +        time_left = games[token].players[i].time;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (time_left >= 0) {
 | 
	
		
			
				|  |  | +          socket.emit('countdown-' + color, {
 | 
	
		
			
				|  |  | +            'time': time_left
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          var opponent = getOpponent(token, socket);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          socket.emit('countdown-gameover', {
 | 
	
		
			
				|  |  | +            'color': color
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +          opponent.socket.emit('countdown-gameover', {
 | 
	
		
			
				|  |  | +            'color': color
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +          clearInterval(games[token].interval);
 | 
	
		
			
				|  |  | +          delete games[token];
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }, 1000);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    for (var j in game.players) {
 | 
	
		
			
				|  |  | -      var player = game.players[j];
 | 
	
		
			
				|  |  | +function getOpponent(token, socket) {
 | 
	
		
			
				|  |  | +  var player, game = games[token];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      if (player.socket == socket) {
 | 
	
		
			
				|  |  | -        var opponent = game.players[Math.abs(j - 1)];
 | 
	
		
			
				|  |  | -        return opponent;
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | +  for (var j in game.players) {
 | 
	
		
			
				|  |  | +    player = game.players[j];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (player.socket == socket) {
 | 
	
		
			
				|  |  | +      var opponent = game.players[Math.abs(j - 1)];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      return opponent;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -function cancelGame(event, socket) {
 | 
	
		
			
				|  |  | -  for (var token in games) {
 | 
	
		
			
				|  |  | -    var game = games[token];
 | 
	
		
			
				|  |  | +function cancelGame(event, token, socket) {
 | 
	
		
			
				|  |  | +  var player, game, opponent;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  function removeGame(game, opponent) {    
 | 
	
		
			
				|  |  | +    clearInterval(game.interval);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    opponent.socket.emit(event);
 | 
	
		
			
				|  |  | +    delete games[token];
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (token) {
 | 
	
		
			
				|  |  | +    game = games[token];
 | 
	
		
			
				|  |  | +    opponent = getOpponent(token, socket);
 | 
	
		
			
				|  |  | +    removeGame(game, opponent);
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    for (var token in games) {
 | 
	
		
			
				|  |  | +    game = games[token];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    for (var j in game.players) {
 | 
	
		
			
				|  |  | -      var player = game.players[j];
 | 
	
		
			
				|  |  | +      for (var j in game.players) {
 | 
	
		
			
				|  |  | +        player = game.players[j];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      if (player.socket == socket) {
 | 
	
		
			
				|  |  | -        var opponent = game.players[Math.abs(j - 1)];
 | 
	
		
			
				|  |  | -        delete games[token];
 | 
	
		
			
				|  |  | -        opponent.socket.emit(event);
 | 
	
		
			
				|  |  | +        if (player.socket == socket) {
 | 
	
		
			
				|  |  | +          opponent = game.players[Math.abs(j - 1)];
 | 
	
		
			
				|  |  | +          removeGame(game, opponent);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 |