NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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()