示例#1
0
    def _remove_player_from_game(self, game, player):
        if player not in self.player_states:
            self.logger.error("Trying to remove unknown %s from a game" % player)
            return

        state = self.player_states[player]

        if state.is_in_game() or state.is_after_game():
            if game == state.get_game():
                # TODO: when/if a voluntary leave is implemented, send a signal to the GameState to unsub the player

                self.player_states[player] = PlayerState.get_initial(player)

                self._send_to_player(player, self.player_states[player].as_init_action())
示例#2
0
    def handle_open(self, connection):
        player = self._identify_player(connection)

        self._add_connection_with(player, connection)

        if player not in self.player_states:
            player_state = PlayerState.get_initial(player)

            self.logger.info("New player online, init their state with %s" % player_state.as_init_action())

            self.player_states[player] = player_state
        elif player in self.disconnect_timeouts:
            self._player_reconnected(player)
        else:
            self.logger.debug("Got a new connection with %s" % player)
示例#3
0
    def handle_message(self, connection, msg):
        self.logger.info("Got message %s" % msg)

        msg = json.loads(msg)

        if 'kind' in msg:
            player = self.identity_of[connection]

            # TODO: rearrange in order of descending frequency

            if msg['kind'] == 'request-init':
                self.logger.info("Got request for init form socket %s" % self)

                self._send_to_player(player, self.player_states[player].as_init_action())
            elif msg['kind'] == 'act-looking-for-game(start)':
                if not self.player_states[player].is_initial():
                    self.logger.warn("Player %s is in %s, should be in initial" % (
                    player, self.player_states[player].as_short_str()))
                    return

                self.player_states[player] = PlayerState.get_looking_for_game(player, self.mm_pool)

                # TODO: transition from initial to lfg instead of init into lfg!
                self._send_to_player(player, self.player_states[player].as_init_action())

                self.mm_pool.add_player(player)
            elif msg['kind'] == 'act-looking-for-game(stop)':
                if not self.player_states[player].is_looking_for_game():
                    self.logger.warn("Player %s isn't looking for game" % (player,))
                    return

                self.player_states[player] = PlayerState.get_initial(player)

                self._send_to_player(player, self.player_states[player].as_init_action())

                self.mm_pool.remove_player(player)
            elif msg['kind'] == 'act-finish-game':
                if not self.player_states[player].is_after_game():
                    self.logger.warn("Player %s isn't in a game that has ended" % (player,))
                    return

                self._remove_player_from_game(self.player_states[player].get_game(), player)
            elif msg['kind'] == 'set-nickname':
                self._set_nickname(player, msg['newNickname'])
            elif msg['kind'] == 'set-mm-deck':
                self._set_mm_settings(player, deck=msg['deck'])
            elif msg['kind'] == 'set-mm-min-players':
                self._set_mm_settings(player, min_players=msg['minPlayers'])
            elif msg['kind'] == 'set-no-auto-end':
                self._set_game_settings(player, no_auto_end=msg['newVal'])
            elif msg['kind'][:5] == 'move-':
                if player not in self.player_states:
                    logging.warning("Unknown player %s issued a move" % player)
                    return

                state = self.player_states[player]

                if not state.is_in_game():
                    logging.warning("Player %s issued a move while in %s" % (player, state))
                    return

                game = state.get_game()

                try:
                    game.process_move(player, msg)
                except IllegalMoveException as e:
                    logging.warning("Player %s issued an illegal move: %s" % (self, repr(e),))

                    logging.warning(game.as_dict())