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)