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

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)