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

request_messenger.py (7335B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\cosmetics\client\character\title\repository\message_bus\request_messenger.py
      2 import logging
      3 import httplib
      4 from carbon.common.script.sys.serviceConst import ROLE_QA
      5 from character.client.identifier import CharacterIdentifier
      6 from cosmetics.client.character.title.const import LOGGER_NAME
      7 from cosmetics.client.character.title.model.definition.identifier import TitleIdentifier
      8 from cosmetics.client.character.title.model.state.equipped import EquippedTitleStateAttributes
      9 from eveProto.generated.eve_public.public_pb2 import Page as ProtoPage
     10 from eveProto.generated.eve_public.cosmetic.character.title.api.requests_pb2 import GetEquippedForCharacterRequest, GetEquippedForCharacterResponse, EquipRequest, EquipResponse, UnequipRequest, UnequipResponse, GetOwnedRequest, GetOwnedResponse
     11 from eveProto.generated.eve_public.cosmetic.character.title.api.admin.requests_pb2 import GrantRequest, GrantResponse, RevokeRequest, RevokeResponse
     12 from publicGateway.gateway import PublicGateway
     13 from stackless_response_router.exceptions import TimeoutException, UnpackException
     14 from cosmetics.client.character.title.api.error import ServiceUnavailableError, GenericInternalServerError, GenericError, GenericNotFoundError
     15 logger = logging.getLogger(LOGGER_NAME)
     16 
     17 class TitleRequestMessenger(object):
     18 
     19     def __init__(self, public_gateway):
     20         self.public_gateway = public_gateway
     21 
     22     def get_owned_titles_request(self, page):
     23         request = GetOwnedRequest(page=ProtoPage(size=100, token=page))
     24         info_log = 'Request: Get Owned Request: {request}\n'.format(request=request)
     25         status_code, payload = self._send_character_request(request, response_class=GetOwnedResponse, info_log=info_log)
     26         if status_code == httplib.OK:
     27             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
     28             owned_titles = [ TitleIdentifier.from_proto(x) for x in payload.titles ]
     29             next_page_token = payload.next_page.token if payload.next_page.token else None
     30             logger.info(info_log)
     31             return (owned_titles, next_page_token)
     32         self._raise_error_and_log(info_log, status_code)
     33 
     34     def get_equipped_title_request(self, character_identifier):
     35         request = GetEquippedForCharacterRequest(character=CharacterIdentifier.to_proto(character_identifier))
     36         info_log = 'Request: Get Equipped For Character Request: {request}\n'.format(request=request)
     37         status_code, payload = self._send_user_request(request, response_class=GetEquippedForCharacterResponse, info_log=info_log)
     38         if status_code == httplib.OK:
     39             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
     40             equipped_title = EquippedTitleStateAttributes.from_response_proto(payload)
     41             logger.info(info_log)
     42             return equipped_title
     43         self._raise_error_and_log(info_log, status_code)
     44 
     45     def equip_title_request(self, title_identifier):
     46         request = EquipRequest(title=TitleIdentifier.to_proto(title_identifier))
     47         info_log = 'Request: Equip Request: {request}\n'.format(request=request)
     48         status_code, payload = self._send_character_request(request, response_class=EquipResponse, info_log=info_log)
     49         if status_code == httplib.OK:
     50             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
     51             logger.info(info_log)
     52         else:
     53             self._raise_error_and_log(info_log, status_code)
     54 
     55     def unequip_title_request(self):
     56         request = UnequipRequest()
     57         info_log = 'Request: Unequip Request: {request}\n'.format(request=request)
     58         status_code, payload = self._send_character_request(request, response_class=UnequipResponse, info_log=info_log)
     59         if status_code == httplib.OK:
     60             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
     61             logger.info(info_log)
     62         else:
     63             self._raise_error_and_log(info_log, status_code)
     64 
     65     def admin_grant_request(self, title_identifier):
     66         if not session.role & ROLE_QA:
     67             return
     68         request = GrantRequest(id=TitleIdentifier.to_proto(title_identifier))
     69         info_log = 'Admin Request: Grant Request: {request}\n'.format(request=request)
     70         status_code, payload = self._send_character_request(request, response_class=GrantResponse, info_log=info_log)
     71         if status_code == httplib.OK:
     72             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
     73             logger.info(info_log)
     74         else:
     75             self._raise_error_and_log(info_log, status_code)
     76 
     77     def admin_revoke_request(self, title_identifier):
     78         if not session.role & ROLE_QA:
     79             return
     80         request = RevokeRequest(id=TitleIdentifier.to_proto(title_identifier))
     81         info_log = 'Admin Request: Revoke Request: {request}\n'.format(request=request)
     82         status_code, payload = self._send_character_request(request, response_class=RevokeResponse, info_log=info_log)
     83         if status_code == httplib.OK:
     84             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
     85             logger.info(info_log)
     86         else:
     87             self._raise_error_and_log(info_log, status_code)
     88 
     89     def _send_character_request(self, request, response_class, info_log, timeout_seconds = 10, max_attempts = 1):
     90         try:
     91             response_primitive, response = self.public_gateway.send_blocking_character_request_and_receive_response(request_payload=request, expected_response_class=response_class, timeout_seconds=timeout_seconds, max_attempts=max_attempts, retry_delay_in_seconds=1)
     92         except (TimeoutException, UnpackException) as exc:
     93             error_info = 'ERROR: %s' % exc.__class__.__name__
     94             info_log += error_info
     95             logger.info(info_log)
     96             request_cls = request.__class__.__name__
     97             raise ServiceUnavailableError('%s, Failed to receive response from %s: %s' % (error_info, request_cls, exc))
     98 
     99         return (response_primitive.status_code, response)
    100 
    101     def _send_user_request(self, request, response_class, info_log, timeout_seconds = 10, max_attempts = 1):
    102         try:
    103             response_primitive, response = self.public_gateway.send_blocking_user_request_and_receive_response(request_payload=request, expected_response_class=response_class, timeout_seconds=timeout_seconds, max_attempts=max_attempts, retry_delay_in_seconds=1)
    104         except (TimeoutException, UnpackException) as exc:
    105             error_info = 'ERROR: %s' % exc.__class__.__name__
    106             info_log += error_info
    107             logger.info(info_log)
    108             request_cls = request.__class__.__name__
    109             raise ServiceUnavailableError('%s, Failed to receive response from %s: %s' % (error_info, request_cls, exc))
    110 
    111         return (response_primitive.status_code, response)
    112 
    113     @staticmethod
    114     def _raise_error_and_log(info_text, status_code):
    115         info_text += 'ERROR: %s(%s)\n' % (httplib.responses[status_code], status_code)
    116         logger.info(info_text)
    117         if status_code == httplib.INTERNAL_SERVER_ERROR:
    118             raise GenericInternalServerError(info_text)
    119         if status_code == httplib.NOT_FOUND:
    120             raise GenericNotFoundError(info_text)
    121         raise GenericError(info_text)