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