def on_open(self, info): url = 'http://localhost:8000/api/player/top' response = yield http_client.fetch(url, method="GET") self.send(response.body.decode('utf-8')) super().on_open(info)
def on_message(self, message): errors = [] game_id = message.get('game_id') raw_data = yield gen.Task( redis_client.hgetall, 'games:id:{}'.format(game_id) ) if not raw_data: errors.append('This game not existed or already finished.') if not errors: data = hgetall_group_by(raw_data) if not errors and 'opponent' not in data: errors.append('Need opponent to join to the game.') if not errors: creator = data['creator'] opponent = data['opponent'] dimension = int(data['dimension']) lineup = int(data['lineup']) color = data['color'] turn = data['turn'] matrix = json.loads(data['matrix']) if not errors and self.username not in [creator, opponent]: errors.append("You are not participant of this game.") if not errors and self.username != turn: errors.append( "It's not your turn. Please, wait for your opponent's move.") if not errors: game = Game(matrix, dimension, lineup) if self.username == creator: action_color = color else: action_color = 'white' if color == 'black' else 'black' color_dict = { 'white': 0, 'black': 1 } action, status = game.action( message['x'], message['y'], color_dict[action_color]) if not action: errors.append('Bad action.') if not errors: turn = opponent if turn == creator else creator yield gen.Task( redis_client.hset, 'games:id:{}'.format(game_id), 'turn', turn) yield gen.Task( redis_client.hset, 'games:id:{}'.format(game_id), 'matrix', json.dumps(game.matrix)) if not errors: for username in [opponent, creator]: player = self.get_player(username) player.send_channel( 'game_action', json.dumps({ 'status': 'ok', 'action': { 'x': message['x'], 'y': message['y'], 'color': action_color } }) ) if turn == username: msg = "Now it's your turn." else: msg = "Now it's a {}'s turn. Waiting...".format( opponent if username == creator else creator) player.send_channel('note', json.dumps({'msg': msg})) else: self.send_error(errors) if status is not None: raw_data = yield gen.Task( redis_client.delete, 'games:id:{}'.format(game_id) ) url = 'http://localhost:8000/api/round/save' post_data = { 'creator': creator, 'opponent': opponent, 'dimension': dimension, 'lineup': lineup, 'lead': creator if color == 'black' else opponent, 'winner': None if status == 'draw' else self.username } headers = { 'Content-Type': 'application/json' } yield http_client.fetch( url, method="POST", headers=headers, body=json.dumps(post_data)) url = 'http://localhost:8000/api/player/top' response = yield http_client.fetch(url, method="GET") self.broadcast_all_channel('stats', response.body.decode('utf-8')) for username in [opponent, creator]: player = self.get_player(username) if status == 'draw': winner = None else: winner = self.username == username player.send_channel( 'game_finish', json.dumps({'winner': winner}) )