cerberus_formatted_message.py (4578B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\localization\client\cerberus_formatted_message.py 2 from datetime import datetime, timedelta 3 from datetimeutils import datetime_to_filetime 4 from eveProto.generated.eve_public.localization.cerberus.cerberus_pb2 import FormattedMessage as ProtoFormattedMessage 5 from eveProto.generated.eve_public.localization.cerberus.cerberus_pb2 import Parameter as ProtoParameter 6 from eveProto.generated.eve_public.localization.message_pb2 import Identifier as LocalizationIdentifier 7 from google.protobuf.duration_pb2 import Duration 8 from google.protobuf.timestamp_pb2 import Timestamp 9 from localization import GetByMessageID 10 from localization.common.errors import UnsupportedParameterKeyError, DuplicateParameterKeyError 11 if False: 12 from typing import Dict 13 14 class CerberusFormattedMessage(object): 15 16 def __init__(self, identifier, parameters): 17 self._identifier = identifier 18 self._parameters = parameters 19 20 @property 21 def identifier(self): 22 return self._identifier 23 24 @property 25 def parameters(self): 26 return self._parameters 27 28 @property 29 def formatted_parameters(self): 30 result = {} 31 for key, value in self._parameters.items(): 32 if isinstance(value, datetime): 33 result[key] = datetime_to_filetime(value) 34 elif isinstance(value, timedelta): 35 result[key] = value.total_seconds() 36 else: 37 result[key] = value 38 39 return result 40 41 def get_localized_text(self): 42 return GetByMessageID(self.identifier, **self.formatted_parameters) 43 44 @classmethod 45 def from_proto(cls, payload): 46 cerberus_parameters = {} 47 for raw_param in payload.parameters: 48 key = raw_param.key 49 if key in cerberus_parameters: 50 raise DuplicateParameterKeyError('duplicate key found: %s' % key) 51 value = None 52 if raw_param.HasField('string'): 53 value = raw_param.string 54 elif raw_param.HasField('integer'): 55 value = raw_param.integer 56 elif raw_param.HasField('signed_integer'): 57 value = raw_param.signed_integer 58 elif raw_param.HasField('double'): 59 value = raw_param.double 60 elif raw_param.HasField('timestamp'): 61 value = datetime.fromtimestamp(raw_param.timestamp.ToSeconds()) 62 elif raw_param.HasField('duration'): 63 value = timedelta(seconds=raw_param.duration.ToSeconds()) 64 if value is None: 65 raise UnsupportedParameterKeyError('unsupported type for key %s' % key) 66 cerberus_parameters[key] = value 67 68 return CerberusFormattedMessage(identifier=payload.identifier.sequential, parameters=cerberus_parameters) 69 70 @classmethod 71 def to_proto(cls, instance): 72 payload = ProtoFormattedMessage(identifier=LocalizationIdentifier(sequential=instance.identifier)) 73 for key, val in instance.parameters.items(): 74 proto_param = ProtoParameter(key=key) 75 if isinstance(val, str): 76 proto_param.string = val.encode('utf-8') 77 elif isinstance(val, int): 78 if val >= 0: 79 proto_param.integer = val 80 else: 81 proto_param.signed_integer = val 82 elif isinstance(val, float): 83 proto_param.double = val 84 elif isinstance(val, datetime): 85 timestamp_proto = Timestamp() 86 timestamp_proto.FromDatetime(val) 87 proto_param.timestamp.CopyFrom(timestamp_proto) 88 elif isinstance(val, timedelta): 89 proto_param.duration.CopyFrom(Duration(seconds=int(val.total_seconds()))) 90 else: 91 raise UnsupportedParameterKeyError('unsupported type for key %s' % key) 92 payload.parameters.append(proto_param) 93 94 return payload 95 96 def __eq__(self, other): 97 if other is None: 98 return False 99 return self.identifier == other.identifier and self.parameters == other.parameters 100 101 def __ne__(self, other): 102 return not self.__eq__(other) 103 104 def __str__(self): 105 params_str = 'params: \n' 106 for k, v in self.parameters.items(): 107 params_str += 'Key: %s, Value: %s\n' % (k, v) 108 109 return ('id: %s, ' % self.identifier + params_str).encode('utf-8') 110 111 def __repr__(self): 112 return '<%s %r>' % (self.__class__.__name__, self.__dict__)