achievement.py (4937B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\achievement_system\client\model\state\achievement.py 2 from datetime import datetime 3 from achievement_system.client.model.state.achievement_reached_milestone import AchievementReachedMilestone 4 from eveProto.generated.eve_public.achievement.api.requests_pb2 import GetResponse as ProtoAchievementStateAttributes 5 from achievement_system.client.model.state.checklist import Checklist 6 from google.protobuf.timestamp_pb2 import Timestamp 7 if False: 8 from typing import List 9 10 class CachedAchievementStateAttributes: 11 12 def __init__(self, achievement_state, expiration): 13 self._achievement_state = achievement_state 14 self._expiration = expiration 15 16 @property 17 def achievement_state(self): 18 return self._achievement_state 19 20 @property 21 def expiration(self): 22 return self._expiration 23 24 @property 25 def is_expired(self): 26 return datetime.now() > self._expiration 27 28 29 class AchievementStateAttributes: 30 31 def __init__(self, completed_date, checklist, progress, reached_milestones): 32 self._completed_date = completed_date 33 self._not_completed = completed_date is None 34 self._checklist = checklist 35 self._progress = progress 36 self._reached_milestones = reached_milestones 37 38 @property 39 def completed_date(self): 40 return self._completed_date 41 42 @property 43 def not_completed(self): 44 return self._not_completed 45 46 @property 47 def checklist(self): 48 return self._checklist 49 50 @property 51 def progress(self): 52 return self._progress 53 54 @property 55 def reached_milestones(self): 56 return self._reached_milestones 57 58 def is_milestone_reached(self, milestone_id): 59 for reached_milestone in self._reached_milestones: 60 if reached_milestone.identifier == milestone_id: 61 return True 62 63 return False 64 65 @classmethod 66 def from_proto(cls, payload): 67 completed_date = datetime.fromtimestamp(payload.completed_date.seconds) if payload.HasField('completed_date') else None 68 checklist = Checklist.from_proto(payload=payload.checklist) if payload.HasField('checklist') else None 69 progress = payload.progress_value if payload.HasField('progress_value') else None 70 reached_milestones = [] 71 for milestone in payload.reached_milestones: 72 reached_milestones.append(AchievementReachedMilestone.from_proto(payload=milestone)) 73 74 return AchievementStateAttributes(completed_date, checklist, progress, reached_milestones) 75 76 @classmethod 77 def to_proto(cls, instance): 78 proto_reached_milestones = [] 79 for reached_milestone in instance.reached_milestones: 80 proto_milestone = AchievementReachedMilestone.to_proto(instance=reached_milestone) 81 proto_reached_milestones.append(proto_milestone) 82 83 proto = ProtoAchievementStateAttributes(not_completed=instance.not_completed, reached_milestones=proto_reached_milestones) 84 if instance.completed_date is not None: 85 ts = Timestamp() 86 ts.FromDatetime(instance.completed_date) 87 proto.completed_date.CopyFrom(ts) 88 else: 89 proto.not_completed = True 90 if instance.checklist is not None: 91 proto.checklist.CopyFrom(Checklist.to_proto(instance.checklist)) 92 elif instance.progress is not None: 93 proto.progress_value = instance.progress 94 return proto 95 96 def __eq__(self, other): 97 if other is self: 98 return True 99 if other is None: 100 return False 101 if not isinstance(other, AchievementStateAttributes): 102 return False 103 return self._completed_date == other._completed_date and self._checklist == other._checklist and self._progress == other._progress and self._reached_milestones == other._reached_milestones 104 105 def __ne__(self, other): 106 return not self.__eq__(other) 107 108 def __str__(self): 109 110 def _fmt_dt(dt): 111 if dt is None: 112 return 'None' 113 try: 114 return dt.isoformat() 115 except Exception: 116 return str(dt) 117 118 checklist_str = 'None' if self._checklist is None else str(self._checklist) 119 milestones = self._reached_milestones or [] 120 preview_count = 3 121 preview = ', '.join((str(m) for m in milestones[:preview_count])) 122 if len(milestones) > preview_count: 123 preview += ', ...' 124 return 'AchievementStateAttributes(completed_date={completed_date}, not_completed={not_completed}, progress={progress}, checklist={checklist}, reached_milestones_count={rm_count}, reached_milestones=[{rm_preview}])'.format(completed_date=_fmt_dt(self._completed_date), not_completed=self._not_completed, progress=self._progress, checklist=checklist_str, rm_count=len(milestones), rm_preview=preview)