def init(self, clientPrb=None, ctx=None):
     result = super(TrainingIntroEntity, self).init(clientPrb=clientPrb, ctx=ctx)
     g_eventDispatcher.loadTrainingList()
     result = FUNCTIONAL_FLAG.addIfNot(result, FUNCTIONAL_FLAG.LOAD_PAGE)
     self.__watcher = TrainingVehiclesWatcher()
     self.__watcher.start()
     return result
    def init(self, clientPrb=None, ctx=None):
        result = super(TrainingEntity, self).init(clientPrb=clientPrb, ctx=ctx)
        add = g_eventBus.addListener
        for event in self.__loadEvents:
            add(event, self.__handleViewLoad, scope=EVENT_BUS_SCOPE.LOBBY)

        self.__enterTrainingRoom(isInitial=ctx.getInitCtx() is None)
        g_eventDispatcher.addTrainingToCarousel(False)
        result = FUNCTIONAL_FLAG.addIfNot(result, FUNCTIONAL_FLAG.LOAD_WINDOW)
        result = FUNCTIONAL_FLAG.addIfNot(result, FUNCTIONAL_FLAG.LOAD_PAGE)
        self.__watcher = TrainingVehiclesWatcher()
        self.__watcher.start()
        return result
Exemple #3
0
class TrainingIntroEntity(LegacyIntroEntity):
    def __init__(self):
        super(TrainingIntroEntity, self).__init__(FUNCTIONAL_FLAG.TRAINING,
                                                  PREBATTLE_TYPE.TRAINING,
                                                  TrainingListRequester())
        self.__watcher = None
        return

    def init(self, clientPrb=None, ctx=None):
        result = super(TrainingIntroEntity, self).init(clientPrb=clientPrb,
                                                       ctx=ctx)
        g_eventDispatcher.loadTrainingList()
        result = FUNCTIONAL_FLAG.addIfNot(result, FUNCTIONAL_FLAG.LOAD_PAGE)
        self.__watcher = TrainingVehiclesWatcher()
        self.__watcher.start()
        return result

    def fini(self, clientPrb=None, ctx=None, woEvents=False):
        result = super(TrainingIntroEntity, self).fini(clientPrb=clientPrb,
                                                       ctx=ctx,
                                                       woEvents=woEvents)
        if not woEvents:
            aliasToLoad = [
                PREBATTLE_ALIASES.TRAINING_LIST_VIEW_PY,
                PREBATTLE_ALIASES.TRAINING_ROOM_VIEW_PY
            ]
            if not self.canSwitch(ctx) and g_eventDispatcher.needToLoadHangar(
                    ctx, self.getModeFlags(), aliasToLoad):
                g_eventDispatcher.loadHangar()
            g_eventDispatcher.removeTrainingFromCarousel()
        else:
            g_eventDispatcher.removeTrainingFromCarousel(closeWindow=False)
        if self.__watcher is not None:
            self.__watcher.stop()
            self.__watcher = None
        return result

    def doAction(self, action=None):
        g_eventDispatcher.loadTrainingList()
        return True

    def doSelectAction(self, action):
        if action.actionName == PREBATTLE_ACTION_NAME.TRAININGS_LIST:
            g_eventDispatcher.loadTrainingList()
            return SelectResult(True)
        return super(TrainingIntroEntity, self).doSelectAction(action)

    def _createActionsValidator(self):
        return TrainingIntroActionsValidator(self)
class TrainingEntity(LegacyEntity):
    __loadEvents = (VIEW_ALIAS.LOBBY_HANGAR,
     VIEW_ALIAS.LOBBY_STORE,
     VIEW_ALIAS.LOBBY_STORAGE,
     VIEW_ALIAS.LOBBY_TECHTREE,
     VIEW_ALIAS.LOBBY_BARRACKS,
     VIEW_ALIAS.LOBBY_PROFILE,
     VIEW_ALIAS.VEHICLE_COMPARE,
     VIEW_ALIAS.LOBBY_PERSONAL_MISSIONS,
     VIEW_ALIAS.LOBBY_MISSIONS,
     VIEW_ALIAS.LOBBY_STRONGHOLD,
     ViewEventType.LOAD_UB_VIEW)

    def __init__(self, settings):
        requests = {REQUEST_TYPE.ASSIGN: self.assign,
         REQUEST_TYPE.SET_TEAM_STATE: self.setTeamState,
         REQUEST_TYPE.SET_PLAYER_STATE: self.setPlayerState,
         REQUEST_TYPE.CHANGE_SETTINGS: self.changeSettings,
         REQUEST_TYPE.SWAP_TEAMS: self.swapTeams,
         REQUEST_TYPE.CHANGE_ARENA_VOIP: self.changeArenaVoip,
         REQUEST_TYPE.CHANGE_USER_STATUS: self.changeUserObserverStatus,
         REQUEST_TYPE.KICK: self.kickPlayer,
         REQUEST_TYPE.SEND_INVITE: self.sendInvites}
        super(TrainingEntity, self).__init__(FUNCTIONAL_FLAG.TRAINING, settings, permClass=TrainingPermissions, limits=TrainingLimits(self), requestHandlers=requests)
        self.__settingRecords = []
        self.__watcher = None
        return

    @legacy_storage_getter(PREBATTLE_TYPE.TRAINING)
    def storage(self):
        return None

    def init(self, clientPrb=None, ctx=None):
        result = super(TrainingEntity, self).init(clientPrb=clientPrb, ctx=ctx)
        add = g_eventBus.addListener
        for event in self.__loadEvents:
            add(event, self.__handleViewLoad, scope=EVENT_BUS_SCOPE.LOBBY)

        self.__enterTrainingRoom(isInitial=ctx.getInitCtx() is None)
        g_eventDispatcher.addTrainingToCarousel(False)
        result = FUNCTIONAL_FLAG.addIfNot(result, FUNCTIONAL_FLAG.LOAD_WINDOW)
        result = FUNCTIONAL_FLAG.addIfNot(result, FUNCTIONAL_FLAG.LOAD_PAGE)
        self.__watcher = TrainingVehiclesWatcher()
        self.__watcher.start()
        return result

    def fini(self, clientPrb=None, ctx=None, woEvents=False):
        result = super(TrainingEntity, self).fini(clientPrb=clientPrb, ctx=ctx, woEvents=woEvents)
        remove = g_eventBus.removeListener
        for event in self.__loadEvents:
            remove(event, self.__handleViewLoad, scope=EVENT_BUS_SCOPE.LOBBY)

        if not woEvents:
            aliasToLoad = [PREBATTLE_ALIASES.TRAINING_LIST_VIEW_PY, PREBATTLE_ALIASES.TRAINING_ROOM_VIEW_PY]
            if not self.canSwitch(ctx) and g_eventDispatcher.needToLoadHangar(ctx, self.getModeFlags(), aliasToLoad):
                g_eventDispatcher.loadHangar()
            g_eventDispatcher.removeTrainingFromCarousel(False)
            self.storage.suspend()
        else:
            g_eventDispatcher.removeTrainingFromCarousel(False, closeWindow=False)
        if self.__watcher is not None:
            self.__watcher.stop()
            self.__watcher = None
        return result

    def resetPlayerState(self):
        super(TrainingEntity, self).resetPlayerState()
        g_eventDispatcher.loadHangar()

    def getRosters(self, keys=None):
        rosters = prb_getters.getPrebattleRosters()
        if keys is None:
            result = {PREBATTLE_ROSTER.ASSIGNED_IN_TEAM1: [],
             PREBATTLE_ROSTER.ASSIGNED_IN_TEAM2: [],
             PREBATTLE_ROSTER.UNASSIGNED: []}
        else:
            result = {}
            for key in keys:
                if PREBATTLE_ROSTER.UNASSIGNED & key != 0:
                    result[PREBATTLE_ROSTER.UNASSIGNED] = []
                result[key] = []

        hasTeam1 = PREBATTLE_ROSTER.ASSIGNED_IN_TEAM1 in result
        hasTeam2 = PREBATTLE_ROSTER.ASSIGNED_IN_TEAM2 in result
        hasUnassigned = PREBATTLE_ROSTER.UNASSIGNED in result
        for key, roster in rosters.iteritems():
            accounts = [ prb_items.PlayerPrbInfo(accInfo[0], entity=self, roster=key, **accInfo[1]) for accInfo in roster.iteritems() ]
            team, assigned = decodeRoster(key)
            if assigned:
                if hasTeam1 and team == 1:
                    result[PREBATTLE_ROSTER.ASSIGNED_IN_TEAM1] = accounts
                elif hasTeam2 and team == 2:
                    result[PREBATTLE_ROSTER.ASSIGNED_IN_TEAM2] = accounts
            if hasUnassigned:
                result[PREBATTLE_ROSTER.UNASSIGNED].extend(accounts)

        return result

    def getTeamLimits(self):
        return prb_getters.getPrebattleSettings().getTeamLimits(self.getPlayerTeam())

    def doAction(self, action=None):
        self.__enterTrainingRoom()
        return True

    def doSelectAction(self, action):
        if action.actionName == PREBATTLE_ACTION_NAME.TRAININGS_LIST:
            self.__enterTrainingRoom()
            return SelectResult(True)
        return super(TrainingEntity, self).doSelectAction(action)

    def hasGUIPage(self):
        return True

    def showGUI(self, ctx=None):
        self.__enterTrainingRoom()

    def prb_onPlayerStateChanged(self, pID, roster):
        if pID == account_helpers.getPlayerID():
            playerInfo = self.getPlayerInfo(pID=pID)
            if playerInfo.isVehicleSpecified():
                self.storage.isObserver = playerInfo.getVehicle().isObserver
        super(TrainingEntity, self).prb_onPlayerStateChanged(pID, roster)

    def changeSettings(self, ctx, callback=None):
        if ctx.getRequestType() != REQUEST_TYPE.CHANGE_SETTINGS:
            LOG_ERROR('Invalid context for request changeSettings', ctx)
            if callback is not None:
                callback(False)
            return
        elif self._cooldown.validate(REQUEST_TYPE.CHANGE_SETTINGS):
            if callback is not None:
                callback(False)
            return
        else:
            player = BigWorld.player()
            pPermissions = self.getPermissions()
            self.__settingRecords = []
            rejected = False
            isOpenedChanged = ctx.isOpenedChanged(self._settings)
            isCommentChanged = ctx.isCommentChanged(self._settings)
            isArenaTypeIDChanged = ctx.isArenaTypeIDChanged(self._settings)
            isRoundLenChanged = ctx.isRoundLenChanged(self._settings)
            if isOpenedChanged:
                if pPermissions.canMakeOpenedClosed():
                    self.__settingRecords.append('isOpened')
                else:
                    LOG_ERROR('Player can not make training opened/closed', pPermissions)
                    rejected = True
            if isCommentChanged:
                if pPermissions.canChangeComment():
                    self.__settingRecords.append('comment')
                else:
                    LOG_ERROR('Player can not change comment', pPermissions)
                    rejected = True
            if isArenaTypeIDChanged:
                if pPermissions.canChangeArena():
                    self.__settingRecords.append('arenaTypeID')
                else:
                    LOG_ERROR('Player can not change comment', pPermissions)
                    rejected = True
            if isRoundLenChanged:
                if pPermissions.canChangeArena():
                    self.__settingRecords.append('roundLength')
                else:
                    LOG_ERROR('Player can not change comment', pPermissions)
                    rejected = True
            if rejected:
                self.__settingRecords = []
                if callback is not None:
                    callback(False)
                return
            elif not self.__settingRecords:
                if callback is not None:
                    callback(False)
                return
            ctx.startProcessing(callback=callback)
            if isOpenedChanged:
                player.prb_changeOpenStatus(ctx.isOpened(), partial(self.__onSettingChanged, record='isOpened', callback=ctx.stopProcessing))
            if isCommentChanged:
                player.prb_changeComment(ctx.getComment(), partial(self.__onSettingChanged, record='comment', callback=ctx.stopProcessing))
            if isArenaTypeIDChanged:
                player.prb_changeArena(ctx.getArenaTypeID(), partial(self.__onSettingChanged, record='arenaTypeID', callback=ctx.stopProcessing))
            if isRoundLenChanged:
                player.prb_changeRoundLength(ctx.getRoundLen(), partial(self.__onSettingChanged, record='roundLength', callback=ctx.stopProcessing))
            if not self.__settingRecords:
                if callback is not None:
                    callback(False)
            else:
                self._cooldown.process(REQUEST_TYPE.CHANGE_SETTINGS)
            return

    def changeUserObserverStatus(self, ctx, callback=None):
        if ctx.isObserver():
            self._setPlayerReady(ctx, callback=callback)
        else:
            self._setPlayerReady(SetPlayerStateCtx(ctx.isReadyState(), ctx.isInitial(), waitingID='prebattle/player_ready'), self.__onPlayerReady)
        self._cooldown.process(REQUEST_TYPE.CHANGE_USER_STATUS)

    def changeArenaVoip(self, ctx, callback=None):
        setting = self._settings[PREBATTLE_SETTING_NAME.ARENA_VOIP_CHANNELS]
        if ctx.getChannels() == setting:
            if callback is not None:
                callback(True)
            return
        elif self._cooldown.validate(REQUEST_TYPE.CHANGE_ARENA_VOIP):
            if callback is not None:
                callback(False)
            return
        else:
            pPermissions = self.getPermissions()
            if pPermissions.canChangeArenaVOIP():
                ctx.startProcessing(callback=callback)
                BigWorld.player().prb_changeArenaVoip(ctx.getChannels(), ctx.onResponseReceived)
                self._cooldown.process(REQUEST_TYPE.CHANGE_ARENA_VOIP)
            else:
                LOG_ERROR('Player can not change arena VOIP', pPermissions)
                if callback is not None:
                    callback(False)
            return

    def _setPlayerReady(self, ctx, callback=None):
        if g_currentVehicle.isObserver():
            if not self._processValidationResult(ctx, ValidationResult(False, PREBATTLE_RESTRICTION.VEHICLE_NOT_SUPPORTED)):
                if callback:
                    callback(False)
                return
        super(TrainingEntity, self)._setPlayerReady(ctx, callback)

    def _createActionsValidator(self):
        return TrainingActionsValidator(self)

    def __enterTrainingRoom(self, isInitial=False):
        if self.storage.isObserver:
            self.changeUserObserverStatus(SetPlayerObserverStateCtx(True, True, isInitial=isInitial, waitingID='prebattle/change_user_status'), self.__onPlayerReady)
        else:
            self.setPlayerState(SetPlayerStateCtx(True, isInitial=isInitial, waitingID='prebattle/player_ready'), self.__onPlayerReady)

    def __onPlayerReady(self, result):
        if result:
            g_eventDispatcher.loadTrainingRoom()
        else:
            g_eventDispatcher.loadHangar()

    def __onSettingChanged(self, code, record='', callback=None):
        if code < 0:
            LOG_ERROR('Server return error for training change', code, record)
            if callback is not None:
                callback(False)
            return
        else:
            if record in self.__settingRecords:
                self.__settingRecords.remove(record)
            if not self.__settingRecords and callback is not None:
                callback(True)
            return

    def __handleViewLoad(self, event):
        self.setPlayerState(SetPlayerStateCtx(False, waitingID='prebattle/player_not_ready'))