shipSkinDesignSvc.py (8338B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\cosmetics\client\shipSkinDesignSvc.py 2 import logging 3 import uthread 4 from cosmetics.client.messengers.cosmetics.ship.shipSkinDesignRequestMessenger import PublicShipSkinDesignRequestMessenger 5 from cosmetics.client.shipSkinDataSvc import get_ship_skin_data_svc 6 from cosmetics.client.ships import ship_skin_signals 7 from cosmetics.client.ships.link.validators.paste import ShipSkinDesignLinkValidator 8 from cosmetics.client.ships.skins.live_data.skin_design import SkinDesign 9 from cosmetics.common.ships.skins.static_data.component import ComponentsDataLoader 10 from player_messaging.client.ui_message import message_player 11 from localization import GetByLabel 12 from publicGateway.grpc.exceptions import GenericException 13 from stackless_response_router.exceptions import TimeoutException 14 logger = logging.getLogger(__name__) 15 _instance = None 16 17 def get_ship_skin_design_svc(): 18 global _instance 19 if _instance is None: 20 _instance = _ShipSkinDesignSvc() 21 return _instance 22 23 24 class _ShipSkinDesignSvc(object): 25 __startupdependencies__ = ['publicGatewaySvc'] 26 __notifyevents__ = ['OnSessionChanged'] 27 28 def __init__(self): 29 self._designs_cache = {} 30 self._editor_config_cache = {} 31 self._owned_design_ids_cache = None 32 self._cached_saved_design_capacity = None 33 public_gateway = sm.GetService('publicGatewaySvc') 34 self._request_messenger = PublicShipSkinDesignRequestMessenger(public_gateway) 35 sm.RegisterNotify(self) 36 sm.GetService('chat').add_paste_validator(ShipSkinDesignLinkValidator()) 37 38 def OnSessionChanged(self, _isRemote, _sess, change): 39 if 'charid' in change: 40 self._clear_cache() 41 42 def _clear_cache(self): 43 self._designs_cache = {} 44 self._editor_config_cache = {} 45 self._owned_design_ids_cache = None 46 self._cached_saved_design_capacity = None 47 48 def get_shared_design(self, character_id, design_id, force_refresh = False): 49 if design_id in self._designs_cache and not force_refresh: 50 design_hex = self._designs_cache[design_id] 51 else: 52 design_hex, editor_configs, error = self._request_messenger.get_shared_design_request(design_id, character_id) 53 if error is not None: 54 return (None, error) 55 self._designs_cache[design_id] = design_hex 56 self._editor_config_cache[design_id] = editor_configs 57 return (self._get_design_data(design_hex, force_refresh), None) 58 59 def get_saved_design(self, design_id, force_refresh = False): 60 if design_id in self._designs_cache and not force_refresh: 61 design_hex = self._designs_cache[design_id] 62 else: 63 design_hex, editor_configs = self._request_messenger.get_design_request(design_id) 64 self._designs_cache[design_id] = design_hex 65 self._editor_config_cache[design_id] = editor_configs 66 return self._get_design_data(design_hex, force_refresh) 67 68 def get_all_owned_designs(self, force_refresh = False): 69 ComponentsDataLoader.get_components_data() 70 if self._owned_design_ids_cache is None or force_refresh: 71 owned_design_hexes = self._get_owned_designs() 72 self._get_designs_data_parallel(owned_design_hexes, force_refresh) 73 else: 74 owned_design_hexes = self._owned_design_ids_cache 75 return {design_id:self._get_design_data(design_hex, False) for design_id, design_hex in owned_design_hexes.iteritems()} 76 77 def is_design_owned(self, design_id, force_refresh = False): 78 if self._owned_design_ids_cache is None or force_refresh: 79 self._get_owned_designs() 80 if self._owned_design_ids_cache is not None: 81 return design_id in self._owned_design_ids_cache 82 return False 83 84 def _get_owned_designs(self): 85 owned_design_hexes, owned_editor_configs = self._request_messenger.get_all_saved_designs_request() 86 self._owned_design_ids_cache = owned_design_hexes 87 for k, v in owned_design_hexes.iteritems(): 88 self._designs_cache[k] = v 89 90 for k, v in owned_editor_configs.iteritems(): 91 self._editor_config_cache[k] = v 92 93 return owned_design_hexes 94 95 def _get_designs_data_parallel(self, design_hexes, force_refresh = False): 96 parallel_calls = [] 97 for design_hex in design_hexes.itervalues(): 98 parallel_calls.append((self._get_design_data, (design_hex, force_refresh))) 99 100 if len(parallel_calls) > 0: 101 return uthread.parallel(parallel_calls) 102 return [] 103 104 def save_design(self, design, editor_configs, design_id = None): 105 if design is not None: 106 design.clean_up_skin() 107 if design_id is None or not self.is_design_owned(design_id): 108 logger.info('SKIN DESIGNS - saving new design:\n%s' % design) 109 design_id, design_hex, saved_editor_configs, error = self._request_messenger.save_design_request(design, editor_configs) 110 if error is not None: 111 return (None, error) 112 logger.info('SKIN DESIGNS - new design saved with id %s, hex %s, configs %s' % (design_id, design_hex, saved_editor_configs)) 113 design_data = SkinDesign.copy_from_other(design, new_creator_character_id=session.charid, should_copy_components_to_use=True) 114 design_data.design_hex = design_hex 115 get_ship_skin_data_svc().cache_skin_data(design_hex, design_data) 116 self._designs_cache[design_id] = design_hex 117 self._editor_config_cache[design_id] = saved_editor_configs 118 else: 119 logger.info('SKIN DESIGNS - updating existing design %s with %s, configs %s' % (design_id, design, editor_configs)) 120 design_hex, saved_editor_configs, error = self._request_messenger.update_design_request(design, editor_configs, design_id) 121 if error is not None: 122 return (None, error) 123 self._designs_cache[design_id] = design_hex 124 self._editor_config_cache[design_id] = saved_editor_configs 125 design_data = SkinDesign.copy_from_other(design, new_creator_character_id=session.charid, should_copy_components_to_use=True) 126 design_data.design_hex = design_hex 127 get_ship_skin_data_svc().cache_skin_data(design_hex, design_data) 128 if self._owned_design_ids_cache is not None: 129 self._owned_design_ids_cache[design_id] = design_hex 130 ship_skin_signals.on_skin_design_saved(design_id) 131 return (design_id, None) 132 133 def is_saved(self, design): 134 if not design.saved_skin_design_id: 135 return False 136 saved_design = self.get_saved_design(design.saved_skin_design_id) 137 return saved_design and saved_design == design 138 139 def delete_design(self, design_id): 140 if design_id is not None: 141 self._request_messenger.delete_design_request(design_id) 142 if design_id in self._designs_cache: 143 get_ship_skin_data_svc().clear_skin_data(self._designs_cache[design_id]) 144 self._designs_cache.pop(design_id) 145 if design_id in self._editor_config_cache: 146 self._editor_config_cache.pop(design_id) 147 if design_id in self._owned_design_ids_cache: 148 self._owned_design_ids_cache.pop(design_id) 149 ship_skin_signals.on_skin_design_deleted(design_id) 150 151 def get_design_editor_configs(self, design_id): 152 return self._editor_config_cache.get(design_id, None) 153 154 def get_saved_designs_capacity(self, force_refresh = False): 155 if self._cached_saved_design_capacity is None or force_refresh: 156 self._cached_saved_design_capacity = self._request_messenger.get_saved_designs_capacity_request() 157 return self._cached_saved_design_capacity 158 159 def _get_design_data(self, design_hex, force_refresh = False): 160 try: 161 return get_ship_skin_data_svc().get_skin_data(design_hex, force_refresh) 162 except (GenericException, TimeoutException): 163 message_player(GetByLabel('UI/Common/CannotConnectToServer')) 164 return None 165 166 def admin_get_skin_design_cached_hex(self, saved_design_id): 167 return self._designs_cache.get(saved_design_id, None)