request_messenger.py (11028B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\sovereignty\mercenaryden\client\request_messenger.py 2 from eveProto.generated.eve_public.sovereignty.mercenaryden.api.requests_pb2 import GetAsOwnerRequest, GetAsOwnerResponse, GetAllOwnedRequest, GetAllOwnedResponse, GetMaximumForCharacterRequest, GetMaximumForCharacterResponse 3 from eveProto.generated.eve_public.sovereignty.mercenaryden.activity.api.requests_pb2 import GetAllRequest, GetAllResponse, GetForMercenaryDenRequest, GetForMercenaryDenResponse, StartRequest, StartResponse, GetCapacityRequest, GetCapacityResponse 4 from six.moves.http_client import OK, NOT_FOUND, CONFLICT, FORBIDDEN 5 from logging import getLogger 6 from sovereignty.mercenaryden.client.data.activity import MercenaryDenActivity 7 from sovereignty.mercenaryden.client.data.mercenary_den import MercenaryDenInfo 8 from sovereignty.mercenaryden.common.errors import GenericError, ServiceUnavailable, UnknownMercenaryDen, UnknownActivity, ActivityAlreadyStarted, ActivityValidationFailed, GetMaximumDensInternalError 9 from stackless_response_router.exceptions import TimeoutException, UnpackException 10 logger = getLogger('mercenary_den') 11 TIMEOUT_SECONDS = 2 12 TIMEOUT_SECONDS_GET_ALL_MERCENARY_DENS = 5 13 14 class PublicMercenaryDenRequestMessenger(object): 15 16 def __init__(self, public_gateway): 17 self.public_gateway = public_gateway 18 19 def get_mercenary_den_request(self, item_id): 20 request = GetAsOwnerRequest() 21 request.id.sequential = item_id 22 info_log = 'Request: Get Mercenary Den {item_id}: {request}\n'.format(item_id=item_id, request=request) 23 try: 24 request_primitive, response_channel = self.public_gateway.send_character_request(request, GetAsOwnerResponse, TIMEOUT_SECONDS) 25 response_primitive, response = response_channel.receive() 26 except (TimeoutException, UnpackException) as exc: 27 info_log += 'ERROR: {exc}'.format(exc=exc.__class__.__name__) 28 logger.info(info_log) 29 logger.exception('Unexpected exception when requesting to get Mercenary Den %s: %s', item_id, exc) 30 raise ServiceUnavailable('Service failed to respond request for Mercenary Den %s: %s', item_id, exc) 31 32 status_code = response_primitive.status_code 33 info_log += 'Response: Get Mercenary Den {item_id}: ({status_code}) {response}'.format(item_id=item_id, status_code=status_code, response=response) 34 logger.info(info_log) 35 if status_code == OK: 36 return MercenaryDenInfo.create_from_proto(item_id, response.attributes, response.enabled, response.evolution, response.infomorphs, response.cargo_extraction_enabled, response.skyhook_owner) 37 if status_code == NOT_FOUND: 38 raise UnknownMercenaryDen('Mercenary Den does not exist or caller is not owner and therefore has no visibility') 39 else: 40 raise GenericError('Unspecified error when fetching data for Mercenary Den: {code}'.format(code=status_code)) 41 42 def get_all_activities_request_without_retries(self): 43 return self._get_all_activities_request(timeout_seconds=2, max_attempts=1, retry_delay_in_seconds=1) 44 45 def get_all_activities_request_with_retries(self): 46 return self._get_all_activities_request(timeout_seconds=5, max_attempts=10, retry_delay_in_seconds=0.5) 47 48 def _get_all_activities_request(self, timeout_seconds, max_attempts, retry_delay_in_seconds): 49 request = GetAllRequest() 50 info_log = 'Request: Get All Mercenary Den Activites for player: {request}\n'.format(request=request) 51 try: 52 response_primitive, response = self.public_gateway.send_blocking_character_request_and_receive_response(request_payload=request, expected_response_class=GetAllResponse, timeout_seconds=timeout_seconds, max_attempts=max_attempts, retry_delay_in_seconds=retry_delay_in_seconds) 53 except TimeoutException as exc: 54 info_log += 'ERROR: {exc}'.format(exc=exc.__class__.__name__) 55 logger.info(info_log) 56 raise ServiceUnavailable('Service timed out before responding to request GetAllRequest: %s' % exc) 57 except UnpackException as exc: 58 info_log += 'ERROR: {exc}'.format(exc=exc.__class__.__name__) 59 logger.info(info_log) 60 logger.exception('Unexpected exception GetAllRequest: %s', exc) 61 raise GenericError('Service returned unexpected response format for GetAllRequest: %s' % exc) 62 63 status_code = response_primitive.status_code 64 if status_code != OK: 65 raise GenericError('Unspecified error when fetching data for GetAllRequest: {code}'.format(code=status_code)) 66 activities = [] 67 for activity in response.activities: 68 activities.append(MercenaryDenActivity.create_from_proto(activity)) 69 70 return activities 71 72 def get_all_activities_for_den_request(self, item_id): 73 request = GetForMercenaryDenRequest() 74 request.mercenary_den.sequential = item_id 75 info_log = 'Request: Get All Mercenary Den Activities for Den {id}: {request}\n'.format(id=item_id, request=request) 76 try: 77 request_primitive, response_channel = self.public_gateway.send_character_request(request, GetForMercenaryDenResponse, TIMEOUT_SECONDS) 78 response_primitive, response = response_channel.receive() 79 except (TimeoutException, UnpackException) as exc: 80 info_log += 'ERROR: {exc}'.format(exc=exc.__class__.__name__) 81 logger.info(info_log) 82 logger.exception('Unexpected exception GetForMercenaryDenRequest: %s', exc) 83 raise ServiceUnavailable('Service failed to respond to request GetForMercenaryDenRequest: %s', exc) 84 85 status_code = response_primitive.status_code 86 if status_code == NOT_FOUND: 87 raise UnknownMercenaryDen('Mercenary Den does not exist or caller is not owner and therefore has no visibility') 88 if status_code != OK: 89 raise GenericError('Unspecified error when fetching data for GetForMercenaryDenRequest: {code}'.format(code=status_code)) 90 info_log += 'Response: %s' % response 91 logger.info(info_log) 92 activities = [] 93 for activity in response.activities: 94 activities.append(MercenaryDenActivity.create_from_proto(activity)) 95 96 next_generation = response.next_generation_at.ToDatetime() 97 return (activities, next_generation) 98 99 def start_activity_request(self, activity_id): 100 request = StartRequest() 101 request.id.uuid = activity_id.bytes 102 info_log = 'Request: Start Activity {id}: {request}\n'.format(id=activity_id, request=request) 103 try: 104 request_primitive, response_channel = self.public_gateway.send_character_request(request, StartResponse, TIMEOUT_SECONDS) 105 response_primitive, response = response_channel.receive() 106 except (TimeoutException, UnpackException) as exc: 107 info_log += 'ERROR: {exc}'.format(exc=exc.__class__.__name__) 108 logger.info(info_log) 109 logger.exception('Unexpected exception StartRequest: %s', exc) 110 raise ServiceUnavailable('Service failed to respond to request StartRequest: %s', exc) 111 112 status_code = response_primitive.status_code 113 if status_code == NOT_FOUND: 114 raise UnknownActivity('Activity or associated mercenary den does not exist') 115 if status_code == CONFLICT: 116 raise ActivityAlreadyStarted('Activity has already been started') 117 if status_code == FORBIDDEN: 118 raise ActivityValidationFailed('Validation of activity has failed') 119 if status_code != OK: 120 raise GenericError('Unspecified error when fetching data for StartRequest: {code}'.format(code=status_code)) 121 return MercenaryDenActivity.create_from_id_and_attributes_proto(activity_id, response.attributes) 122 123 def get_activity_capacity_request(self): 124 request = GetCapacityRequest() 125 info_log = 'Request: Get Activity Capacity Request: {request}\n'.format(request=request) 126 try: 127 request_primitive, response_channel = self.public_gateway.send_character_request(request, GetCapacityResponse, TIMEOUT_SECONDS) 128 response_primitive, response = response_channel.receive() 129 except (TimeoutException, UnpackException) as exc: 130 info_log += 'ERROR: {exc}'.format(exc=exc.__class__.__name__) 131 logger.info(info_log) 132 logger.exception('Unexpected exception GetCapacityRequest: %s', exc) 133 raise ServiceUnavailable('Service failed to respond to request GetCapacityRequest: %s', exc) 134 135 status_code = response_primitive.status_code 136 if status_code != OK: 137 raise GenericError('Unspecified error when fetching data for GetCapacityRequest: {code}'.format(code=status_code)) 138 return response.capacity 139 140 def get_all_owned_mercenary_dens_request(self): 141 request = GetAllOwnedRequest() 142 info_log = 'Request: Get all my Mercenary Dens: {request}\n'.format(request=request) 143 try: 144 request_primitive, response_channel = self.public_gateway.send_character_request(request, GetAllOwnedResponse, TIMEOUT_SECONDS_GET_ALL_MERCENARY_DENS) 145 response_primitive, response = response_channel.receive() 146 except TimeoutException as exc: 147 info_log += 'ERROR: {exc}'.format(exc=exc.__class__.__name__) 148 logger.info(info_log) 149 raise ServiceUnavailable('Service failed to respond request for my Mercenary Dens: %s' % exc) 150 except UnpackException as exc: 151 info_log += 'ERROR: {exc}'.format(exc=exc.__class__.__name__) 152 logger.info(info_log) 153 logger.exception('Unexpected exception when requesting to get my Mercenary Dens:', exc) 154 raise GenericError('Service returned unexpected response format: %s' % exc) 155 156 status_code = response_primitive.status_code 157 if status_code != OK: 158 raise GenericError('Unspecified error when fetching my mercenary dens: {code}'.format(code=status_code)) 159 item_ids = [ x.sequential for x in response.id ] 160 return item_ids 161 162 def get_maximum_dens_info_dens_request(self): 163 request = GetMaximumForCharacterRequest() 164 try: 165 request_primitive, response_channel = self.public_gateway.send_character_request(request, GetMaximumForCharacterResponse, TIMEOUT_SECONDS) 166 response_primitive, response = response_channel.receive() 167 except (TimeoutException, UnpackException) as exc: 168 logger.exception('Unexpected exception when requesting to get my max Mercenary Dens:', exc) 169 raise ServiceUnavailable('Service failed to respond request for my max Mercenary Dens:', exc) 170 171 status_code = response_primitive.status_code 172 if status_code != OK: 173 raise GetMaximumDensInternalError() 174 return (response.current_maximum, response.absolute_maximum)