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

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