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)