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

goal.py (13325B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\corporation\client\goals\goal.py
      2 import gametime
      3 from carbon.common.script.util.format import DateToBlue
      4 import eveformat
      5 from goals.client.contributionMethods import get_contribution_method
      6 from goals.common import goalConst
      7 from goals.common.goalConst import GoalState, ContributionMethodTypes
      8 from corporation.client.goals.goalsUtil import CanAuthorGoals
      9 from jobboard.client.util import get_closest_solarsystem_in_locations_from
     10 from localization.formatters import FormatNumeric
     11 from logging import getLogger
     12 from .goalDragData import GoalDragData
     13 from .goalReward import CorpGoalReward
     14 from .goalSignals import on_goal_reward_earned, on_goal_reward_redeemed, on_closest_solar_system_changed
     15 logger = getLogger('corporation_goals')
     16 
     17 class CorporationGoal(object):
     18     __notifyevents__ = ['OnAutopilotUpdated', 'OnSessionChanged']
     19 
     20     def __init__(self, goal_id):
     21         self.goal_id = goal_id
     22         self.created = None
     23         self.name = None
     24         self.description = None
     25         self.desired_progress = None
     26         self.current_progress = None
     27         self.state = GoalState.UNSPECIFIED
     28         self.creator = None
     29         self._assigner_type = None
     30         self._assigner_id = None
     31         self._assignee_type = None
     32         self._assignee_id = None
     33         self.contribution_method = None
     34         self._career_path = None
     35         self._my_progress = 0
     36         self._finish_time = None
     37         self._due_time = None
     38         self._ui_annotations = None
     39         self._reward = None
     40         self.all_contributor_summaries = None
     41         self.all_contributor_summaries_fetch_time = None
     42         self._has_set_data = False
     43         self._has_fetched_contribution = False
     44         self._participation_limit = None
     45         self._multiplier = None
     46         self._coverage_limit = None
     47         self._closest_solar_system_id = None
     48         sm.RegisterNotify(self)
     49 
     50     def __del__(self):
     51         sm.UnregisterNotify(self)
     52 
     53     def OnAutopilotUpdated(self, *args, **kwargs):
     54         if self._closest_solar_system_id:
     55             self._update_closest_location()
     56 
     57     def OnSessionChanged(self, is_remote, session, change):
     58         if not self._closest_solar_system_id:
     59             return
     60         if 'locationid' in change:
     61             self._update_closest_location()
     62 
     63     def set_data(self, data):
     64         self.goal_id = data.get('goal_id', None)
     65         self.created = data.get('created', None)
     66         self.name = data.get('name', None)
     67         self.description = data.get('description', None)
     68         self.desired_progress = data.get('desired_progress', 0)
     69         self.current_progress = data.get('current_progress', 0)
     70         self.state = data.get('state', GoalState.ACTIVE)
     71         self.creator = data.get('creator', None)
     72         self._assigner_type = data.get('assigner_organization_type', None)
     73         self._assigner_id = data.get('assigner_organization_id', None)
     74         self._assignee_type = data.get('assignee_organization_type', None)
     75         self._assignee_id = data.get('assignee_organization_id', None)
     76         self.contribution_method = get_contribution_method(data.get('method_id', None), data.get('contribution_fields', None))
     77         self._career_path = data.get('career_path', None)
     78         self._finish_time = data.get('finish_time', None)
     79         self._due_time = data.get('due_time', None)
     80         self._ui_annotations = data.get('ui_annotations', {})
     81         self._participation_limit = data.get('participation_limit', None)
     82         self._coverage_limit = data.get('coverage_limit', None)
     83         self._multiplier = data.get('multiplier', None)
     84         reward_info = data.get('reward', None)
     85         if reward_info:
     86             self._reward = CorpGoalReward(asset_id=reward_info['asset_id'], amount_per_unit=reward_info['amount_per_unit'])
     87         else:
     88             self._reward = None
     89         self._has_set_data = True
     90 
     91     @property
     92     def expiration_time(self):
     93         return DateToBlue(self.get_due_datetime())
     94 
     95     def set_contribution(self, progress, rewards_unclaimed):
     96         self._my_progress = progress
     97         if self._reward:
     98             self._reward.earned_capacity = progress
     99             self._reward.unclaimed_capacity = rewards_unclaimed
    100         self._has_fetched_contribution = True
    101 
    102     def has_fetched_contribution(self):
    103         return self._has_fetched_contribution
    104 
    105     def has_data(self):
    106         return self._has_set_data
    107 
    108     def get_id(self):
    109         return self.goal_id
    110 
    111     def get_creation_datetime(self):
    112         return self.created
    113 
    114     def get_completed_datetime(self):
    115         if self._finish_time:
    116             return self._finish_time
    117 
    118     def get_due_datetime(self):
    119         if self._due_time:
    120             return self._due_time
    121 
    122     def get_cloned_project_duration(self):
    123         if not self._due_time:
    124             return None
    125         duration = self.get_due_datetime() - self.get_creation_datetime()
    126         return duration
    127 
    128     def get_end_time(self):
    129         if self._due_time:
    130             return self.expiration_time
    131         if self._finish_time:
    132             return DateToBlue(self.get_completed_datetime())
    133 
    134     def get_participation_limit(self):
    135         return self._participation_limit
    136 
    137     def get_multiplier(self):
    138         return self._multiplier
    139 
    140     def get_multiplier_percentage(self):
    141         if self._multiplier:
    142             return eveformat.number(self._multiplier * 100, 0)
    143 
    144     def get_coverage_limit(self):
    145         return self._coverage_limit
    146 
    147     def get_name(self):
    148         return self.name
    149 
    150     def set_name(self, new_name):
    151         self.name = new_name
    152 
    153     def get_description(self):
    154         return self.description
    155 
    156     def set_description(self, new_description):
    157         self.description = new_description
    158 
    159     def get_desired_progress(self):
    160         return self.desired_progress
    161 
    162     def get_desired_progress_with_unit(self):
    163         return self._get_value_with_unit(self.desired_progress)
    164 
    165     def _get_value_with_unit(self, progress):
    166         return u'{} {}'.format(FormatNumeric(progress, useGrouping=True), self.get_unit()).strip()
    167 
    168     def get_current_progress(self):
    169         return self.current_progress
    170 
    171     def get_current_progress_with_unit(self):
    172         return self._get_value_with_unit(self.current_progress)
    173 
    174     def update_my_progress(self, added_progress):
    175         state_changed = False
    176         if self._my_progress == 0 and added_progress > 0:
    177             state_changed = True
    178         self._my_progress += added_progress
    179         if self._reward:
    180             had_unclaimed = self.has_unclaimed_reward()
    181             self._reward.earned_capacity = self._my_progress
    182             self._reward.unclaimed_capacity += added_progress
    183             on_goal_reward_earned(self.goal_id)
    184             if not state_changed:
    185                 state_changed = had_unclaimed != self.has_unclaimed_reward()
    186         return state_changed
    187 
    188     def get_my_progress(self):
    189         return self._my_progress
    190 
    191     def has_personal_progress(self):
    192         if self.contribution_method.method_id == ContributionMethodTypes.MANUAL:
    193             return CanAuthorGoals()
    194         return True
    195 
    196     def get_remaining_progress(self):
    197         return max(0, self.get_desired_progress() - self.get_current_progress())
    198 
    199     def get_my_remaining_progress(self):
    200         if self.get_participation_limit():
    201             return min(self.get_remaining_progress(), max(0, self.get_participation_limit() - self.get_my_progress()))
    202         return self.get_remaining_progress()
    203 
    204     def get_my_total_progress(self):
    205         if self.get_participation_limit():
    206             return self.get_participation_limit()
    207         return self.get_desired_progress()
    208 
    209     def get_contribution_method(self):
    210         return self.contribution_method
    211 
    212     def set_current_progress(self, progress):
    213         if self.current_progress is not None and self.current_progress > progress:
    214             return
    215         self.current_progress = progress
    216         logger.info('Goal::set_current_progress: goal_id=%s, progress=%s', self.goal_id, progress)
    217 
    218     def get_progress_ratio(self):
    219         return float(self.get_current_progress()) / self.get_desired_progress()
    220 
    221     def get_my_progress_ratio(self):
    222         if self.get_participation_limit():
    223             return float(self.get_my_progress()) / self.get_participation_limit()
    224         return float(self.get_my_progress()) / self.get_desired_progress()
    225 
    226     def get_state(self):
    227         return self.state
    228 
    229     def get_state_label(self):
    230         return goalConst.state_labels[self.state]
    231 
    232     def get_ui_annotation(self, key):
    233         return self._ui_annotations.get(key, None)
    234 
    235     def complete(self):
    236         self.state = GoalState.COMPLETED
    237         self._finish_time = gametime.now()
    238 
    239     def close(self):
    240         self.state = GoalState.CLOSED
    241         self._finish_time = gametime.now()
    242 
    243     def expire(self):
    244         self.state = GoalState.EXPIRED
    245         self._finish_time = gametime.now()
    246 
    247     def is_active(self):
    248         return self.state == GoalState.ACTIVE
    249 
    250     def is_completed(self):
    251         return self.state == GoalState.COMPLETED
    252 
    253     def is_closed(self):
    254         return self.state == GoalState.CLOSED
    255 
    256     def is_expired(self):
    257         return self.state == GoalState.EXPIRED
    258 
    259     def get_assigner_organization(self):
    260         return (self._assigner_type, self._assigner_id)
    261 
    262     def get_assignee_organization(self):
    263         return (self._assignee_type, self._assignee_id)
    264 
    265     def get_creator(self):
    266         return self.creator
    267 
    268     def get_creator_name(self):
    269         return cfg.eveowners.Get(self.creator).ownerName
    270 
    271     def get_closest_solar_system_id(self):
    272         if self._closest_solar_system_id is None:
    273             self._update_closest_location()
    274         return self._closest_solar_system_id
    275 
    276     def get_location_ids(self):
    277         location_ids = self.contribution_method.solar_system
    278         if not location_ids:
    279             return []
    280         if not isinstance(location_ids, list):
    281             return [location_ids]
    282         return location_ids
    283 
    284     def get_location_id(self):
    285         location = self.contribution_method.location
    286         if location is None or isinstance(location, list):
    287             return
    288         return location
    289 
    290     def get_unit(self):
    291         return self.contribution_method.unit or ''
    292 
    293     def is_manual(self):
    294         return self.contribution_method.method_id == ContributionMethodTypes.MANUAL
    295 
    296     def is_ship_insurance(self):
    297         return self.contribution_method.method_id == ContributionMethodTypes.SHIP_INSURANCE
    298 
    299     @property
    300     def career_path(self):
    301         return self._career_path
    302 
    303     def get_drag_data(self):
    304         return [GoalDragData(self)]
    305 
    306     def has_rewards(self):
    307         if not self._reward:
    308             return False
    309         return bool(self._reward.amount_per_unit)
    310 
    311     def has_reached_participation_limit(self):
    312         if self._participation_limit is None:
    313             return False
    314         return self.get_participation_limit() <= self.get_my_progress()
    315 
    316     def get_total_isk(self):
    317         if not self._reward:
    318             return 0
    319         return self._reward.amount_per_unit * self.get_desired_progress()
    320 
    321     def get_total_remaining_isk(self):
    322         if not self._reward:
    323             return 0
    324         return self._reward.amount_per_unit * self.get_remaining_progress()
    325 
    326     def get_my_remaining_isk(self):
    327         if not self._reward:
    328             return 0
    329         if self.get_participation_limit():
    330             return self._reward.amount_per_unit * self.get_my_remaining_progress()
    331         return self.get_total_remaining_isk()
    332 
    333     def get_isk_per_contribution(self):
    334         if not self._reward:
    335             return 0
    336         return self._reward.amount_per_unit
    337 
    338     def get_earned_amount(self):
    339         if not self._reward:
    340             return 0
    341         return self._reward.earned_amount
    342 
    343     def get_claimed_amount(self):
    344         if not self._reward:
    345             return 0
    346         return self._reward.redeemed_amount
    347 
    348     def get_unclaimed_amount(self):
    349         if not self._reward:
    350             return 0
    351         return self._reward.claimable_amount
    352 
    353     def has_unclaimed_reward(self):
    354         return bool(self._reward and self._reward.unclaimed_capacity)
    355 
    356     def get_claimable_reward(self):
    357         if not self.has_unclaimed_reward():
    358             return None
    359         return self._reward
    360 
    361     def update_redeemed_capacity(self, capacity):
    362         if self._reward:
    363             had_unclaimed = self.has_unclaimed_reward()
    364             self._reward.unclaimed_capacity = max(0, self._reward.unclaimed_capacity - capacity)
    365             on_goal_reward_redeemed(self.goal_id, state_changed=had_unclaimed != self.has_unclaimed_reward())
    366 
    367     def _update_closest_location(self):
    368         solar_system = self.contribution_method.solar_system
    369         if solar_system is not None and isinstance(solar_system, list):
    370             closest_solar_system_id = get_closest_solarsystem_in_locations_from(session.solarsystemid2, set(solar_system), sm.GetService('map'), sm.GetService('clientPathfinderService'))[0]
    371         else:
    372             closest_solar_system_id = solar_system
    373         if self._closest_solar_system_id != closest_solar_system_id:
    374             self._closest_solar_system_id = closest_solar_system_id
    375             on_closest_solar_system_changed(self.goal_id, self._closest_solar_system_id)