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 []
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 []
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, 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