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

shipCosmeticTransactionSvc.py (3338B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\cosmetics\client\shipCosmeticTransactionSvc.py
      2 import uthread2
      3 import uuid
      4 import logging
      5 from cosmetics.client.messengers.cosmetics.ship.shipCosmeticTransactionNoticeMessenger import PublicShipCosmeticTransactionNoticeMessenger
      6 from cosmetics.client.ships import ship_skin_svc_signals
      7 from stackless_response_router.exceptions import TimeoutException
      8 logger = logging.getLogger(__name__)
      9 _instance = None
     10 
     11 def get_ship_cosmetic_transaction_svc():
     12     global _instance
     13     if _instance is None:
     14         _instance = _ShipCosmeticTransactionSvc()
     15     return _instance
     16 
     17 
     18 TRANSACTION_TIMEOUT_IN_SECONDS = 10
     19 TRANSACTION_INCREMENT_IN_SECONDS = 0.1
     20 
     21 class _ShipCosmeticTransactionSvc(object):
     22     __startupdependencies__ = ['publicGatewaySvc']
     23     __notifyevents__ = ['OnSessionChanged']
     24 
     25     def __init__(self):
     26         self._pending_transactions = {}
     27         public_gateway = sm.GetService('publicGatewaySvc')
     28         self._notice_messenger = PublicShipCosmeticTransactionNoticeMessenger(public_gateway)
     29         ship_skin_svc_signals.on_transaction_succeeded_internal.connect(self._on_transaction_succeeded)
     30         ship_skin_svc_signals.on_transaction_failed_internal.connect(self._on_transaction_failed)
     31         sm.RegisterNotify(self)
     32 
     33     def __del__(self):
     34         ship_skin_svc_signals.on_transaction_succeeded_internal.disconnect(self._on_transaction_succeeded)
     35         ship_skin_svc_signals.on_transaction_failed_internal.disconnect(self._on_transaction_failed)
     36 
     37     def OnSessionChanged(self, _isRemote, _sess, change):
     38         if 'charid' in change:
     39             self._clear_cache()
     40 
     41     def _clear_cache(self):
     42         self._pending_transactions = {}
     43 
     44     def process_transaction(self, transaction_id):
     45         if transaction_id in self._pending_transactions:
     46             logger.warning('COSMETIC TRANSACTIONS: transaction %s already logged' % transaction_id)
     47             return False
     48         self._pending_transactions[transaction_id] = None
     49         try:
     50             timeout = 0
     51             while transaction_id in self._pending_transactions and self._pending_transactions[transaction_id] is None:
     52                 if timeout >= TRANSACTION_TIMEOUT_IN_SECONDS:
     53                     logger.warning('COSMETIC TRANSACTIONS: transaction %s timed out' % transaction_id)
     54                     raise TimeoutException
     55                 timeout += TRANSACTION_INCREMENT_IN_SECONDS
     56                 uthread2.Sleep(TRANSACTION_INCREMENT_IN_SECONDS)
     57 
     58             return self._pending_transactions[transaction_id]
     59         except Exception as e:
     60             raise e
     61         finally:
     62             logger.info('COSMETIC TRANSACTIONS: transaction %s concluded' % transaction_id)
     63             self._pending_transactions.pop(transaction_id)
     64 
     65     def _on_transaction_succeeded(self, transaction_id):
     66         if transaction_id in self._pending_transactions:
     67             logger.info('COSMETIC TRANSACTIONS: transaction %s succeeded' % transaction_id)
     68             self._pending_transactions[transaction_id] = True
     69 
     70     def _on_transaction_failed(self, transaction_id):
     71         if transaction_id in self._pending_transactions:
     72             logger.info('COSMETIC TRANSACTIONS: transaction %s failed' % transaction_id)
     73             self._pending_transactions[transaction_id] = False