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

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)