Beispiel #1
0
 def __init__(self):
     self._players_queue = PlayersQueue()
     self._message_resender = MessageResender()
Beispiel #2
0
class HallManager(object):
    '''
    Игровой зал.
    '''

    def __init__(self):
        self._players_queue = PlayersQueue()
        self._message_resender = MessageResender()
        
    def _can_player_enter(self, player):
        '''
        Может ли игрок войти в игровой зал?
        @param player: Player
        @return: bool
        '''
        return not player.is_in_party and not player.is_in_game

    def _on_player_enter_request(self, message):
        '''
        Выполняется при запросе пользователя на вход в зал.
        @param message: EnterPacket
        '''
        player = message.player
        if self._can_player_enter(player):
            logger.debug('handling hall enter request for player %s'%player)
            packet = outcoming.WelcomePacket()
            message = messages.PlayerResponseMessage(player, packet)
            player_dispatcher.dispatch(message)
        else:
            logger.debug('hall enter request rejected for player %s'%player)

    def _add_to_queue(self, player):
        '''
        Добавляет игрока в очередь.
        @param player: Player
        '''
        if self._players_queue.has_player(player):
            logger.debug('player already in queue')
            return
        logger.debug('adding to players queue')
        self._players_queue.add_player(player)
        party = self._players_queue.find_party_for_last_player()
        if party is None:
            logger.debug('no party yet')
        else:
            logger.debug('party %s found, removing party from queue and sending invites'%party)
            self._players_queue.remove_party(party)
            party.invite()

    def _on_player_play_request(self, message):
        '''
        Выполняется при запросе пользователя на игру.
        @param message: PlayPacket
        '''
        player = message.player
        if self._can_player_enter(player):
            logger.debug('handling hall play request')
            self._add_to_queue(message.player)
        else:
            logger.debug('play request rejected for player %s'%player)
        
    def _subscribe(self):
        '''
        Подписывается на всякие сообщения.
        '''
        player_dispatcher.subscribe_for_packet(incoming.EnterPacket, self._on_player_enter_request)
        player_dispatcher.subscribe_for_packet(incoming.PlayPacket, self._on_player_play_request)

    def init(self):
        '''
        Инициализация.
        '''
        logger.info('initializing hall manager')
        self._subscribe()