shipSkinLicensesSvc.py (8818B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\cosmetics\client\shipSkinLicensesSvc.py 2 import uthread 3 import logging 4 from carbon.common.script.sys.serviceConst import ROLE_PROGRAMMER 5 from cosmetics.client.messengers.cosmetics.ship.shipSkinLicenseNoticeMessenger import PublicShipSkinLicenseNoticeMessenger 6 from cosmetics.client.messengers.cosmetics.ship.shipSkinLicenseRequestMessenger import PublicShipSkinLicenseRequestMessenger 7 from cosmetics.client.ships import ship_skin_signals 8 from cosmetics.client.ships import ship_skin_svc_signals 9 from cosmetics.client.ships.skins.errors import GetSkinLicensesFailed 10 from cosmetics.client.ships.skins.live_data.skin_license import SkinLicense 11 logger = logging.getLogger(__name__) 12 _instance = None 13 14 def get_ship_skin_license_svc(): 15 global _instance 16 if _instance is None: 17 _instance = _ShipSkinLicensesController() 18 return _instance 19 20 21 class _ShipSkinLicensesController(object): 22 __notifyevents__ = ['OnSessionChanged'] 23 24 def __init__(self): 25 self._cache = {} 26 self._owned_license_ids = [] 27 self._my_licenses_fetched_already = False 28 self._licenses_flagged_as_new = set() 29 public_gateway = sm.GetService('publicGatewaySvc') 30 self._request_messenger = PublicShipSkinLicenseRequestMessenger(public_gateway) 31 self._notice_messenger = PublicShipSkinLicenseNoticeMessenger(public_gateway) 32 sm.RegisterNotify(self) 33 ship_skin_svc_signals.on_skin_license_added_internal.connect(self._on_license_added) 34 ship_skin_svc_signals.on_skin_license_updated_internal.connect(self._on_license_updated) 35 ship_skin_svc_signals.on_skin_license_deleted_internal.connect(self._on_license_deleted) 36 37 def __del__(self): 38 ship_skin_svc_signals.on_skin_license_added_internal.disconnect(self._on_license_added) 39 ship_skin_svc_signals.on_skin_license_updated_internal.disconnect(self._on_license_updated) 40 ship_skin_svc_signals.on_skin_license_deleted_internal.disconnect(self._on_license_deleted) 41 42 def OnSessionChanged(self, _isRemote, _sess, change): 43 if 'charid' in change: 44 self._clear_cache() 45 46 def _clear_cache(self): 47 self._cache = {} 48 self._owned_license_ids = [] 49 self._my_licenses_fetched_already = False 50 self._licenses_flagged_as_new.clear() 51 52 def get_my_licenses(self, force_refresh = False): 53 owner_character_id = session.charid 54 if force_refresh or not self._my_licenses_fetched_already: 55 self._owned_license_ids = self._request_messenger.get_owned_request() 56 exc = self._get_licenses_parallel(self._owned_license_ids, owner_character_id) 57 if exc is None: 58 self._my_licenses_fetched_already = True 59 else: 60 logger.exception(exc) 61 return self._cache.get(owner_character_id, {}) 62 63 def get_my_activated_licenses(self, ship_type_id = None): 64 licenses = self.get_my_licenses().values() 65 if ship_type_id: 66 return [ l for l in licenses if l.activated and l.skin_design.ship_type_id == ship_type_id ] 67 return [ l for l in licenses if l.activated ] 68 69 def get_my_unactivated_licenses(self): 70 licenses = self.get_my_licenses().values() 71 return [ l for l in licenses if l.nb_unactivated > 0 ] 72 73 def get_my_licenses_that_are_available_to_use_or_sell(self): 74 licenses = self.get_my_licenses().values() 75 return [ l for l in licenses if l.nb_unactivated > 0 or l.activated ] 76 77 def get_license(self, license_id, owner_character_id, force_refresh = False): 78 if license_id not in self._cache.get(owner_character_id, {}) or force_refresh: 79 license = self._request_messenger.get_request(license_id, owner_character_id) 80 self._load_license_skin_data(license) 81 if owner_character_id not in self._cache: 82 self._cache[owner_character_id] = {} 83 self._cache[owner_character_id][license_id] = license 84 return self._cache.get(owner_character_id, {}).get(license_id, None) 85 86 def activate_license(self, license_id): 87 owner_character_id = session.charid 88 self._request_messenger.activate_request(license_id, owner_character_id) 89 if owner_character_id in self._cache and license_id in self._cache[owner_character_id]: 90 self._cache[owner_character_id][license_id].activated = True 91 ship_skin_signals.on_skin_license_activated(license_id) 92 93 def admin_grant_license(self, skin_hex, nb_licenses): 94 if session and session.role & ROLE_PROGRAMMER: 95 self._request_messenger.admin_grant_request(skin_hex, nb_licenses) 96 97 def admin_revoke_license(self, skin_hex): 98 if session and session.role & ROLE_PROGRAMMER: 99 self._request_messenger.admin_revoke_request(skin_hex, session.charid) 100 101 def set_license_is_new_flag(self, license_id, is_new): 102 if is_new: 103 self._licenses_flagged_as_new.add(license_id) 104 else: 105 self._licenses_flagged_as_new.discard(license_id) 106 107 def is_license_new(self, license_id): 108 return license_id in self._licenses_flagged_as_new 109 110 def apply_internal(self, license_id, ship_id, apply_license = True): 111 if apply_license: 112 self._request_messenger.apply_request(license_id, ship_id, session.charid) 113 else: 114 self._request_messenger.unapply_request(license_id, ship_id, session.charid) 115 116 def _get_licenses_parallel(self, license_ids, owner_character_id, force_refresh = False): 117 parallel_calls = [] 118 for license_id in license_ids: 119 parallel_calls.append((self._get_license_no_exc, (license_id, owner_character_id, force_refresh))) 120 121 results = uthread.parallel(parallel_calls) 122 failed_licenses = [ (license_id, err_msg) for license_id, err_msg in results if err_msg is not None ] if results else [] 123 if len(failed_licenses) > 0: 124 return GetSkinLicensesFailed(failed_licenses) 125 126 def _get_license_no_exc(self, license_id, owner_character_id, force_refresh = False): 127 try: 128 self.get_license(license_id, owner_character_id, force_refresh) 129 return (license_id, None) 130 except Exception as e: 131 return (license_id, e.message) 132 133 def _load_license_skin_data(self, license): 134 if license: 135 license.load_skin_design() 136 137 def _on_license_added(self, license_id, license_data): 138 if license_data.owner_character_id not in self._cache: 139 self._cache[license_data.owner_character_id] = {} 140 self._cache[license_data.owner_character_id][license_id] = license_data 141 self._load_license_skin_data(license_data) 142 if license_data.owner_character_id == session.charid: 143 self._owned_license_ids.append(license_id) 144 self.set_license_is_new_flag(license_id, is_new=True) 145 logger.info('SKIN LICENSES - License %s added, license data is %s' % (license_id, license_data)) 146 ship_skin_signals.on_skin_license_added(license_id, license_data) 147 148 def _on_license_updated(self, license_id, license_data, previous_license_data): 149 if license_data.owner_character_id not in self._cache: 150 self._cache[license_data.owner_character_id] = {} 151 self._load_license_skin_data(license_data) 152 if license_id in self._cache[license_data.owner_character_id]: 153 self._cache[license_data.owner_character_id][license_id].copy_from_other(license_data) 154 else: 155 self._cache[license_data.owner_character_id][license_id] = license_data 156 if license_data.owner_character_id == session.charid: 157 self._owned_license_ids.append(license_id) 158 self._set_license_is_new_flag(license_id, license_data, previous_license_data) 159 logger.info('SKIN LICENSES - License %s updated to %s' % (license_id, license_data)) 160 ship_skin_signals.on_skin_license_updated(license_id, license_data) 161 162 def _set_license_is_new_flag(self, license_id, license_data, previous_license_data): 163 did_aquire_unactivated_license = license_data.nb_unactivated > previous_license_data.nb_unactivated 164 if did_aquire_unactivated_license: 165 self.set_license_is_new_flag(license_id, is_new=True) 166 167 def _on_license_deleted(self, license_id, owner_character_id): 168 if owner_character_id in self._cache and license_id in self._cache[owner_character_id]: 169 self._cache[owner_character_id].pop(license_id) 170 if license_id in self._owned_license_ids: 171 self._owned_license_ids.remove(license_id) 172 logger.info('SKIN LICENSES - License %s deleted' % license_id) 173 ship_skin_signals.on_skin_license_deleted(license_id)