Exemple #1
0
 def _start_timer(self):
     '''
     Запускает таймер, по истечении которого группа будет распущена.
     '''
     logger.debug('starting party timer for %s seconds'%self.DISMISS_TIME)
     self._timer = Timer(self.DISMISS_TIME, self._dismiss)
     self._timer.start()
Exemple #2
0
class PlayersParty(list):
    '''
    Компания игроков.
    '''
    
    # Время до роспуска после сформирования (в секундах):
    DISMISS_TIME = 5

    def __init__(self, players):
        '''
        @param players: list
        '''
        super(PlayersParty, self).__init__()
        self.extend(players)
        self._ready = []
        self._timer = None
        self._set_players_party_flag(True)
        self._subscribe()
        self._start_timer()

    def __str__(self):
        return '<party of %s>'%len(self)
    
    def _deinit(self):
        '''
        Деинициализирует группу.
        '''
        self._unsubscribe()
        self._stop_timer()
        self._set_players_party_flag(False)
        
    def _set_players_party_flag(self, value):
        '''
        Выставляет игрокам флажки, что они сейчас в группе (либо уже нет).
        @param value: bool
        '''
        for player in self:
            player.is_in_party = value

    def _send_dismiss_message_to_players(self):
        '''
        Рассылает участникам сообщение о роспуске группы.
        '''
        for player in self:
            packet = outcoming.PartyDismissPacket()
            message = messages.PlayerResponseMessage(player, packet)
            player_dispatcher.dispatch(message)
            
    def _send_dismiss_message(self):
        '''
        Рассылает сообщение о роспуске группы.
        '''
        message = messages.PartyDismissedMessage(self)
        player_dispatcher.dispatch(message)
    
    def _dismiss(self):
        '''
        Распускает группу.
        '''
        logger.debug('dismissing party')
        self._send_dismiss_message_to_players()
        self._send_dismiss_message()
        self._deinit()

    def _on_player_accepted(self, message):
        '''
        Выполняется при подтверждении пользователем готовности играть.
        @param message: AcceptInvitePacket
        '''
        player = message.player
        if player not in self._ready:
            self._ready.append(player)
        for player in self:
            packet = outcoming.PartyMemberReadyPacket(self, self._ready)
            message = messages.PlayerResponseMessage(player, packet)
            player_dispatcher.dispatch(message)
        if len(self._ready) == len(self):
            self._deinit()
            message = messages.PartyReadyMessage(self)
            player_dispatcher.dispatch(message)
            
    def _on_player_disconnected(self, message):
        '''
        Выполняется при отключении игрока.
        @param message: PlayerDisconnectedMessage
        '''
        self._dismiss()
    
    def _subscribe(self):
        '''
        Подписывается на нужные сообщения.
        '''
        player_dispatcher.subscribe_for_packet(incoming.AcceptInvitePacket, self._on_player_accepted, self)
        player_dispatcher.subscribe(messages.PlayerDisconnectedMessage, self._on_player_disconnected, self)
        
    def _unsubscribe(self):
        '''
        Отписывается от сообщений.
        '''
        player_dispatcher.unsubscribe_from_all(self)
        
    def _start_timer(self):
        '''
        Запускает таймер, по истечении которого группа будет распущена.
        '''
        logger.debug('starting party timer for %s seconds'%self.DISMISS_TIME)
        self._timer = Timer(self.DISMISS_TIME, self._dismiss)
        self._timer.start()
        
    def _stop_timer(self):
        '''
        Останавливает таймер.
        '''
        if self._timer:
            logger.debug('stopping party timer')
            self._timer.stop()
            self._timer = None
        else:
            logger.debug('party timer already stopped')
    
    def invite(self):
        '''
        Рассылает приглашения игрокам начать игру.
        '''
        for player in self:
            packet = outcoming.PartyInvitePacket(self.DISMISS_TIME)
            message = messages.PlayerResponseMessage(player, packet)
            player_dispatcher.dispatch(message)