planetInfoSvc.py (5399B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\parklife\planetInfoSvc.py 2 from carbon.common.script.sys.service import Service 3 from carbon.common.script.sys.serviceConst import SERVICE_RUNNING, SERVICE_START_PENDING 4 from collections import defaultdict 5 import trinity 6 import telemetry 7 from eve.common.script.sys import idCheckers 8 import inventorycommon.const as invConst 9 from eve.common.script.sys.idCheckers import IsSkyhook 10 from spacecomponents.common.helper import IsActiveComponent 11 12 class PlanetInfoSvc(Service): 13 __guid__ = 'svc.planetInfo' 14 __notifyevents__ = ['OnSessionChanged', 15 'DoBallsAdded', 16 'DoBallRemove', 17 'OnLocalHackProgressUpdated', 18 'DoBallsRemove'] 19 __servicename__ = 'PlanetInfo' 20 __displayname__ = 'Planet Info Caching Service' 21 __dependencies__ = ['michelle'] 22 23 def Run(self, memStream = None): 24 self.state = SERVICE_START_PENDING 25 self.LogInfo('PlanetInfo::Starting') 26 self.Reset() 27 self.hackProgress = {} 28 self.state = SERVICE_RUNNING 29 30 def Stop(self, memStream = None): 31 if not trinity.app: 32 return 33 self.LogInfo('PlanetInfo::Stopping') 34 self.Reset() 35 36 def OnSessionChanged(self, isremote, session, change): 37 if session.charid is None: 38 return 39 if 'solarsystemid' in change: 40 self.Reset() 41 42 def OnLocalHackProgressUpdated(self, hackedObjectID, hackProgress): 43 self.hackProgress[hackedObjectID] = hackProgress 44 bracket = sm.GetService('bracket').GetBracket(hackedObjectID) 45 if bracket and bracket.sr.orbitalHackLocal is not None: 46 bracket.UpdateHackProgress(hackProgress) 47 48 def GetMyHackProgress(self, itemID): 49 return self.hackProgress.get(itemID, None) 50 51 def Reset(self): 52 self.LogInfo('PlanetInfo::Reset') 53 self.planets = set() 54 self.orbitals = set() 55 self.orbitalsByPlanetID = defaultdict(lambda : defaultdict(set)) 56 57 def GetFunctionalCustomOfficeOrbitalsForPlanet(self, planetID): 58 groupIDs = (invConst.groupPlanetaryCustomsOffices, invConst.groupSkyhook) 59 orbitals = self._GetOrbitalsForPlanet(planetID, groupIDs) 60 ballpark = sm.GetService('michelle').GetBallpark() 61 functionalPocos = set() 62 for orbitalID in orbitals: 63 slimItem = ballpark.GetInvItem(orbitalID) 64 if IsSkyhook(slimItem.typeID) and not IsActiveComponent(ballpark.componentRegistry, slimItem.typeID, slimItem.itemID): 65 continue 66 functionalPocos.add(orbitalID) 67 68 return functionalPocos 69 70 def _GetOrbitalsForPlanet(self, planetID, groupIDs = None): 71 orbitals = set() 72 allPlanetOrbitals = self.orbitalsByPlanetID.get(planetID, {}) 73 for groupID, groupOrbitals in allPlanetOrbitals.iteritems(): 74 if groupIDs is None or groupID in groupIDs: 75 orbitals.update(allPlanetOrbitals.get(groupID, set())) 76 77 return orbitals 78 79 def GetOrbitalsAtPlanet(self, orbitalID): 80 for planetID, orbitsByGroupID in self.orbitalsByPlanetID.iteritems(): 81 for groupID, orbits in orbitsByGroupID.iteritems(): 82 if orbitalID in orbits: 83 return self._GetOrbitalsForPlanet(planetID) 84 85 return set() 86 87 def GetPocosForPlanet(self, planetID): 88 return self._GetOrbitalsForPlanet(planetID, (invConst.groupPlanetaryCustomsOffices,)) 89 90 def GetSkyhooksAtPlanet(self, planetID): 91 return self._GetOrbitalsForPlanet(planetID, (invConst.groupSkyhook,)) 92 93 def DoBallsAdded(self, ballItems, *args, **kwargs): 94 for ball, slimItem in ballItems: 95 if slimItem.groupID == invConst.groupPlanet: 96 self._AddPlanet(ball, slimItem) 97 elif idCheckers.IsOrbital(slimItem.categoryID): 98 self._AddOrbital(ball, slimItem) 99 100 @telemetry.ZONE_METHOD 101 def DoBallsRemove(self, pythonBalls, isRelease): 102 for ball, slimItem, terminal in pythonBalls: 103 self.DoBallRemove(ball, slimItem, terminal) 104 105 def DoBallRemove(self, ball, slimItem, *args, **kwargs): 106 if slimItem.groupID == invConst.groupPlanet and slimItem.itemID in self.planets: 107 self._RemovePlanet(ball, slimItem) 108 elif idCheckers.IsOrbital(slimItem.categoryID) and slimItem.itemID in self.orbitals: 109 self._RemoveOrbital(ball, slimItem) 110 111 def _AddPlanet(self, ball, slimItem): 112 self.planets.add(slimItem.itemID) 113 114 def _RemovePlanet(self, ball, slimItem): 115 self.planets.remove(slimItem.itemID) 116 if slimItem.itemID in self.orbitalsByPlanetID: 117 del self.orbitalsByPlanetID[slimItem.itemID] 118 119 def _AddOrbital(self, ball, slimItem): 120 self.orbitals.add(slimItem.itemID) 121 self.orbitalsByPlanetID[slimItem.planetID][slimItem.groupID].add(slimItem.itemID) 122 123 def _RemoveOrbital(self, ball, slimItem): 124 self.orbitals.remove(slimItem.itemID) 125 if slimItem.planetID in self.orbitalsByPlanetID: 126 for groupID, groupList in self.orbitalsByPlanetID[slimItem.planetID].iteritems(): 127 if slimItem.itemID in groupList: 128 groupList.remove(slimItem.itemID) 129 if len(groupList) == 0: 130 del self.orbitalsByPlanetID[slimItem.planetID][groupID] 131 break