facilitySvc.py (5360B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\industry\facilitySvc.py 2 import uthread 3 import telemetry 4 from carbon.common.script.sys.service import Service 5 from eve.common.script.util import industryCommon 6 from caching.memoize import Memoize 7 from eveexceptions import UserError 8 from inventorycommon.const import typeOffice 9 10 class FacilityService(Service): 11 __guid__ = 'svc.facilitySvc' 12 __servicename__ = 'Facility Service' 13 __displayname__ = 'Facility Service' 14 __dependencies__ = ['clientPathfinderService'] 15 __notifyevents__ = ['OnSessionChanged', 'OnSystemActivityUpdated', 'OnFacilitiesUpdated'] 16 17 def Run(self, *args, **kwargs): 18 Service.Run(self, *args, **kwargs) 19 self.facilities = {} 20 self.maxActivityModifiers = None 21 self.loadedRegion = None 22 self.loading = uthread.Semaphore() 23 self.facilityManager = sm.RemoteSvc('facilityManager') 24 25 def OnSessionChanged(self, isRemote, session, change): 26 if 'regionid' in change: 27 self.Reload() 28 if 'solarsystemid2' in change or 'stationid' in change: 29 map(self._UpdateFacilityDistance, self.facilities.itervalues()) 30 sm.ScatterEvent('OnFacilitiesReloaded', None) 31 32 def OnSystemActivityUpdated(self): 33 self.maxActivityModifiers = None 34 self.Reload() 35 36 def OnFacilitiesUpdated(self, facilityIDs): 37 for facilityID in facilityIDs: 38 self.facilities.pop(facilityID, None) 39 try: 40 self._PrimeFacility(self.facilityManager.GetFacility(facilityID)) 41 except UserError: 42 pass 43 44 sm.ScatterEvent('OnFacilitiesReloaded', facilityIDs) 45 46 @telemetry.ZONE_METHOD 47 def GetFacilities(self, facilityIDs = None): 48 if facilityIDs is None or self.loadedRegion is None: 49 self._PrimeFacilities() 50 if facilityIDs: 51 fetch = set(facilityIDs) - set(self.facilities.keys()) 52 if fetch: 53 for facility in self.facilityManager.GetFacilitiesByID(facilityIDs): 54 self._PrimeFacility(facility) 55 56 return [ f for k, f in self.facilities.iteritems() if facilityIDs is None or k in facilityIDs ] 57 58 @telemetry.ZONE_METHOD 59 def GetFacility(self, facilityID, prime = True): 60 if facilityID: 61 if self.loadedRegion is None: 62 self._PrimeFacilities() 63 if prime and facilityID not in self.facilities: 64 self._PrimeFacility(self.facilityManager.GetFacility(facilityID)) 65 return self.facilities[facilityID] 66 67 def GetMaxActivityModifier(self, activityID = None): 68 self.InitMaxActivityModifiers() 69 if activityID: 70 return self.maxActivityModifiers.get(activityID, 1.0) 71 else: 72 return max(self.maxActivityModifiers.values()) or 1.0 73 74 def InitMaxActivityModifiers(self): 75 if self.maxActivityModifiers is None: 76 self.maxActivityModifiers = self.facilityManager.GetMaxActivityModifiers() 77 78 def GetFacilityTaxes(self, facilityID): 79 return self.facilityManager.GetFacilityTaxes(facilityID, session.corpid) 80 81 def SetFacilityTaxes(self, facilityID, taxRateValues): 82 self.facilityManager.SetFacilityTaxes(facilityID, session.corpid, taxRateValues) 83 84 def Reload(self, facilityID = None): 85 if facilityID is None: 86 self.facilities.clear() 87 self.loadedRegion = None 88 else: 89 self.facilities.pop(facilityID, None) 90 self._PrimeFacility(self.facilityManager.GetFacility(facilityID)) 91 sm.ScatterEvent('OnFacilitiesReloaded', {facilityID}) 92 93 def GetFreshFacility(self, facilityID): 94 with self.loading: 95 if facilityID in self.facilities and self.facilities[facilityID].rigModifiers: 96 del self.facilities[facilityID] 97 return self.GetFacility(facilityID) 98 99 @Memoize(1) 100 def GetFacilityLocations(self, facilityID, ownerID): 101 if facilityID is None: 102 return [] 103 locations = self.facilityManager.GetFacilityLocations(facilityID, ownerID) 104 cfg.evelocations.Prime(set([ location.itemID for location in locations if location.typeID != typeOffice ])) 105 return locations 106 107 def IsFacility(self, itemID): 108 self._PrimeFacilities() 109 if itemID in self.facilities: 110 return True 111 return False 112 113 def _PrimeFacilities(self, force = False): 114 with self.loading: 115 if not force and self.loadedRegion == session.regionid: 116 return 117 self.facilities.clear() 118 for data in self.facilityManager.GetFacilities(): 119 self._PrimeFacility(data) 120 121 cfg.eveowners.Prime(set([ facility.ownerID for facility in self.facilities.itervalues() ])) 122 cfg.evelocations.Prime(set([ facility.facilityID for facility in self.facilities.itervalues() ])) 123 self.loadedRegion = session.regionid 124 125 def _PrimeFacility(self, data): 126 facility = industryCommon.Facility(data) 127 self.facilities[facility.facilityID] = facility 128 self._UpdateFacilityDistance(facility) 129 130 def _UpdateFacilityDistance(self, facility): 131 facility.distance = self.clientPathfinderService.GetJumpCountFromCurrent(facility.solarSystemID)