shipSkinStateController.py (5929B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\cosmetics\client\shipSkinStateController.py 2 import uthread2 3 from carbon.client.script.environment.AudioUtil import PlaySound 4 from carbonui import uiconst 5 from cosmetics.client.messengers.cosmetics.ship.shipSkinStateNoticeMessenger import ShipSkinStateNoticeMessenger 6 from cosmetics.client.messengers.cosmetics.ship.shipSkinStateRequestMessenger import ShipSkinStateRequestsMessenger 7 from cosmetics.client.ships.skins.live_data.ship_skin_state import ShipSkinState 8 from cosmetics.common.ships.skins.static_data.component import ComponentsDataLoader 9 from cosmetics.common.ships.skins.static_data.skin_type import ShipSkinType 10 from cosmetics.client.ships.ship_skin_signals import * 11 from cosmetics.client.ships.ship_skin_svc_signals import * 12 from logging import getLogger 13 logger = getLogger(__name__) 14 _UPDATE_TIMEOUT_SECONDS = 3 15 16 class ShipSkinStateController(object): 17 18 def __init__(self, public_gateway): 19 self._cache = {} 20 self._cached_waiting_list = {} 21 self._notice_messenger = ShipSkinStateNoticeMessenger(public_gateway) 22 self._request_messenger = ShipSkinStateRequestsMessenger(public_gateway) 23 on_skin_state_set_internal.connect(self._on_skin_state_set) 24 on_skin_state_set_all_in_bubble_internal.connect(self._on_skin_state_set_all_in_bubble) 25 26 def shutdown(self): 27 on_skin_state_set_internal.disconnect(self._on_skin_state_set) 28 on_skin_state_set_all_in_bubble_internal.disconnect(self._on_skin_state_set_all_in_bubble) 29 30 def on_character_changed(self): 31 self.flush_cache() 32 ComponentsDataLoader.load_components_data() 33 34 def flush_cache(self): 35 self._cache = {} 36 self._cached_waiting_list = {} 37 38 def _cache_state(self, skin_state): 39 ship_id = skin_state.ship_instance_id 40 old_skin_state = self._cache.get(ship_id, None) 41 if ship_id in self._cached_waiting_list: 42 self._cancel_wait(ship_id) 43 if old_skin_state != skin_state: 44 self._cache[ship_id] = skin_state 45 logger.info('SKIN STATES - caching skin state %s' % skin_state) 46 self._notify_of_skin_change(ship_id, skin_state, old_skin_state) 47 else: 48 on_skin_state_reapplied(ship_id) 49 50 def _notify_of_skin_change(self, ship_id, skin_state, old_skin_state): 51 on_skin_state_set(ship_id, skin_state) 52 current_ship_id = session.shipid 53 if current_ship_id and current_ship_id == ship_id: 54 if skin_state.skin_type == ShipSkinType.FIRST_PARTY_SKIN: 55 skin_id = skin_state.skin_data.skin_id 56 elif skin_state.skin_type == ShipSkinType.NO_SKIN: 57 skin_id = 0 58 elif skin_state.skin_type == ShipSkinType.THIRD_PARTY_SKIN: 59 skin_id = 0 60 else: 61 skin_id = 0 62 if old_skin_state is not None: 63 PlaySound(uiconst.SOUND_ADD_OR_USE) 64 sm.ScatterEvent('OnCurrentShipSkinChange', ship_id, skin_id) 65 66 def get_cached_skin_state(self, ship_instance_id, character_id): 67 cached_state = self._cache.get(ship_instance_id, None) 68 logger.info('SKIN STATES - requested cached state for %s, got %s' % (ship_instance_id, cached_state)) 69 if not cached_state: 70 self._wait_for_notice(ship_instance_id, character_id) 71 return cached_state 72 73 def get_skin_state(self, ship_instance_id, character_id, force_refresh = False): 74 if ship_instance_id not in self._cache or force_refresh: 75 skin_state = self._request_messenger.get_request(ship_instance_id) 76 if skin_state is None: 77 logger.error('Failed to get SKIN state for ship %s, character %s', ship_instance_id, character_id) 78 return 79 self._cache_state(skin_state) 80 return self._cache[ship_instance_id] 81 82 def get_all_skin_states_in_bubble(self): 83 skin_states = self._request_messenger.get_all_in_bubble_request() 84 result = {} 85 for skin_state in skin_states: 86 self._cache_state(skin_state) 87 result[skin_state.ship_instance_id] = skin_state 88 89 return result 90 91 def _on_skin_state_set(self, skin_state): 92 self._cache_state(skin_state) 93 94 def _on_skin_state_set_all_in_bubble(self, skin_states): 95 for skin_state in skin_states: 96 self._cache_state(skin_state) 97 98 def _wait_for_notice(self, ship_instance_id, character_id): 99 if ship_instance_id in self._cached_waiting_list: 100 char_id, _ = self._cached_waiting_list[ship_instance_id] 101 if character_id != char_id: 102 self._cancel_wait(ship_instance_id) 103 else: 104 return 105 self._cached_waiting_list[ship_instance_id] = (character_id, uthread2.StartTasklet(self._wait_thread, ship_instance_id, character_id)) 106 107 def _wait_thread(self, ship_instance_id, character_id): 108 logger.info('SKIN STATES - Starting wait for skin state for ship id %s' % ship_instance_id) 109 uthread2.SleepSim(_UPDATE_TIMEOUT_SECONDS) 110 logger.info('SKIN STATES - Waiting is over, forcing request for skin state for ship id %s' % ship_instance_id) 111 self._end_wait(ship_instance_id) 112 self.get_skin_state(ship_instance_id, character_id, force_refresh=True) 113 114 def _cancel_wait(self, ship_instance_id): 115 if ship_instance_id in self._cached_waiting_list: 116 logger.info('SKIN STATES - Cancelled wait for skin state for ship id %s' % ship_instance_id) 117 self._end_wait(ship_instance_id) 118 119 def _end_wait(self, ship_instance_id): 120 if ship_instance_id in self._cached_waiting_list: 121 char_id, thread = self._cached_waiting_list[ship_instance_id] 122 if thread is not None: 123 thread.kill() 124 self._cached_waiting_list.pop(ship_instance_id)