NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

skyhookBrowserController.py (10678B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\structure\structureBrowser\controllers\skyhookBrowserController.py
      2 import datetimeutils
      3 import eveformat
      4 import evetypes
      5 import gametime
      6 from carbon.common.script.util.format import FmtDate
      7 from evePathfinder.core import IsUnreachableJumpCount
      8 from eve.client.script.ui.structure.structureBrowser import browserUIConst
      9 from eve.client.script.ui.eveColor import CHERRY_RED_HEX, CRYO_BLUE_HEX
     10 from localization import GetByLabel
     11 from localization.formatters import FormatTimeIntervalShortWritten
     12 from orbitalSkyhook.const import STATE_LABELS, STATE_VULNERABILITY
     13 import logging
     14 from sovereignty.resource.shared.planetary_resources_cache import DataUnavailableError
     15 from sovereignty.skyhook.shared.skyhook_type_inference import get_skyhook_type_and_amount, is_non_reagent_skyhook, get_skyhook_product_type
     16 logger = logging.getLogger(__name__)
     17 
     18 class SkyhookBrowserController(object):
     19 
     20     def __init__(self):
     21         self.mySkyhooks = {}
     22 
     23     def GetMySkyhooks(self):
     24         mySkyhooks = sm.GetService('sovereigntyResourceSvc').GetMyCorporationSkyhooksMemoized()
     25         skyhookControllers = self._GetControllersFromSkyhookList(mySkyhooks)
     26         return skyhookControllers
     27 
     28     def _GetControllersFromSkyhookList(self, skyhooks):
     29         self.mySkyhooks.clear()
     30         skyhookControllers = []
     31         idsToPrime = {x.skyhookID for x in skyhooks}
     32         idsToPrime.union({x.solarSystemID for x in skyhooks})
     33         idsToPrime.union({x.planetID for x in skyhooks})
     34         cfg.evelocations.Prime(idsToPrime)
     35         sovResourceSvc = sm.GetService('sovereigntyResourceSvc')
     36         try:
     37             sovResourceSvc.PrimeStaticDataForPlanets()
     38             planetDataWasPrimed = True
     39         except Exception:
     40             planetDataWasPrimed = False
     41 
     42         try:
     43             skyhooks_details = sovResourceSvc.GetMyCorporationsSkyhookDetailsMemoized()
     44         except DataUnavailableError as e:
     45             skyhooks_details = None
     46             logger.error('Failed to get Skyhooks Details: %s', e)
     47 
     48         for eachSkyhook in skyhooks:
     49             skyhook_detail = skyhooks_details.get(eachSkyhook.skyhookID, None) if skyhooks_details is not None else None
     50             reagentTypeID = None
     51             resourceVersion = None
     52             if skyhook_detail:
     53                 reagentDefinition = skyhook_detail.get_first_reagent_data()
     54                 reagentTypeID = reagentDefinition.type_id if reagentDefinition is not None else None
     55                 resourceVersion = skyhook_detail.resource_version
     56             product = None
     57             if planetDataWasPrimed:
     58                 power = sovResourceSvc.GetPlanetPowerProduction(eachSkyhook.planetID, resourceVersion)
     59                 workforce = sovResourceSvc.GetPlanetWorkforceProduction(eachSkyhook.planetID, resourceVersion)
     60                 product = get_skyhook_product_type(reagentTypeID, power, workforce)
     61             sController = SkyhookEntryController(eachSkyhook, skyhook_detail, product, planetDataWasPrimed)
     62             self.mySkyhooks[eachSkyhook.skyhookID] = sController
     63             skyhookControllers.append(sController)
     64 
     65         return skyhookControllers
     66 
     67 
     68 class SkyhookEntryController(object):
     69 
     70     def __init__(self, skyhook, skyhookData, product, planetDataWasPrimed):
     71         self.skyHookInfo = skyhook
     72         self.skyhookData = skyhookData
     73         self.systemAndSkyhookName = None
     74         self.filterText = None
     75         self.planetDataWasPrimed = planetDataWasPrimed
     76         self.product = product
     77 
     78     def GetNumJumps(self):
     79         jumps = sm.GetService('clientPathfinderService').GetJumpCountFromCurrent(self.GetSolarSystemID())
     80         return jumps
     81 
     82     def GetNumJumpsText(self):
     83         jumps = self.GetNumJumps()
     84         if IsUnreachableJumpCount(jumps):
     85             return '-'
     86         else:
     87             return jumps
     88 
     89     def GetSecurity(self):
     90         return sm.GetService('map').GetSecurityStatus(self.GetSolarSystemID())
     91 
     92     def GetSolarSystemID(self):
     93         return self.skyHookInfo.solarSystemID
     94 
     95     def GetSecurityWithColor(self):
     96         return eveformat.client.solar_system_security_status(self.GetSolarSystemID())
     97 
     98     def GetSolarSystemName(self):
     99         return cfg.evelocations.Get(self.GetSolarSystemID()).name
    100 
    101     def GetName(self):
    102         if self.systemAndSkyhookName:
    103             return self.systemAndSkyhookName
    104         locationName = cfg.evelocations.Get(self.GetSolarSystemID()).name
    105         typeName = evetypes.GetName(self.GetTypeID())
    106         skyhookName = '%s - %s' % (typeName, cfg.evelocations.Get(self.skyHookInfo.planetID).name)
    107         systemAndSkyhookName = '<br>'.join([locationName, skyhookName])
    108         self.systemAndSkyhookName = systemAndSkyhookName
    109         return self.systemAndSkyhookName
    110 
    111     def GetFilterText(self):
    112         if self.filterText is not None:
    113             return self.filterText
    114         regionID = self.GetRegionID()
    115         regionText = cfg.evelocations.Get(regionID).name if regionID else ''
    116         textList = [self.GetCleanName(),
    117          self.GetHarvestText(),
    118          self.GetSystemName(),
    119          evetypes.GetName(self.GetTypeID()),
    120          regionText,
    121          self.GetStateText()]
    122         text = ' '.join(textList)
    123         text = text.lower()
    124         self.filterText = text
    125         return text
    126 
    127     def GetCleanName(self):
    128         typeName = evetypes.GetName(self.GetTypeID())
    129         skyhookName = '%s - %s' % (typeName, cfg.evelocations.Get(self.skyHookInfo.planetID).name)
    130         return skyhookName
    131 
    132     def GetSystemName(self):
    133         return cfg.evelocations.Get(self.GetSolarSystemID()).name
    134 
    135     def GetCategoryID(self):
    136         return evetypes.GetCategoryID(self.skyHookInfo.typeID)
    137 
    138     def GetTypeID(self):
    139         return self.skyHookInfo.typeID
    140 
    141     def GetItemID(self):
    142         return self.skyHookInfo.skyhookID
    143 
    144     def GetRegionID(self):
    145         regionID = sm.GetService('map').GetRegionForSolarSystem(self.GetSolarSystemID())
    146         return regionID
    147 
    148     def IsVulnerable(self):
    149         return STATE_VULNERABILITY.get(self.skyHookInfo.state, False)
    150 
    151     def IsTheftVulnerable(self):
    152         if is_non_reagent_skyhook(self.product):
    153             return False
    154         vulnerabilityData = self.skyhookData.vulnerability_data
    155         if vulnerabilityData is None:
    156             return False
    157         return vulnerabilityData.vulnerable
    158 
    159     def GetStateText(self):
    160         labelPath = STATE_LABELS.get(self.skyHookInfo.state, None)
    161         if labelPath:
    162             return GetByLabel(labelPath)
    163         return ''
    164 
    165     def GetHarvestText(self):
    166         if not self.planetDataWasPrimed:
    167             return '-'
    168         if self.skyhookData is None:
    169             reagentTypeID, reagentAmountsInfo, power, workforce = sm.GetService('sovereigntyResourceSvc').GetPlanetResourceInfo(self.skyHookInfo.planetID)
    170         else:
    171             reagentDefinition = self.skyhookData.get_first_reagent_data()
    172             reagentTypeID = reagentDefinition.type_id if reagentDefinition is not None else None
    173             reagentAmountsInfo = (reagentDefinition.configuration.amount_per_period, reagentDefinition.configuration.period) if reagentDefinition is not None else None
    174             power = sm.GetService('sovereigntyResourceSvc').GetPlanetPowerProduction(self.skyHookInfo.planetID, self.skyhookData.resource_version)
    175             workforce = sm.GetService('sovereigntyResourceSvc').GetPlanetWorkforceProduction(self.skyHookInfo.planetID, self.skyhookData.resource_version)
    176         if reagentTypeID and reagentAmountsInfo:
    177             amount, period = reagentAmountsInfo
    178             amountPerMin = float(amount) / (float(period) / 60)
    179             amountText = GetByLabel('UI/Sovereignty/AmountPerMinute', value=float(amountPerMin))
    180             return '%s (%s)' % (evetypes.GetName(reagentTypeID), amountText)
    181         if power:
    182             return '%s (%s)' % (GetByLabel('UI/Sovereignty/Power'), power)
    183         if workforce:
    184             if self.skyhookData.workforce is not None:
    185                 percentage_difference = round((self.skyhookData.workforce - workforce) / float(workforce) * 100)
    186                 color = CHERRY_RED_HEX if percentage_difference < 0 else CRYO_BLUE_HEX
    187                 return "%s (%s <color='%s'>(%s%%)</color>)" % (GetByLabel('UI/Sovereignty/Workforce'),
    188                  self.skyhookData.workforce,
    189                  color,
    190                  percentage_difference)
    191             return '%s (%s)' % (GetByLabel('UI/Sovereignty/Workforce'), workforce)
    192         return ''
    193 
    194     def GetTheftVulnerabilityText(self):
    195         if is_non_reagent_skyhook(self.product):
    196             return GetByLabel('UI/StructureBrowser/NotApplicable')
    197         else:
    198             vulnerabilityData = self.skyhookData.vulnerability_data
    199             if vulnerabilityData is None:
    200                 return GetByLabel('UI/OrbitalSkyhook/SkyhookWnd/NoDataAvailable')
    201             now = gametime.GetWallclockTime()
    202             start_blue = datetimeutils.datetime_to_filetime(vulnerabilityData.start)
    203             end_blue = datetimeutils.datetime_to_filetime(vulnerabilityData.end)
    204             if end_blue <= now:
    205                 return GetByLabel('UI/OrbitalSkyhook/SkyhookWnd/NoDataAvailable')
    206             if vulnerabilityData.vulnerable:
    207                 countdown = FormatTimeIntervalShortWritten(end_blue - now, 'day', 'minute')
    208                 return GetByLabel('UI/OrbitalSkyhook/SkyhookWnd/VulnerableToTheft', countdown=countdown)
    209             countdown = FormatTimeIntervalShortWritten(max(0, start_blue - now), 'day', 'minute')
    210             return GetByLabel('UI/OrbitalSkyhook/SkyhookWnd/SecureFromTheft', countdown=countdown)
    211 
    212     def GetTheftVulnerabilityStartAndEnd(self):
    213         if is_non_reagent_skyhook(self.product):
    214             return (None, None)
    215         vulnerabilityData = self.skyhookData.vulnerability_data
    216         if vulnerabilityData is None:
    217             return (None, None)
    218         start_blue = datetimeutils.datetime_to_filetime(vulnerabilityData.start)
    219         end_blue = datetimeutils.datetime_to_filetime(vulnerabilityData.end)
    220         return (FmtDate(start_blue), FmtDate(end_blue))
    221 
    222     def GetTheftVulnerabilitySortValue(self):
    223         vulnerabilityData = self.skyhookData.vulnerability_data
    224         if is_non_reagent_skyhook(self.product) or vulnerabilityData is None:
    225             return (3, GetByLabel('UI/StructureBrowser/NotApplicable'))
    226         elif vulnerabilityData.vulnerable:
    227             end_blue = datetimeutils.datetime_to_filetime(vulnerabilityData.end)
    228             return (1, end_blue)
    229         else:
    230             start_blue = datetimeutils.datetime_to_filetime(vulnerabilityData.start)
    231             return (2, start_blue)