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

panel_controller.py (6573B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\theatersOfWar\campaigns\panel_controller.py
      2 import logging
      3 from campaigns.client.api import get_campaigns_repository_v1
      4 from campaigns.client.v1.data_model.campaign import CampaignID
      5 from campaigns.client.errors import CampaignRequestError
      6 from campaigns.client.v1.signals import on_objective_contributed_notice
      7 from carbon.common.script.util.mathCommon import FloatCloseEnough
      8 from clientsettings.setting import CharSettingNumeric, CharSettingUUID
      9 from campaigns.client.ui_controllers.campaign_controller import CampaignController
     10 from eve.client.script.ui.shared.theatersOfWar.campaigns.campaign_sets import camapaign_sets, CURRENT_CAMPAIGN_SET
     11 from eveexceptions import ExceptionEater
     12 from jobboard.client import get_job_board_service, ProviderType
     13 from localization.formatters.timeIntervalFormatters import GetByLabel
     14 from locks import TempLock
     15 from signals import Signal
     16 selected_campaign_id_setting = CharSettingUUID('selected_campaign_id', None)
     17 logger = logging.getLogger(__name__)
     18 
     19 class CampaignPanelController(object):
     20 
     21     def __init__(self):
     22         self._repository = get_campaigns_repository_v1()
     23         self._campaigns_by_id = None
     24         selected_campaign_uuid = selected_campaign_id_setting.get()
     25         self._selected_campaign_id = CampaignID(selected_campaign_uuid) if selected_campaign_uuid else None
     26         self._set_page_id_from_setting()
     27         self.on_campaign_selected = Signal(signalName='on_campaign_selected')
     28         self.on_contribution_completed_objective = Signal(signalName='on_contribution_completed_objective')
     29         self.connect_signals()
     30 
     31     def connect_signals(self):
     32         on_objective_contributed_notice.connect(self.on_objective_contributed)
     33 
     34     def disconnect_signals(self):
     35         on_objective_contributed_notice.disconnect(self.on_objective_contributed)
     36 
     37     def _set_page_id_from_setting(self):
     38         self._selected_campaign_page_id = self._get_page_setting_for_selected_campaign().get()
     39 
     40     def _get_page_setting_for_selected_campaign(self):
     41         selected_campaign_id = self._selected_campaign_id.uuid if self._selected_campaign_id else None
     42         settings_key = 'selected_campaign_id_%s' % selected_campaign_id
     43         return CharSettingNumeric(settings_key, 0)
     44 
     45     @property
     46     def campaigns_by_id(self):
     47         if self._campaigns_by_id is not None:
     48             return self._campaigns_by_id
     49         with TempLock('FetchingCampaignInfo'):
     50             if self._campaigns_by_id is not None:
     51                 return self._campaigns_by_id
     52             campaigns_by_id = {}
     53             current_campaigns_by_id = self._repository.get_data_for_all_current_campaigns()
     54             for c_id, campaign in current_campaigns_by_id.iteritems():
     55                 controller = CampaignController(campaign, self._repository)
     56                 campaigns_by_id[c_id] = controller
     57 
     58             self._campaigns_by_id = campaigns_by_id
     59             return campaigns_by_id
     60 
     61     def get_controller_for_campaign_id(self, campaign_id):
     62         if campaign_id in self._campaigns_by_id:
     63             return self._campaigns_by_id[campaign_id]
     64         campaign = self._repository.get_campaign(campaign_id)
     65         controller = CampaignController(campaign, self._repository)
     66         return controller
     67 
     68     @property
     69     def campaigns_by_id_safe(self):
     70         try:
     71             return self.campaigns_by_id
     72         except CampaignRequestError:
     73             logger.exception('Failed to fetch campaigns')
     74             return {}
     75 
     76     @property
     77     def selected_campaign_id(self):
     78         return self._selected_campaign_id
     79 
     80     @selected_campaign_id.setter
     81     def selected_campaign_id(self, campaign_id):
     82         self._selected_campaign_id = campaign_id
     83         self._set_page_id_from_setting()
     84         selected_campaign_id_setting.set(campaign_id.uuid if campaign_id else None)
     85         self.on_campaign_selected(campaign_id)
     86 
     87     def get_campaigns(self):
     88         current_set = CURRENT_CAMPAIGN_SET
     89         ret = []
     90         for campaign in self.campaigns_by_id.itervalues():
     91             if campaign.campaign_set_name != current_set:
     92                 continue
     93             if campaign.is_cancelled:
     94                 continue
     95             ret.append(campaign)
     96 
     97         ret.sort(key=lambda x: x.ui_idx)
     98         return ret
     99 
    100     @property
    101     def selected_campaign_controller(self):
    102         return self.campaigns_by_id.get(self._selected_campaign_id, None)
    103 
    104     def get_num_days_left(self):
    105         if not self.campaigns_by_id:
    106             return None
    107         first_controller = self.campaigns_by_id.values()[0]
    108         return first_controller.num_days_left
    109 
    110     @property
    111     def selected_campaign_page_id(self):
    112         return self._selected_campaign_page_id
    113 
    114     @selected_campaign_page_id.setter
    115     def selected_campaign_page_id(self, value):
    116         self._selected_campaign_page_id = value
    117         page_setting = self._get_page_setting_for_selected_campaign()
    118         page_setting.set(value)
    119 
    120     def get_campaign_set_info(self):
    121         campaign_set_info = camapaign_sets[CURRENT_CAMPAIGN_SET]
    122         return campaign_set_info
    123 
    124     @property
    125     def campaign_landing_page_title(self):
    126         campaign_set_info = self.get_campaign_set_info()
    127         return GetByLabel(campaign_set_info.landing_page_title)
    128 
    129     @property
    130     def campaign_landing_page_bg_path(self):
    131         campaign_set_info = self.get_campaign_set_info()
    132         return campaign_set_info.landing_page_bg_path
    133 
    134     def on_objective_contributed(self, objective_id, total_participant_progress):
    135         job = self._get_job(objective_id)
    136         is_completed = job.is_completed or FloatCloseEnough(job.total_progress_percentage, 1)
    137         if not is_completed:
    138             return
    139         campaign_controller = self.get_controller_for_campaign_id(job.campaign_id)
    140         campaign_controller.clear_campaign_stats_cache()
    141         self.on_contribution_completed_objective(objective_id, job.campaign_id)
    142 
    143     def _get_job(self, objective_id):
    144         provider = get_job_board_service().get_provider(ProviderType.CAMPAIGNS)
    145         job = provider.get_job(provider.get_job_id(objective_id.uuid))
    146         return job
    147 
    148     def handle_destruction(self):
    149         self._perform_cleanup()
    150 
    151     def __del__(self):
    152         self._perform_cleanup()
    153 
    154     def _perform_cleanup(self):
    155         with ExceptionEater('cleaning up campaign panel controller'):
    156             self.disconnect_signals()
    157             self.on_campaign_selected.clear()
    158             self.on_contribution_completed_objective.clear()