Ejemplo n.º 1
0
def convertRewardsDictToBonusObjects(dictData, key='rewards'):
    """
    Helper function for converting dictionary with rewards data to bonus objects.
    First, unparse dictionary into XML.
    Then use XML for filling DataSection object.
    And then use DataSection object in standard way to generate bonus objects.
    The reason for this complicated solution can be found here:
    https://confluence.wargaming.net/pages/viewpage.action?pageId=492715230
    """
    try:
        bonuses = _readEventBoardsRewards(dictData[key])
        xmlData = xmltodict.unparse(
            {
                key: dictData[key]
            }, xml_generator_cls=CustomXMLGenerator).encode('utf-8')
        dataSection = DataSection()
        dataSection.createSectionFromString(xmlData)
        bonuses.update(readBonusSection(dictData[key].keys(),
                                        dataSection[key]))
        bonusObjects = []
        for bKey, bValue in bonuses.iteritems():
            bonusObjects.extend(getEventBoardsBonusObj(bKey, bValue))

        bonusObjects.sort(key=lambda b: (BONUS_PRIORITY.index(b.getName(
        )) if b.getName() in BONUS_PRIORITY else len(BONUS_PRIORITY)))
        return bonusObjects
    except:
        LOG_ERROR('WGELEN: Failed to parse rewards data!')
        return []
Ejemplo n.º 2
0
def convertRewardsDictToBonusObjects(dictData, key='rewards'):
    try:
        bonuses = _readEventBoardsRewards(dictData[key])
        xmlData = xmltodict.unparse({key: dictData[key]}, xml_generator_cls=CustomXMLGenerator).encode('utf-8')
        dataSection = DataSection()
        dataSection.createSectionFromString(xmlData)
        bonuses.update(readBonusSection(dictData[key].keys(), dataSection[key]))
        bonusObjects = []
        for bKey, bValue in bonuses.iteritems():
            bonusObjects.extend(getEventBoardsBonusObj(bKey, bValue))

        bonusObjects.sort(key=lambda b: BONUS_PRIORITY.index(b.getName()) if b.getName() in BONUS_PRIORITY else len(BONUS_PRIORITY))
        return bonusObjects
    except Exception:
        LOG_ERROR('WGELEN: Failed to parse rewards data!')
        return []
Ejemplo n.º 3
0
    def __readXML(self, section, gStartTime, gFinishTime, curTime):
        nodes = {}
        for typeName, questSection in section.items():
            enabled = questSection.readBool('enabled', False)
            if not enabled:
                continue
            eventType = EVENT_TYPE.NAME_TO_TYPE[typeName]
            mainNode = XMLNode('main')
            mainNode.info = info = self.__readHeader(eventType, questSection,
                                                     gStartTime, gFinishTime,
                                                     curTime)
            if eventType == EVENT_TYPE.GROUP:
                mainNode.groupContent = tuple(
                    self.__readGroupContent(questSection))
            conditionReaders = self.__getConditionReaders(eventType)
            availableBonuses = self.__getAvailableBonuses(eventType)
            bonusNode = XMLNode('bonus')
            prebattleNode = XMLNode('preBattle')
            prebattleNode.addChild(bonusNode, False)
            mainNode.addChild(prebattleNode)
            accountNode = XMLNode('account')
            prebattleNode.addChild(accountNode)
            vehicleNode = XMLNode('vehicle')
            prebattleNode.addChild(vehicleNode)
            battleNode = XMLNode('battle')
            prebattleNode.addChild(battleNode)
            postbattleNode = XMLNode('postBattle')
            mainNode.addChild(postbattleNode)
            postbattleNode.addChild(bonusNode, False)
            mainNode.addChild(bonusNode)
            conditions = questSection['conditions']
            if conditions and conditions.has_key('preBattle'):
                condition = conditions['preBattle']
                if condition.has_key('account'):
                    self.__readBattleResultsConditionList(
                        conditionReaders, condition['account'], accountNode)
                if eventType in EVENT_TYPE.LIKE_BATTLE_QUESTS:
                    if condition.has_key('vehicle'):
                        self.__readBattleResultsConditionList(
                            conditionReaders, condition['vehicle'],
                            vehicleNode)
                    if condition.has_key('battle'):
                        self.__readBattleResultsConditionList(
                            conditionReaders, condition['battle'], battleNode)
            if eventType in EVENT_TYPE.LIKE_BATTLE_QUESTS and conditions and conditions.has_key(
                    'postBattle'):
                condition = conditions['postBattle']
                self.__readBattleResultsConditionList(conditionReaders,
                                                      condition,
                                                      postbattleNode)
            if conditions and conditions.has_key('bonus'):
                condition = conditions['bonus']
                self.__readBattleResultsConditionList(conditionReaders,
                                                      condition, bonusNode)
            daily = bonusNode.getChildNode('daily')
            info['isDaily'] = daily is not None
            groupBy = bonusNode.getChildNode('groupBy')
            info['groupBy'] = groupBy.getChildNode(
                'groupName').getFirstChildValue() if groupBy else None
            info['isIGR'] = accountNode.isExistChildNode('igrType')
            inrow = bonusNode.getChildNode('inrow')
            unit = bonusNode.getChildNode('unit')
            bonusLimit = bonusNode.getChildNode('bonusLimit')
            cumulative = bonusNode.getChildNode('cumulative')
            vehicleKills = bonusNode.getChildNode('vehicleKills')
            battles = bonusNode.getChildNode('battles')
            battleCount = battles.getChildNode(
                'count').getFirstChildValue() if battles else None
            if bonusLimit is None:
                bonusLimitNode = XMLNode('bonusLimit')
                bonusLimitNode.addChild(1 if eventType in EVENT_TYPE.
                                        ONE_BONUS_QUEST else MAX_BONUS_LIMIT)
                bonusNode.addChild(bonusLimitNode)
            if eventType in EVENT_TYPE.LIKE_BATTLE_QUESTS:
                if (cumulative or unit or vehicleKills) and inrow:
                    raise Exception(
                        'battleQuest: Unexpected tags (vehicleKills, cumulative, unit/cumulative) with inrow'
                    )
                if not (cumulative or unit or vehicleKills or bonusLimit
                        or battles) and (daily or groupBy):
                    raise Exception(
                        'battleQuest: daily and groupBy should be used with cumulative, unit, vehicleKills, bonusLimit or battles tags'
                    )
                if battles and not battleCount:
                    raise Exception('Invalid battles section')
            elif eventType in EVENT_TYPE.LIKE_TOKEN_QUESTS:
                if cumulative or unit or vehicleKills or groupBy or battles:
                    raise Exception(
                        'tokenQuest: Unexpected tags (cumulative, unit, vehicleKills, groupBy, battles)'
                    )
                if not bonusLimit and daily:
                    raise Exception(
                        'tokenQuest: daily should be used with bonusLimit tag')
            mainNode.bonus = walkBonuses(
                readBonusSection(availableBonuses, questSection['bonus'],
                                 eventType), FilterVisitor(eventType))
            questClientData = dict(info)
            questClientData['bonus'] = deepcopy(mainNode.bonus)
            questClientData['conditions'] = mainNode.questClientConditions
            if mainNode.groupContent:
                questClientData['groupContent'] = mainNode.groupContent
            self.__stripServerQuestData(questClientData)
            mainNode.info['questClientData'] = questClientData
            nodes.setdefault(eventType, []).append(mainNode)

        return nodes
Ejemplo n.º 4
0
    def __readXML(self, section, gStartTime, gFinishTime, curTime):
        nodes = {}
        for typeName, questSection in section.items():
            enabled = questSection.readBool('enabled', False)
            if not enabled:
                continue
            eventType = EVENT_TYPE.NAME_TO_TYPE[typeName]
            mainNode = XMLNode('main')
            mainNode.info = info = self.__readHeader(eventType, questSection, gStartTime, gFinishTime, curTime)
            if eventType == EVENT_TYPE.GROUP:
                mainNode.groupContent = tuple(self.__readGroupContent(questSection))
            conditionReaders = self.__getConditionReaders(eventType)
            availableBonuses = self.__getAvailableBonuses(eventType)
            bonusNode = XMLNode('bonus')
            prebattleNode = XMLNode('preBattle')
            prebattleNode.addChild(bonusNode, False)
            mainNode.addChild(prebattleNode)
            accountNode = XMLNode('account')
            prebattleNode.addChild(accountNode)
            vehicleNode = XMLNode('vehicle')
            prebattleNode.addChild(vehicleNode)
            battleNode = XMLNode('battle')
            prebattleNode.addChild(battleNode)
            postbattleNode = XMLNode('postBattle')
            mainNode.addChild(postbattleNode)
            postbattleNode.addChild(bonusNode, False)
            mainNode.addChild(bonusNode)
            conditions = questSection['conditions']
            if conditions and conditions.has_key('preBattle'):
                condition = conditions['preBattle']
                if condition.has_key('account'):
                    self.__readBattleResultsConditionList(conditionReaders, condition['account'], accountNode)
                if eventType in EVENT_TYPE.LIKE_BATTLE_QUESTS:
                    if condition.has_key('vehicle'):
                        self.__readBattleResultsConditionList(conditionReaders, condition['vehicle'], vehicleNode)
                    if condition.has_key('battle'):
                        self.__readBattleResultsConditionList(conditionReaders, condition['battle'], battleNode)
            if eventType in EVENT_TYPE.LIKE_BATTLE_QUESTS and conditions and conditions.has_key('postBattle'):
                condition = conditions['postBattle']
                self.__readBattleResultsConditionList(conditionReaders, condition, postbattleNode)
            if conditions and conditions.has_key('bonus'):
                condition = conditions['bonus']
                self.__readBattleResultsConditionList(conditionReaders, condition, bonusNode)
            daily = bonusNode.getChildNode('daily')
            info['isDaily'] = daily is not None
            groupBy = bonusNode.getChildNode('groupBy')
            info['groupBy'] = groupBy.getChildNode('groupName').getFirstChildValue() if groupBy else None
            info['isIGR'] = accountNode.isExistChildNode('igrType')
            inrow = bonusNode.getChildNode('inrow')
            unit = bonusNode.getChildNode('unit')
            bonusLimit = bonusNode.getChildNode('bonusLimit')
            cumulative = bonusNode.getChildNode('cumulative')
            vehicleKills = bonusNode.getChildNode('vehicleKills')
            battles = bonusNode.getChildNode('battles')
            battleCount = battles.getChildNode('count').getFirstChildValue() if battles else None
            if bonusLimit is None:
                bonusLimitNode = XMLNode('bonusLimit')
                bonusLimitNode.addChild(1 if eventType in EVENT_TYPE.ONE_BONUS_QUEST else MAX_BONUS_LIMIT)
                bonusNode.addChild(bonusLimitNode)
            if eventType in EVENT_TYPE.LIKE_BATTLE_QUESTS:
                if (cumulative or unit or vehicleKills) and inrow:
                    raise Exception('battleQuest: Unexpected tags (vehicleKills, cumulative, unit/cumulative) with inrow')
                if not (cumulative or unit or vehicleKills or bonusLimit or battles) and (daily or groupBy):
                    raise Exception('battleQuest: daily and groupBy should be used with cumulative, unit, vehicleKills, bonusLimit or battles tags')
                if battles and not battleCount:
                    raise Exception('Invalid battles section')
            elif eventType in EVENT_TYPE.LIKE_TOKEN_QUESTS:
                if cumulative or unit or vehicleKills or groupBy or battles:
                    raise Exception('tokenQuest: Unexpected tags (cumulative, unit, vehicleKills, groupBy, battles)')
                if not bonusLimit and daily:
                    raise Exception('tokenQuest: daily should be used with bonusLimit tag')
            mainNode.bonus = walkBonuses(readBonusSection(availableBonuses, questSection['bonus'], eventType), FilterVisitor(eventType))
            questClientData = dict(info)
            questClientData['bonus'] = deepcopy(mainNode.bonus)
            questClientData['conditions'] = mainNode.questClientConditions
            if mainNode.groupContent:
                questClientData['groupContent'] = mainNode.groupContent
            self.__stripServerQuestData(questClientData)
            mainNode.info['questClientData'] = questClientData
            nodes.setdefault(eventType, []).append(mainNode)

        return nodes
    def __readXML(self,
                  section,
                  curTime,
                  gStartTime=DEFAULT_QUEST_START_TIME,
                  gFinishTime=DEFAULT_QUEST_FINISH_TIME):
        nodes = {}
        for typeName, questSection in section.items():
            enabled = questSection.readBool('enabled', False)
            if not enabled:
                continue
            eventType = EVENT_TYPE.NAME_TO_TYPE[typeName]
            mainNode = XMLNode('main')
            mainNode.info = info = self.__readHeader(eventType, questSection,
                                                     curTime, gStartTime,
                                                     gFinishTime)
            if not info['announceTime'] <= curTime <= info['finishTime']:
                LOG_WARNING('Skipping outdated quest', info['id'], curTime,
                            info['announceTime'], info['finishTime'])
                continue
            if eventType == EVENT_TYPE.GROUP:
                mainNode.groupContent = tuple(
                    self.__readGroupContent(questSection))
            conditionReaders = self.__getConditionReaders(eventType)
            availableBonuses = self.__getAvailableBonuses(eventType)
            commonNode = XMLNode('common')
            bonusNode = XMLNode('bonus')
            bonusDelayedNode = XMLNode('bonusDelayed')
            prebattleNode = XMLNode('preBattle')
            battleNode = XMLNode('battle')
            prebattleNode.addChild(battleNode)
            accountNode = XMLNode('account')
            prebattleNode.addChild(accountNode)
            vehicleNode = XMLNode('vehicle')
            prebattleNode.addChild(vehicleNode)
            postbattleNode = XMLNode('postBattle')
            mainNode.addChild(prebattleNode)
            mainNode.addChild(postbattleNode)
            mainNode.addChild(commonNode)
            mainNode.addChild(bonusNode)
            mainNode.addChild(bonusDelayedNode)
            info['isIGR'] = accountNode.isExistChildNode('igrType')
            conditions = questSection['conditions']
            if conditions and conditions.has_key('preBattle'):
                condition = conditions['preBattle']
                if condition.has_key('account'):
                    self.__readBattleResultsConditionList(
                        conditionReaders, condition['account'], accountNode)
                if eventType in EVENT_TYPE.LIKE_BATTLE_QUESTS:
                    if condition.has_key('vehicle'):
                        self.__readBattleResultsConditionList(
                            conditionReaders, condition['vehicle'],
                            vehicleNode)
                    if condition.has_key('battle'):
                        self.__readBattleResultsConditionList(
                            conditionReaders, condition['battle'], battleNode)
            if eventType in EVENT_TYPE.LIKE_BATTLE_QUESTS and conditions and conditions.has_key(
                    'postBattle'):
                condition = conditions['postBattle']
                self.__readBattleResultsConditionList(conditionReaders,
                                                      condition,
                                                      postbattleNode)
            if conditions and conditions.has_key('common'):
                condition = conditions['common']
                self.__readBattleResultsConditionList(conditionReaders,
                                                      condition, commonNode)
            daily = commonNode.getChildNode('daily')
            info['isDaily'] = daily is not None
            weekly = commonNode.getChildNode('weekly')
            info['isWeekly'] = weekly is not None
            groupBy = commonNode.getChildNode('groupBy')
            info['groupBy'] = groupBy.getChildNode(
                'groupName').getFirstChildValue() if groupBy else None
            inrow = commonNode.getChildNode('inrow')
            unit = commonNode.getChildNode('unit')
            bonusLimit = commonNode.getChildNode('bonusLimit')
            cumulative = commonNode.getChildNode('cumulative')
            cumulativeExt = commonNode.getChildNode('cumulativeExt')
            vehicleKills = commonNode.getChildNode('vehicleKills')
            battles = commonNode.getChildNode('battles')
            battleCount = battles.getChildNode(
                'count').getFirstChildValue() if battles else None
            if bonusLimit is None:
                bonusLimitNode = XMLNode('bonusLimit')
                bonusLimitNode.addChild(1 if eventType in EVENT_TYPE.
                                        ONE_BONUS_QUEST else MAX_BONUS_LIMIT)
                commonNode.addChild(bonusLimitNode)
            if eventType in EVENT_TYPE.LIKE_BATTLE_QUESTS:
                if (cumulative or cumulativeExt or unit
                        or vehicleKills) and inrow:
                    raise SoftException(
                        'battleQuest: Unexpected tags (vehicleKills, cumulative, cumulativeExtunit/cumulative, unit/cumulativeExt) with inrow'
                    )
                if not (cumulative or cumulativeExt or unit or vehicleKills
                        or bonusLimit or battles) and (daily or weekly
                                                       or groupBy):
                    raise SoftException(
                        'battleQuest: daily, weekly and groupBy should be used with cumulative, cumulativeExt, unit, vehicleKills, bonusLimit or battles tags'
                    )
                if battles and not battleCount:
                    raise SoftException('Invalid battles section')
            elif eventType in EVENT_TYPE.LIKE_TOKEN_QUESTS:
                if cumulative or cumulativeExt or unit or vehicleKills or groupBy or battles:
                    raise SoftException(
                        'tokenQuest: Unexpected tags (cumulative, cumulativeExt, unit, vehicleKills, groupBy, battles)'
                    )
                if not bonusLimit and (daily or weekly):
                    raise SoftException(
                        'tokenQuest: daily or weekly should be used with bonusLimit tag'
                    )
            mainNode.bonus = readBonusSection(availableBonuses,
                                              questSection['bonus'], eventType)
            mainNode.bonusDelayed = readBonusSection(
                availableBonuses, questSection['bonusDelayed'], eventType)
            if eventType in (EVENT_TYPE.NT_QUEST, EVENT_TYPE.POTAPOV_QUEST):
                mainNode.scripts = questSection[
                    'scripts'].asString if questSection.has_key(
                        'scripts') else ''
            questClientData = dict(info)
            questClientData['bonus'] = deepcopy(mainNode.bonus)
            if mainNode.bonusDelayed is not None:
                questClientData['bonus'].update(mainNode.bonusDelayed)
            questClientData['bonusDelayed'] = deepcopy(mainNode.bonusDelayed)
            if eventType != EVENT_TYPE.POTAPOV_QUEST:
                questClientData['conditions'] = mainNode.questClientConditions
            if mainNode.groupContent:
                questClientData['groupContent'] = mainNode.groupContent
            self.__stripServerQuestData(questClientData)
            mainNode.info['questClientData'] = questClientData
            nodes.setdefault(eventType, []).append(mainNode)

        return nodes