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

itemLocking.py (3131B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\services\corporation\itemLocking.py
      2 from carbon.common.script.sys.service import Service
      3 from eve.common.lib import appConst as const
      4 from eve.common.script.sys.idCheckers import IsCorporation
      5 from locks import TempLock
      6 
      7 class ItemLocking(Service):
      8     __servicename__ = 'ItemLocking'
      9     __displayname__ = 'Client side Item Locking Service'
     10     __guid__ = 'svc.lockedItems'
     11     __notifyevents__ = ['OnLockedItemChange']
     12 
     13     def __init__(self):
     14         Service.__init__(self)
     15         self.lockedItemsByLocationID = {}
     16         self.locationsWithLockedItems = None
     17         self.remoteSvc = None
     18 
     19     def Run(self, *args):
     20         Service.Run(self, args)
     21         self.remoteSvc = sm.RemoteSvc('itemLocking')
     22 
     23     def GetLockedItemsByLocation(self, locationID):
     24         with TempLock('GetLockedItemsByLocation_%s' % locationID):
     25             if locationID not in self.lockedItemsByLocationID:
     26                 self.lockedItemsByLocationID[locationID] = self.remoteSvc.GetItemsByLocation(locationID)
     27         return self.lockedItemsByLocationID[locationID]
     28 
     29     def GetLockedItemLocations(self):
     30         with TempLock('GetLockedItemLocations'):
     31             if self.locationsWithLockedItems is None:
     32                 self.locationsWithLockedItems = self.remoteSvc.GetLockedItemLocations()
     33         return self.locationsWithLockedItems
     34 
     35     def IsItemLocked(self, item):
     36         if not IsCorporation(item.ownerID):
     37             return False
     38         if item.flagID == const.flagCorpDeliveries and item.locationID in (session.structureid, session.stationid) and not self._CanTakeFromDeliveries():
     39             return True
     40         if item.flagID == const.flagCapsuleerDeliveries and item.locationID in (session.structureid, session.stationid) and not session.corprole & (const.corpRoleProjectManager | const.corpRoleDirector):
     41             return True
     42         for office in sm.GetService('officeManager').GetMyCorporationsOffices():
     43             if office.officeID == item.locationID:
     44                 if item.itemID in self.GetLockedItemsByLocation(office.stationID):
     45                     return True
     46 
     47         return self.IsItemIDLocked(item.itemID)
     48 
     49     def IsItemIDLocked(self, itemID):
     50         stationID = session.stationid or session.structureid
     51         if stationID is not None:
     52             return itemID in self.GetLockedItemsByLocation(stationID)
     53         return False
     54 
     55     @staticmethod
     56     def _CanTakeFromDeliveries():
     57         return session.corprole & (const.corpRoleAccountant | const.corpRoleTrader)
     58 
     59     def OnLockedItemChange(self, itemID, ownerID, locationID, isLocked):
     60         try:
     61             del self.lockedItemsByLocationID[locationID]
     62         except KeyError:
     63             pass
     64 
     65         if self.locationsWithLockedItems is not None:
     66             if isLocked:
     67                 self.locationsWithLockedItems.add(locationID)
     68             elif len(self.GetLockedItemsByLocation(locationID)) == 0:
     69                 self.locationsWithLockedItems.discard(locationID)
     70         sm.ScatterEvent('OnLockedItemChangeUI', itemID, ownerID, locationID)