skin_listing.py (8273B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\cosmetics\client\ships\skins\live_data\skin_listing.py 2 import uuid 3 import datetime 4 from cosmetics.client.shipSkinDataSvc import get_ship_skin_data_svc 5 from cosmetics.client.ships.skins.live_data.skin_listing_target import ListingTarget, ListingTargetType 6 from cosmetics.common.ships.skins.util import Currency 7 from player_messaging.client.ui_message import message_player 8 from eve.common.lib import appConst 9 from eveProto import get_single_value_from_split_precision_message, split_precision 10 from eveProto.generated.eve_public.isk.isk_pb2 import Currency as IskCurrency 11 from eveProto.generated.eve_public.plex.plex_pb2 import Currency as PlexCurrency 12 from eveProto.generated.eve_public.character.character_pb2 import Identifier as CharacterIdentifier 13 from eveProto.generated.eve_public.cosmetic.ship.skin.thirdparty.thirdparty_pb2 import Identifier as SkinIdentifier 14 from eveProto.generated.eve_public.cosmetic.ship.skin.thirdparty.license.license_pb2 import Identifier as LicenseIdentifier 15 from eveProto.generated.eve_public.cosmetic.market.skin.listing.listing_pb2 import Attributes as ListingAttributes 16 from google.protobuf.timestamp_pb2 import Timestamp 17 from localization import GetByLabel 18 from localization.formatters.timeIntervalFormatters import FormatTimeIntervalShortWritten, TIME_CATEGORY_DAY, TIME_CATEGORY_HOUR, TIME_CATEGORY_MINUTE 19 from publicGateway.grpc.exceptions import GenericException 20 from stackless_response_router.exceptions import TimeoutException 21 22 class SkinListing(object): 23 24 def __init__(self, identifier, seller_id, created_at, valid_until, currency, price, quantity, skin_hex, target, branded): 25 self._id = identifier 26 self._seller_id = seller_id 27 self._created_at = created_at 28 self._valid_until = valid_until 29 self._currency = currency 30 self._price = price 31 self._quantity = quantity 32 self._skin_hex = skin_hex 33 self._target = target 34 self._branded = branded 35 36 @property 37 def identifier(self): 38 return self._id 39 40 @property 41 def seller_id(self): 42 return self._seller_id 43 44 @property 45 def target(self): 46 return self._target 47 48 @property 49 def created_at(self): 50 return self._created_at 51 52 @property 53 def valid_until(self): 54 return self._valid_until 55 56 @property 57 def currency(self): 58 return self._currency 59 60 @property 61 def price(self): 62 return self._price 63 64 @property 65 def quantity(self): 66 return self._quantity 67 68 @property 69 def skin_hex(self): 70 return self._skin_hex 71 72 @property 73 def skin_design(self): 74 try: 75 return get_ship_skin_data_svc().get_skin_data(self.skin_hex) 76 except (GenericException, TimeoutException): 77 message_player(GetByLabel('UI/Common/CannotConnectToServer')) 78 return None 79 80 @property 81 def name(self): 82 return self.skin_design.name 83 84 @property 85 def time_remaining(self): 86 if not self.valid_until: 87 return None 88 time_remaining = self.valid_until - datetime.datetime.now() 89 if time_remaining < datetime.timedelta(0): 90 return None 91 return time_remaining 92 93 @property 94 def is_expired(self): 95 return self.time_remaining is None 96 97 @property 98 def time_remaining_text(self): 99 if not self.time_remaining: 100 return None 101 seconds = int(self.time_remaining.total_seconds() * appConst.SEC) 102 if seconds > appConst.MONTH30: 103 time_left = FormatTimeIntervalShortWritten(seconds, showTo=TIME_CATEGORY_DAY) 104 elif seconds > appConst.DAY: 105 time_left = FormatTimeIntervalShortWritten(seconds, showTo=TIME_CATEGORY_HOUR) 106 elif seconds > appConst.HOUR: 107 time_left = FormatTimeIntervalShortWritten(seconds, showTo=TIME_CATEGORY_MINUTE) 108 else: 109 time_left = FormatTimeIntervalShortWritten(seconds) 110 return GetByLabel('UI/Personalization/ShipSkins/SKINR/Studio/TimeLeft', time_left=time_left) 111 112 @property 113 def branded(self): 114 return self._branded 115 116 @property 117 def is_public(self): 118 return self.target.target_type == ListingTargetType.PUBLIC 119 120 @property 121 def is_targeted_at_any_character(self): 122 return self.target.target_type == ListingTargetType.CHARACTER 123 124 @property 125 def is_targeted_at_another_character(self): 126 if self.target.target_type == ListingTargetType.CHARACTER: 127 if self.target.target_id != session.charid: 128 return True 129 return False 130 131 @property 132 def is_targeted_at_any_organization(self): 133 return self.target.target_type in [ListingTargetType.CORPORATION, ListingTargetType.ALLIANCE] 134 135 @property 136 def is_targeted_at_another_organization(self): 137 if self.target.target_type == ListingTargetType.CORPORATION: 138 if session.corpid and self.target.target_id != session.corpid: 139 return True 140 if self.target.target_type == ListingTargetType.ALLIANCE: 141 if not session.allianceid or self.target.target_id != session.allianceid: 142 return True 143 return False 144 145 def __eq__(self, other): 146 if other is None: 147 return False 148 return self.identifier == other.identifier and self.seller_id == other.seller_id and self.created_at == other.created_at and self.valid_until == other.valid_until and self.currency == other.currency and self.price == other.price and self.quantity == other.quantity and self.skin_hex == other.skin_hex and self.target == other.target and self.branded == other.branded 149 150 def __ne__(self, other): 151 return not self.__eq__(other) 152 153 def __str__(self): 154 result = 'id: {id}\nseller: {seller}\ncreated_at: {created_at}\nvalid_until: {valid_until}\nprice: {price} {currency}\n{quantity} x skin_hex: {skin_hex}\ntarget: {target}\nbranded: {branded}'.format(id=self.identifier, seller=self.seller_id, created_at=self.created_at, valid_until=self.valid_until, price=self.price, quantity=self.quantity, currency=self.currency, skin_hex=self.skin_hex, target=self.target, branded=self.branded) 155 return result 156 157 @classmethod 158 def build_from_proto(cls, payload, identifier): 159 if payload.HasField('isk'): 160 currency = Currency.ISK 161 price = get_single_value_from_split_precision_message(payload.isk) 162 elif payload.HasField('plex'): 163 currency = Currency.PLEX 164 price = payload.plex.total_in_cents / 100 165 else: 166 raise Exception('unknown currency type for skin listing %s' % identifier) 167 target = ListingTarget.from_proto(payload.target) 168 listing = cls(identifier=identifier, seller_id=payload.seller.sequential, created_at=datetime.datetime.fromtimestamp(payload.created.seconds), valid_until=datetime.datetime.fromtimestamp(payload.expires.seconds), currency=currency, price=price, quantity=payload.quantity, skin_hex=payload.skin.skin.hex, target=target, branded=payload.branded) 169 return listing 170 171 @staticmethod 172 def build_proto_from_skin_listing(skin_listing): 173 created = Timestamp() 174 created.FromDatetime(skin_listing.created_at) 175 expires = Timestamp() 176 expires.FromDatetime(skin_listing.valid_until) 177 target_proto = skin_listing.target.to_proto() 178 payload = ListingAttributes(seller=CharacterIdentifier(sequential=skin_listing.seller_id), created=created, expires=expires, skin=LicenseIdentifier(character=CharacterIdentifier(sequential=skin_listing.seller_id), skin=SkinIdentifier(hex=skin_listing.skin_hex)), quantity=skin_listing.quantity, target=target_proto, branded=skin_listing.branded) 179 if skin_listing.currency == Currency.PLEX: 180 payload.plex.CopyFrom(PlexCurrency(total_in_cents=skin_listing.price * 100)) 181 elif skin_listing.currency == Currency.ISK: 182 units, nanos = split_precision(skin_listing.price) 183 payload.isk.CopyFrom(IskCurrency(units=units, nanos=nanos)) 184 else: 185 raise Exception('unknown currency type for skin listing %s' % skin_listing.identifier) 186 return payload