def openVehiclePackPreview(self, cmd): items = _parseItemsPack(cmd.items) price, oldPrice = _parseBuyPrice(cmd.buy_price) vehiclesID = [] for item in items: if item.type in ItemPackTypeGroup.VEHICLE: vehiclesID.append(item.id) if vehiclesID and self.__validVehiclePreviewPack(vehiclesID): localEndTime = None if cmd.end_date: timestamp = getTimestampFromISO(cmd.end_date) datetimeInUTC = getDateTimeInUTC(timestamp) localDatetime = utcToLocalDatetime(datetimeInUTC) localEndTime = (localDatetime - getDateTimeInLocal(0)).total_seconds() event_dispatcher.showVehiclePreview( vehTypeCompDescr=vehiclesID[0], itemsPack=items, price=price, oldPrice=oldPrice, title=cmd.title, endTime=localEndTime, previewAlias=self._getVehiclePreviewReturnAlias(cmd), previewBackCb=self._getVehiclePreviewReturnCallback(cmd), buyParams=cmd.buy_params) else: _pushInvalidPreviewMessage() return
def _populatePreviewBlock(self): fort = self.fortCtrl.getFort() localDateTime = time_utils.getDateTimeInLocal(self.__selectedDate) targetDayStartTimestamp, _ = time_utils.getDayTimeBoundsForLocal(self.__selectedDate) eventItems, dateInfo, noEventsText = [], None, None dateString = _ms(MENU.DATETIME_SHORTDATEFORMATWITHOUTYEAR, weekDay=_ms('#menu:dateTime/weekDays/full/%d' % localDateTime.isoweekday()), monthDay=localDateTime.day, month=toLower(_ms('#menu:dateTime/months/full/%d' % localDateTime.month))) if fort.isOnVacationAt(self.__selectedDate): noEventsText = _ms(FORTIFICATIONS.FORTCALENDARWINDOW_EVENTSLIST_EMPTY_VACATION, date=fort.getVacationDateStr()) elif not self._isValidTime(self.__selectedDate): noEventsText = _ms(FORTIFICATIONS.FORTCALENDARWINDOW_EVENTSLIST_EMPTY_NOTAVAILABLE) else: for dayStartTimestamp, battles in self._getBattlesByDay().iteritems(): if dayStartTimestamp == targetDayStartTimestamp: for battle in sorted(battles): startTimestamp = battle.getStartTime() battleHasEnded = battle.isEnded() opponentsClanInfo = battle.getOpponentClanInfo() if battle.getType() == BATTLE_ITEM_TYPE.ATTACK: if battleHasEnded: icon = RES_ICONS.MAPS_ICONS_LIBRARY_FORTIFICATION_OFFENCEPAST else: icon = RES_ICONS.MAPS_ICONS_LIBRARY_FORTIFICATION_OFFENCEFUTURE titleTpl = _ms(FORTIFICATIONS.FORTCALENDARWINDOW_EVENTSLIST_ITEM_TITLE_OFFENCE) else: if battleHasEnded: icon = RES_ICONS.MAPS_ICONS_LIBRARY_FORTIFICATION_DEFENCEPAST else: icon = RES_ICONS.MAPS_ICONS_LIBRARY_FORTIFICATION_DEFENCEFUTURE titleTpl = _ms(FORTIFICATIONS.FORTCALENDARWINDOW_EVENTSLIST_ITEM_TITLE_DEFENCE) tankIconVO = getDivisionIcon(battle.defenderFortLevel, battle.attackerFortLevel, determineAlert=battle.getType() == BATTLE_ITEM_TYPE.ATTACK) if battle.isWin(): background = RES_ICONS.MAPS_ICONS_LIBRARY_FORTIFICATION_BATTLEFORTVICTORY resultLabel = 'win' elif battle.isLose(): background = RES_ICONS.MAPS_ICONS_LIBRARY_FORTIFICATION_BATTLEFORTDEFEAT resultLabel = 'lose' else: background, resultLabel = (None, None) eventItem = {'icon': icon, 'title': titleTpl % {'clanName': '[%s]' % opponentsClanInfo[1]}, 'clanID': opponentsClanInfo[0], 'direction': _ms(FORTIFICATIONS.GENERAL_DIRECTION, value=_ms('#fortifications:General/directionName%d' % battle.getDirection())), 'timeInfo': _ms(FORTIFICATIONS.FORTCALENDARWINDOW_EVENTSLIST_ITEM_TIMEINFO) % {'startTime': BigWorld.wg_getShortTimeFormat(startTimestamp), 'endTime': BigWorld.wg_getShortTimeFormat(startTimestamp + time_utils.ONE_HOUR)}, 'background': background, 'tankIconVO': tankIconVO, 'showTankIcon': not battleHasEnded} if battleHasEnded and resultLabel: resultText = makeHtmlString('html_templates:lobby/fortifications', 'battleResult', {'result': _ms(MENU.finalstatistic_commonstats_resultlabel(resultLabel))}) eventItem.update({'result': resultText}) eventItems.append(eventItem) if not len(eventItems): noEventsText = _ms(FORTIFICATIONS.FORTCALENDARWINDOW_EVENTSLIST_EMPTY_NOEVENTS) if len(eventItems) > 0: dateInfo = _ms(FORTIFICATIONS.FORTCALENDARWINDOW_EVENTSLIST_INFO_BATTLESCOUNT, eventsCount=len(eventItems)) self.as_updatePreviewDataS({'dateString': dateString, 'dateInfo': dateInfo, 'noEventsText': noEventsText, 'events': eventItems})
def canPlanAttackOn(self, dayTimestamp, clanFortInfo): if self.isFrozen(): return ATTACK_PLAN_RESULT.MY_FROZEN currentDefHourTimestamp = time_utils.getTimeForLocal(dayTimestamp, clanFortInfo.getStartDefHour()) enemyDefHour = clanFortInfo.getDefHourFor(currentDefHourTimestamp) enemyDefHourTimestamp = time_utils.getTimeForLocal(dayTimestamp, enemyDefHour) if enemyDefHourTimestamp - time_utils.getCurrentTimestamp() <= fortified_regions.g_cache.attackPreorderTime: return ATTACK_PLAN_RESULT.PREORDER_TIME if self.isOnVacationAt(enemyDefHourTimestamp): return ATTACK_PLAN_RESULT.MY_VACATION (vacationStart, vacationEnd,) = clanFortInfo.getVacationPeriod() if vacationStart <= enemyDefHourTimestamp <= vacationEnd: return ATTACK_PLAN_RESULT.OPP_VACATION dayDate = time_utils.getDateTimeInLocal(dayTimestamp) localOffDay = clanFortInfo.getLocalOffDayFor(currentDefHourTimestamp) if dayDate.weekday() == localOffDay: return ATTACK_PLAN_RESULT.OPP_OFF_DAY if self.defenceHour == clanFortInfo.getStartDefHour(): return ATTACK_PLAN_RESULT.DEFENCE_HOUR_SAME def filterInFight(item): if enemyDefHourTimestamp <= item.getStartTime() < enemyDefHourTimestamp + time_utils.ONE_HOUR: return True return False attacksInFight = self.getAttacks(clanFortInfo.getClanDBID(), filterInFight) if attacksInFight: return ATTACK_PLAN_RESULT.WAR_DECLARED if clanFortInfo.closestAttackInCooldown is not None and dayTimestamp < clanFortInfo.closestAttackInCooldown.getStartTime() + time_utils.ONE_DAY * 7 and not clanFortInfo.counterAttacked: return ATTACK_PLAN_RESULT.IN_COOLDOWN (hasAvailableDirections, hasFreeDirections,) = (False, False) for direction in self.getOpenedDirections(): eventTypeID = FORT_EVENT_TYPE.DIR_OPEN_ATTACKS_BASE + direction (availableTime, _, _,) = self.events.get(eventTypeID, (None, None, None)) if availableTime <= enemyDefHourTimestamp: hasAvailableDirections = True def filterAttacks(item): if enemyDefHourTimestamp <= item.getStartTime() <= enemyDefHourTimestamp + time_utils.ONE_HOUR and direction == item.getDirection() and not item.isEnded(): return True return False if not self.getAttacks(filterFunc=filterAttacks): hasFreeDirections = True break if not hasAvailableDirections: return ATTACK_PLAN_RESULT.MY_NO_DIR if not hasFreeDirections: return ATTACK_PLAN_RESULT.MY_BUSY (isBusy, isAvailable,) = clanFortInfo.isAvailableForAttack(enemyDefHourTimestamp) if not isAvailable: return ATTACK_PLAN_RESULT.OPP_NO_DIR if isBusy: return ATTACK_PLAN_RESULT.OPP_BUSY return ATTACK_PLAN_RESULT.OK
def __makeData(self): fort = self.fortCtrl.getFort() data = {'numOfFavorites': len(fort.favorites), 'favoritesLimit': FORT_MAX_ELECTED_CLANS, 'canAttackDirection': self.fortCtrl.getPermissions().canPlanAttack(), 'canAddToFavorite': self.fortCtrl.getPermissions().canAddToFavorite(), 'isOurFortFrozen': self._isFortFrozen(), 'isSelected': self.__item is not None, 'haveResults': self.__hasResults} if self.__item is not None: clanID = self.__item.getClanDBID() selectedDefenceHour = time_utils.getDateTimeInLocal(self.__selectedDefencePeriodStart).hour if self.__item.getLocalDefHour()[0] != selectedDefenceHour and not self.__weAreAtWar: warTime = '%s - %s' % (BigWorld.wg_getShortTimeFormat(self.__selectedDefencePeriodStart), BigWorld.wg_getShortTimeFormat(self.__selectedDefencePeriodEnd)) warPlannedIcon = makeHtmlString('html_templates:lobby/iconText', 'alert', {}) warPlannedMsg = makeHtmlString('html_templates:lobby/textStyle', 'alertText', {'message': warTime}) warPlannedTime = _ms(warPlannedIcon + ' ' + warPlannedMsg) data.update({'warPlannedTime': warPlannedTime, 'warPlannedTimeTT': _ms(TOOLTIPS.FORTIFICATION_FORTINTELLIGENCECLANDESCRIPTION_WARTIME, warTime=warTime)}) if self.__weAreAtWar: closestAttack = self.__upcomingAttack or self.__attackInCooldown closestAttackTime = closestAttack.getStartTime() data.update({'isWarDeclared': self.__upcomingAttack is not None, 'isAlreadyFought': self.__attackInCooldown is not None and not self.__hasBeenCounterAttacked, 'warPlannedDate': BigWorld.wg_getLongDateFormat(closestAttackTime), 'warNextAvailableDate': BigWorld.wg_getLongDateFormat(closestAttackTime + time_utils.ONE_WEEK)}) isFrozen = fort.isFrozen() clanFortBattlesStats = self.__item.getStatistics().getBattlesStats() battlesCount = clanFortBattlesStats.getBattlesCount() battlesWinsEff = clanFortBattlesStats.getWinsEfficiency() MIN_VALUE = 0.01 clanAvgDefresValue = functions.roundToMinOrZero(clanFortBattlesStats.getProfitFactor(), MIN_VALUE) data.update({'dateSelected': BigWorld.wg_getLongDateFormat(self.__selectedDayStart), 'selectedDayTimestamp': self.__selectedDayStart, 'clanTag': '[%s]' % self.__item.getClanAbbrev(), 'clanName': self.__item.getClanName(), 'clanInfo': self.__item.getClanMotto(), 'clanId': clanID, 'clanEmblem': self.__clanEmblem, 'isFavorite': clanID in fort.favorites, 'isFrozen': isFrozen, 'selectedDateText': self.__getSelectedDateText(), 'clanBattles': {'value': BigWorld.wg_getNiceNumberFormat(battlesCount) if battlesCount else '--', 'icon': RES_ICONS.MAPS_ICONS_LIBRARY_DOSSIER_BATTLES40X32, 'ttHeader': _ms(TOOLTIPS.FORTIFICATION_FORTINTELLIGENCECLANDESCRIPTION_BATTLES_HEADER), 'ttBody': _ms(TOOLTIPS.FORTIFICATION_FORTINTELLIGENCECLANDESCRIPTION_BATTLES_BODY, wins=BigWorld.wg_getNiceNumberFormat(clanFortBattlesStats.getWinsCount()), defeats=BigWorld.wg_getNiceNumberFormat(clanFortBattlesStats.getLossesCount()))}, 'clanWins': {'value': '%s%%' % BigWorld.wg_getNiceNumberFormat(functions.roundToMinOrZero(battlesWinsEff, MIN_VALUE) * 100) if battlesWinsEff is not None else '--', 'icon': RES_ICONS.MAPS_ICONS_LIBRARY_DOSSIER_WINS40X32, 'ttHeader': _ms(TOOLTIPS.FORTIFICATION_FORTINTELLIGENCECLANDESCRIPTION_WINS_HEADER), 'ttBody': _ms(TOOLTIPS.FORTIFICATION_FORTINTELLIGENCECLANDESCRIPTION_WINS_BODY)}, 'clanAvgDefres': {'value': BigWorld.wg_getNiceNumberFormat(clanAvgDefresValue) if clanAvgDefresValue else '--', 'icon': RES_ICONS.MAPS_ICONS_LIBRARY_DOSSIER_DEFRESRATIO40X32, 'ttHeader': _ms(TOOLTIPS.FORTIFICATION_FORTINTELLIGENCECLANDESCRIPTION_AVGDEFRES_HEADER), 'ttBody': _ms(TOOLTIPS.FORTIFICATION_FORTINTELLIGENCECLANDESCRIPTION_AVGDEFRES_BODY)}, 'directions': self.__getDirectionsData()}) self.as_setDataS(data) return
def canPlanAttackOn(self, dayTimestamp, clanFortInfo): if self.isFrozen(): return ATTACK_PLAN_RESULT.MY_FROZEN currentDefHourTimestamp = time_utils.getTimeForLocal(dayTimestamp, *clanFortInfo.getLocalDefHour()) enemyDefHourTimestamp = time_utils.getTimeForLocal(dayTimestamp, *clanFortInfo.getDefHourFor(currentDefHourTimestamp)) if enemyDefHourTimestamp - time_utils.getCurrentTimestamp() <= fortified_regions.g_cache.attackPreorderTime: return ATTACK_PLAN_RESULT.PREORDER_TIME if self.isOnVacationAt(enemyDefHourTimestamp): return ATTACK_PLAN_RESULT.MY_VACATION vacationStart, vacationEnd = clanFortInfo.getVacationPeriod() if vacationStart <= enemyDefHourTimestamp <= vacationEnd: return ATTACK_PLAN_RESULT.OPP_VACATION dayDate = time_utils.getDateTimeInLocal(dayTimestamp) localOffDay = clanFortInfo.getLocalOffDayFor(currentDefHourTimestamp) if dayDate.weekday() == localOffDay: return ATTACK_PLAN_RESULT.OPP_OFF_DAY if self.defenceHour == clanFortInfo.getStartDefHour(): return ATTACK_PLAN_RESULT.DEFENCE_HOUR_SAME def filterInFight(item): if enemyDefHourTimestamp <= item.getStartTime() < enemyDefHourTimestamp + time_utils.ONE_HOUR: return True return False attacksInFight = self.getAttacks(clanFortInfo.getClanDBID(), filterInFight) if attacksInFight: return ATTACK_PLAN_RESULT.WAR_DECLARED if clanFortInfo.closestAttackInCooldown is not None and dayTimestamp < clanFortInfo.closestAttackInCooldown.getStartTime() + time_utils.ONE_DAY * 7 and not clanFortInfo.counterAttacked: return ATTACK_PLAN_RESULT.IN_COOLDOWN hasAvailableDirections, hasFreeDirections = False, False for direction in self.getOpenedDirections(): eventTypeID = FORT_EVENT_TYPE.DIR_OPEN_ATTACKS_BASE + direction availableTime, _, _ = self.events.get(eventTypeID, (None, None, None)) if availableTime is None or availableTime <= enemyDefHourTimestamp: hasAvailableDirections = True def filterAttacks(item): if enemyDefHourTimestamp <= item.getStartTime() <= enemyDefHourTimestamp + time_utils.ONE_HOUR and direction == item.getDirection() and not item.isEnded(): return True return False if not self.getAttacks(filterFunc=filterAttacks): hasFreeDirections = True break if not hasAvailableDirections: return ATTACK_PLAN_RESULT.MY_NO_DIR if not hasFreeDirections: return ATTACK_PLAN_RESULT.MY_BUSY isBusy, isAvailable = clanFortInfo.isAvailableForAttack(enemyDefHourTimestamp) if not isAvailable: return ATTACK_PLAN_RESULT.OPP_NO_DIR if isBusy: return ATTACK_PLAN_RESULT.OPP_BUSY return ATTACK_PLAN_RESULT.OK
def getDateParams(self, timestamp): from helpers import time_utils date = time_utils.getDateTimeInLocal(int(timestamp)) result = {'year': date.year, 'month': date.month - 1, 'date': date.day, 'hour': date.hour, 'minute': date.minute, 'second': date.second, 'millisecond': date.microsecond * 1000} return result
def _getDescrBlock(self): minStartTime = min([q.getStartTime() for q in self._suitableEvents]) maxFinishTime = max([q.getFinishTime() for q in self._suitableEvents]) startDate = time_utils.getDateTimeInLocal(minStartTime) finishDate = time_utils.getDateTimeInLocal(maxFinishTime) startDateFormat = finishDateFormat = '%d %B %Y' if startDate.year == finishDate.year: startDateFormat = '%d %B' if startDate.month == finishDate.month: startDateFormat = '%d' return { 'period': text_styles.middleTitle( _ms(QUESTS.MISSIONS_TAB_MARATHONS_HEADER_PERIOD, startDate=formatDate(startDateFormat, minStartTime), endDate=formatDate(finishDateFormat, maxFinishTime))), 'isMultiline': True, 'hasCalendarIcon': True }
def isOnOffDay(self): return self.getLocalOffDay() == time_utils.getDateTimeInLocal(time_utils.getCurrentTimestamp()).weekday()
def isOnOffDay(self): return self.getLocalOffDay() == time_utils.getDateTimeInLocal( time_utils.getCurrentTimestamp()).weekday()
def __makeData(self): fort = self.fortCtrl.getFort() data = {'numOfFavorites': len(fort.favorites), 'favoritesLimit': FORT_MAX_ELECTED_CLANS, 'canAttackDirection': self.fortCtrl.getPermissions().canPlanAttack(), 'canAddToFavorite': self.fortCtrl.getPermissions().canAddToFavorite(), 'isOurFortFrozen': self._isFortFrozen(), 'isSelected': self.__item is not None, 'haveResults': self.__hasResults} isWarDeclared = False isAlreadyFought = False if self.__item is not None: clanID = self.__item.getClanDBID() selectedDefenceHour = time_utils.getDateTimeInLocal(self.__selectedDefencePeriodStart).hour if self.__item.getLocalDefHour()[0] != selectedDefenceHour and not self.__weAreAtWar: warTime = '%s - %s' % (BigWorld.wg_getShortTimeFormat(self.__selectedDefencePeriodStart), BigWorld.wg_getShortTimeFormat(self.__selectedDefencePeriodEnd)) warPlannedIcon = makeHtmlString('html_templates:lobby/iconText', 'alert', {}) warPlannedMsg = makeHtmlString('html_templates:lobby/textStyle', 'alertText', {'message': warTime}) warPlannedTime = _ms(warPlannedIcon + ' ' + warPlannedMsg) data.update({'warPlannedTime': warPlannedTime, 'warPlannedTimeTT': _ms(TOOLTIPS.FORTIFICATION_FORTINTELLIGENCECLANDESCRIPTION_WARTIME, warTime=warTime)}) if self.__weAreAtWar: closestAttack = self.__upcomingAttack or self.__attackInCooldown closestAttackTime = closestAttack.getStartTime() isWarDeclared = self.__upcomingAttack is not None isAlreadyFought = self.__attackInCooldown is not None and not self.__hasBeenCounterAttacked data.update({'isWarDeclared': isWarDeclared, 'isAlreadyFought': isAlreadyFought, 'warPlannedDate': BigWorld.wg_getLongDateFormat(closestAttackTime), 'warNextAvailableDate': BigWorld.wg_getLongDateFormat(closestAttackTime + time_utils.ONE_WEEK)}) isFrozen = fort.isFrozen() clanFortBattlesStats = self.__item.getStatistics().getBattlesStats() battlesCount = clanFortBattlesStats.getBattlesCount() battlesWinsEff = clanFortBattlesStats.getWinsEfficiency() MIN_VALUE = 0.01 clanAvgDefresValue = functions.roundToMinOrZero(clanFortBattlesStats.getProfitFactor(), MIN_VALUE) data.update({'dateSelected': BigWorld.wg_getLongDateFormat(self.__selectedDayStart), 'selectedDayTimestamp': self.__selectedDayStart, 'clanTag': '[%s]' % self.__item.getClanAbbrev(), 'clanName': self.__item.getClanName(), 'clanInfo': self.__item.getClanMotto(), 'clanId': clanID, 'clanEmblem': self.__clanEmblem, 'isFavorite': clanID in fort.favorites, 'isFrozen': isFrozen, 'selectedDateText': self.__getSelectedDateText(), 'clanBattles': {'value': BigWorld.wg_getNiceNumberFormat(battlesCount) if battlesCount else '--', 'icon': RES_ICONS.MAPS_ICONS_LIBRARY_DOSSIER_BATTLES40X32, 'ttHeader': _ms(TOOLTIPS.FORTIFICATION_FORTINTELLIGENCECLANDESCRIPTION_BATTLES_HEADER), 'ttBody': _ms(TOOLTIPS.FORTIFICATION_FORTINTELLIGENCECLANDESCRIPTION_BATTLES_BODY, wins=BigWorld.wg_getNiceNumberFormat(clanFortBattlesStats.getWinsCount()), defeats=BigWorld.wg_getNiceNumberFormat(clanFortBattlesStats.getLossesCount()))}, 'clanWins': {'value': '%s%%' % BigWorld.wg_getNiceNumberFormat(functions.roundToMinOrZero(battlesWinsEff, MIN_VALUE) * 100) if battlesWinsEff is not None else '--', 'icon': RES_ICONS.MAPS_ICONS_LIBRARY_DOSSIER_WINS40X32, 'ttHeader': _ms(TOOLTIPS.FORTIFICATION_FORTINTELLIGENCECLANDESCRIPTION_WINS_HEADER), 'ttBody': _ms(TOOLTIPS.FORTIFICATION_FORTINTELLIGENCECLANDESCRIPTION_WINS_BODY)}, 'clanAvgDefres': {'value': BigWorld.wg_getNiceNumberFormat(clanAvgDefresValue) if clanAvgDefresValue else '--', 'icon': RES_ICONS.MAPS_ICONS_LIBRARY_DOSSIER_DEFRESRATIO40X32, 'ttHeader': _ms(TOOLTIPS.FORTIFICATION_FORTINTELLIGENCECLANDESCRIPTION_AVGDEFRES_HEADER), 'ttBody': _ms(TOOLTIPS.FORTIFICATION_FORTINTELLIGENCECLANDESCRIPTION_AVGDEFRES_BODY)}, 'directions': self.__getDirectionsData()}) if self.fortCtrl.getPermissions().canPlanAttack() and not isWarDeclared and not isAlreadyFought: attackerLevel = self.fortCtrl.getFort().level defenderLevel = self.__item.getLevel() data['divisionIcon'] = getDivisionIcon(defenderLevel, attackerLevel) self.as_setDataS(data) return