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())
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)
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())