Пример #1
0
 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)
Пример #2
0
    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})
                )