structureCosmeticStatesController.py (5958B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\cosmetics\client\structureCosmeticStatesController.py 2 from featuremanagement.client.flag import flag_bool 3 import uthread2 4 import log 5 from cosmetics.client.structures.fittingSignals import on_structure_cosmetic_state_changed 6 from cosmetics.common.structures.const import FLAG_PAINTWORK_SKINR_KILLSWITCH, FLAG_PAINTWORK_SKINR_KILLSWITCH_DEFAULT 7 from cosmetics.common.structures.fitting import StructurePaintwork 8 from cosmetics.client.messengers.cosmetics.structures.noticeMessenger import NoticeMessenger 9 from cosmetics.client.messengers.cosmetics.structures.requestMessenger import PublicRequestsMessenger 10 UPDATE_TIMEOUT_SECONDS = 1 11 12 class StructureCosmeticStatesController(object): 13 14 def __init__(self, public_gateway): 15 self._paintwork_cache = {} 16 self._license_id_cache = {} 17 self._update_thread = None 18 self._last_solar_system_update_received = None 19 self._notice_messenger = NoticeMessenger(public_gateway.publicGateway) 20 self._notice_messenger.on_structure_cosmetic_state_changed_internal.connect(self._on_structure_cosmetic_state_changed) 21 self._notice_messenger.on_structure_cosmetic_state_solar_system_update_internal.connect(self._on_solar_system_update) 22 self._request_messenger = PublicRequestsMessenger(public_gateway.publicGateway) 23 self._killswitch = FLAG_PAINTWORK_SKINR_KILLSWITCH_DEFAULT 24 flag_bool(key=FLAG_PAINTWORK_SKINR_KILLSWITCH, default_value=FLAG_PAINTWORK_SKINR_KILLSWITCH_DEFAULT, callback=self._on_killswitch_changed) 25 26 def shutdown(self): 27 self._cancel_update() 28 self._notice_messenger.on_structure_cosmetic_state_changed_internal.disconnect(self._on_structure_cosmetic_state_changed) 29 self._notice_messenger.on_structure_cosmetic_state_solar_system_update_internal.disconnect(self._on_solar_system_update) 30 31 def _flush_cache(self, structure_id = None): 32 if structure_id: 33 if structure_id in self._paintwork_cache: 34 self._paintwork_cache.pop(structure_id) 35 if structure_id in self._license_id_cache: 36 self._license_id_cache.pop(structure_id) 37 else: 38 self._paintwork_cache = {} 39 self._license_id_cache = {} 40 41 def get_cached_cosmetic_state(self, structure_id): 42 return self._paintwork_cache.get(structure_id, None) 43 44 def get_cosmetic_state(self, structure_id, solar_system_id, force_refresh = False): 45 if self._killswitch: 46 return None 47 else: 48 if force_refresh or structure_id not in self._paintwork_cache: 49 license_id, paintwork = self._request_messenger.get_request(structure_id, solar_system_id) 50 if paintwork: 51 self._paintwork_cache[structure_id] = paintwork 52 self._license_id_cache[structure_id] = license_id 53 if structure_id in self._paintwork_cache: 54 return self._paintwork_cache[structure_id] 55 return None 56 57 def get_cosmetic_license_id(self, structure_id, solar_system_id, force_refresh = False): 58 if self._killswitch: 59 return None 60 if force_refresh or structure_id not in self._license_id_cache: 61 license_id, _ = self._request_messenger.get_request(structure_id, solar_system_id) 62 self._license_id_cache[structure_id] = license_id 63 return self._license_id_cache[structure_id] 64 65 def _get_all_in_solar_system(self): 66 if self._killswitch: 67 return None 68 log.LogInfo('Structure Cosmetic States: manually fetching all structure cosmetic states in solar system %s' % session.solarsystemid2) 69 paintworks = self._request_messenger.get_all_in_solar_system_request() 70 if paintworks: 71 for structure_id, paintwork in paintworks.iteritems(): 72 self._cache_cosmetic_state(structure_id, paintwork) 73 74 def _on_structure_cosmetic_state_changed(self, structure_id, paintwork): 75 if self._killswitch: 76 return 77 self._cache_cosmetic_state(structure_id, paintwork) 78 79 def _on_solar_system_update(self, paintworks, solar_system_id): 80 if self._killswitch: 81 return 82 log.LogInfo('Structure Cosmetic States: solar system %s update received, cancelling manual update thread' % session.solarsystemid2) 83 self._last_solar_system_update_received = solar_system_id 84 self._cancel_update() 85 for structure_id, paintwork in paintworks.iteritems(): 86 self._cache_cosmetic_state(structure_id, paintwork) 87 88 def _cache_cosmetic_state(self, structure_id, paintwork): 89 self._paintwork_cache[structure_id] = paintwork 90 on_structure_cosmetic_state_changed(structure_id, paintwork) 91 92 def _on_killswitch_changed(self, evaluate_flag): 93 self._killswitch = evaluate_flag() 94 for structure_id in self._paintwork_cache.iterkeys(): 95 on_structure_cosmetic_state_changed(structure_id, StructurePaintwork()) 96 97 self._flush_cache() 98 99 def start_update(self, solar_system_id): 100 self._cancel_update() 101 if solar_system_id != self._last_solar_system_update_received: 102 self._last_solar_system_update_received = None 103 log.LogInfo('Structure Cosmetic States: beginning countdown for manual update for %s' % session.solarsystemid2) 104 self._update_thread = uthread2.StartTasklet(self._structure_cosmetic_state_update_func) 105 else: 106 log.LogInfo('Structure Cosmetic States: skipping manual update for %s, notice was already received' % session.solarsystemid2) 107 108 def _cancel_update(self): 109 if self._update_thread: 110 self._update_thread.kill() 111 self._update_thread = None 112 113 def _structure_cosmetic_state_update_func(self): 114 uthread2.SleepSim(UPDATE_TIMEOUT_SECONDS) 115 self._get_all_in_solar_system()