baseActivationController.py (5714B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\abyss\baseActivationController.py 2 import abc 3 import abyss 4 import blue 5 import eveexceptions 6 import signals 7 import threadutils 8 import uthread 9 10 class BaseActivationController(object): 11 __metaclass__ = abc.ABCMeta 12 __notifyevents__ = ['OnAddFX', 13 'OnPvpTimerUpdate', 14 'OnInvulnCancelled', 15 'OnInvulunOnUndockingUpdated', 16 'OnRemoveFX', 17 'OnRestoringInvulnUpdated', 18 'OnSafetyLevelChanged', 19 'OnSessionChanged', 20 'OnSlimItemChange', 21 'OnClientEvent_WarpStarted', 22 'OnClientEvent_WarpFinished', 23 'ProcessActiveShipChanged'] 24 _monitoredEffects = ('effects.Cloak', 'effects.CloakingCovertOps', 'effects.CloakingPrototype', 'effects.CloakingWarpSafe', 'effects.CloakNoAmim', 'effects.Tethering', 'effects.Uncloak') 25 26 def __init__(self, itemID, validator): 27 self._errors = None 28 self._isFinished = False 29 self._isActivating = False 30 self._itemID = itemID 31 self._remote_errors = [] 32 self._sessionChangeThread = None 33 self._validator = validator 34 self.onChange = signals.Signal(signalName='onChange') 35 sm.RegisterNotify(self) 36 37 @abc.abstractmethod 38 def GetText(self): 39 pass 40 41 @abc.abstractmethod 42 def _Validate(self): 43 pass 44 45 @abc.abstractmethod 46 def _Activate(self): 47 pass 48 49 @property 50 def errors(self): 51 if self._errors is None: 52 self.Validate() 53 return set(self._errors + self._remote_errors) 54 55 @property 56 def itemID(self): 57 return self._itemID 58 59 @property 60 def isFinished(self): 61 return self._isFinished 62 63 @property 64 def isActivating(self): 65 return self._isActivating 66 67 @property 68 def isReady(self): 69 return not self._errors and not self.isActivating and not self.isFinished 70 71 @property 72 def isSuspicious(self): 73 return self._validator.is_suspicious() 74 75 def Validate(self): 76 self._remote_errors = [] 77 self._errors, existing = [], self._errors 78 try: 79 self._Validate() 80 except abyss.Error as error: 81 self._errors = error.errors 82 except eveexceptions.UserError: 83 raise 84 except Exception: 85 self._errors.append((abyss.Error.UNKNOWN_ERROR, ())) 86 raise 87 88 if any((error == abyss.Error.SESSION_CHANGE_IN_PROGRESS for error, args in self._errors)): 89 self.ValidateOnNextSessionChange() 90 if existing != self._errors: 91 self.onChange() 92 93 @threadutils.throttled(2.0) 94 def Activate(self): 95 if not self.isReady: 96 return 97 try: 98 self._remote_errors = [] 99 self._isActivating = True 100 self.onChange() 101 activateTasklet = uthread.newJoinable(self._Activate) 102 uthread.waitForJoinable(activateTasklet, timeout=None) 103 except eveexceptions.UserError as error: 104 if error.msg == 'AbyssError': 105 self._remote_errors = error.dict['errors'] 106 else: 107 raise 108 except Exception: 109 self._remote_errors = [(abyss.Error.UNKNOWN_ERROR, ())] 110 raise 111 finally: 112 self._isActivating = False 113 self.onChange() 114 115 def Close(self): 116 sm.UnregisterNotify(self) 117 self.onChange.clear() 118 119 def OnAddFX(self, effectGuid, ballID): 120 if ballID == session.shipid and effectGuid in self._monitoredEffects: 121 if effectGuid == 'effects.Cloak': 122 self._validator.set_cloaking(True) 123 self.Validate() 124 125 def OnInvulnCancelled(self, shipID): 126 if shipID == session.shipid: 127 self._validator.set_invulnerable(False) 128 self.Validate() 129 130 def OnInvulunOnUndockingUpdated(self, shipID, endTime, duration): 131 if shipID == session.shipid: 132 self._validator.set_invulnerable(True) 133 self.Validate() 134 135 def OnPvpTimerUpdate(self, state, expiryTime): 136 self.Validate() 137 138 def OnRemoveFX(self, effectGuid, ballID): 139 if ballID == session.shipid and effectGuid in self._monitoredEffects: 140 if effectGuid == 'effects.Cloak': 141 self._validator.set_cloaking(False) 142 self.Validate() 143 144 def OnRestoringInvulnUpdated(self, shipID, endTime, duration): 145 if shipID == session.shipid: 146 self._validator.set_invulnerable(True) 147 self.Validate() 148 149 def OnSafetyLevelChanged(self, safetyLevel): 150 self.Validate() 151 152 def OnSessionChanged(self, isRemote, session, change): 153 if any((x in change for x in ('structureid', 'stationid'))): 154 self._isFinished = True 155 self.Validate() 156 if session.nextSessionChange is not None and not self.isFinished: 157 self.ValidateOnNextSessionChange() 158 159 def OnSlimItemChange(self, oldSlim, newSlim): 160 if newSlim.itemID in (session.shipid, self._validator.get_gate_id()): 161 self.Validate() 162 163 def OnClientEvent_WarpStarted(self, *args): 164 self.Validate() 165 166 def OnClientEvent_WarpFinished(self, *args): 167 self.Validate() 168 169 def ValidateOnNextSessionChange(self): 170 if self._sessionChangeThread is not None: 171 return 172 self._sessionChangeThread = uthread.new(self._ValidateOnNextSessionChange) 173 174 def _ValidateOnNextSessionChange(self): 175 while blue.os.GetSimTime() < session.nextSessionChange: 176 blue.synchro.Yield() 177 178 self.Validate() 179 self._sessionChangeThread = None 180 181 def ProcessActiveShipChanged(self, shipID, oldShipID): 182 self.Validate()