onlineStatus.py (2478B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\comtool\onlineStatus.py 2 import blue 3 import uthread 4 from carbon.common.script.sys.service import Service 5 from eve.common.script.sys import idCheckers 6 7 class OnlineStatus(Service): 8 __guid__ = 'svc.onlineStatus' 9 __displayname__ = 'Online Status Service' 10 __exportedcalls__ = {'GetOnlineStatus': [], 11 'Prime': []} 12 __notifyevents__ = ['OnContactLoggedOn', 13 'OnContactLoggedOff', 14 'OnSessionChanged', 15 'OnClientContactChange', 16 'OnSessionReset'] 17 18 def Run(self, memStream = None): 19 self.semaphore = uthread.Semaphore() 20 self.onlineStatus = None 21 22 def OnContactLoggedOn(self, charID): 23 self.Prime() 24 self.onlineStatus[charID] = blue.DBRow(self.onlineStatus.header, [charID, True]) 25 26 def OnContactLoggedOff(self, charID): 27 self.Prime() 28 self.onlineStatus[charID] = blue.DBRow(self.onlineStatus.header, [charID, False]) 29 30 def OnClientContactChange(self, charID, online): 31 if online: 32 self.OnContactLoggedOn(charID) 33 else: 34 self.OnContactLoggedOff(charID) 35 36 def OnSessionChanged(self, isRemote, sess, change): 37 if 'charid' in change and change['charid'][1]: 38 self.Prime() 39 40 def GetOnlineStatus(self, charID, fetch = True): 41 if idCheckers.IsNPC(charID): 42 return False 43 if fetch: 44 self.Prime() 45 if charID not in (self.onlineStatus or {}): 46 if fetch: 47 self.onlineStatus[charID] = blue.DBRow(self.onlineStatus.header, [charID, sm.RemoteSvc('onlineStatus').GetOnlineStatus(charID)]) 48 else: 49 raise IndexError('GetOnlineStatus', charID) 50 if charID in self.onlineStatus: 51 return self.onlineStatus[charID].online 52 else: 53 return None 54 55 def ClearOnlineStatus(self, charID): 56 if charID in self.onlineStatus: 57 del self.onlineStatus[charID] 58 sm.ScatterEvent('OnContactNoLongerContact', charID) 59 60 def OnSessionReset(self): 61 self.onlineStatus = None 62 63 def Prime(self): 64 if self.onlineStatus is None: 65 self.semaphore.acquire() 66 try: 67 if self.onlineStatus is None: 68 self.onlineStatus = sm.RemoteSvc('onlineStatus').GetInitialState().Index('contactID') 69 finally: 70 self.semaphore.release()