NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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()