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

request_messenger.py (5896B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\plex\client\message_bus\request_messenger.py
      2 import logging
      3 from six.moves import http_client as httplib
      4 from eveProto.generated.eve_public.plex.vault.api.requests_pb2 import BalanceRequest, BalanceResponse
      5 from eveProto.generated.eve_public.plex.vault.transaction.api.requests_pb2 import GetAllLoggedForUserRequest, GetAllLoggedForUserResponse, GetLogRequest, GetLogResponse, GetStatisticsRequest, GetStatisticsResponse
      6 from plex.client.api.errors import ServiceUnavailableError, GenericNotFoundError, GenericInternalServerError, GenericError
      7 from plex.client.model.transaction_statistics import TransactionStatistics
      8 from plex.common.const import LOGGER_NAME
      9 from plex.client.model.transaction_identifier import TransactionIdentifier
     10 from plex.client.model.transaction_attributes import TransactionAttributes
     11 from plex.client.model.invoice_identifier import InvoiceIdentifier
     12 from plex.client.model.invoice_attributes import InvoiceAttributes
     13 from publicGateway.gateway import PublicGateway
     14 from stackless_response_router.exceptions import TimeoutException, UnpackException
     15 logger = logging.getLogger(LOGGER_NAME)
     16 
     17 class PublicPlexRequestMessenger(object):
     18 
     19     def __init__(self, public_gateway):
     20         self.public_gateway = public_gateway
     21 
     22     def get_all_logged_request(self):
     23         request = GetAllLoggedForUserRequest()
     24         info_log = 'Request: Get All PLEX Transaction Logs: {request}\n'.format(request=request)
     25         status_code, payload = self._send_request(request, response_class=GetAllLoggedForUserResponse, info_log=info_log)
     26         if status_code == httplib.OK:
     27             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
     28             transaction_identifiers = [ TransactionIdentifier.from_proto(x) for x in payload.transactions ]
     29             info_log += 'Returning: {count} transactions\n'.format(count=len(transaction_identifiers))
     30             logger.info(info_log)
     31             return transaction_identifiers
     32         self._raise_error_and_log(info_log, status_code)
     33 
     34     def get_log_request(self, transaction_id):
     35         request = GetLogRequest(identifier=TransactionIdentifier.to_proto(transaction_id))
     36         info_log = 'Request: Get Transaction Log: {request}\n'.format(request=request)
     37         status_code, payload = self._send_request(request, response_class=GetLogResponse, info_log=info_log)
     38         if status_code == httplib.OK:
     39             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
     40             transaction_attributes = TransactionAttributes.from_proto(payload.transaction)
     41             invoice_identifier = None
     42             invoice_attributes = None
     43             if payload.HasField('invoice_entry'):
     44                 invoice_identifier = InvoiceIdentifier.from_proto(payload.invoice_entry.id)
     45                 invoice_attributes = InvoiceAttributes.from_proto(payload.invoice_entry.attributes)
     46             info_log += 'Returning: transaction {t_data}, invoice id {i_id}, data {i_data}\n'.format(t_data=transaction_attributes, i_id=invoice_identifier, i_data=invoice_attributes)
     47             logger.info(info_log)
     48             return (transaction_attributes, invoice_identifier, invoice_attributes)
     49         self._raise_error_and_log(info_log, status_code)
     50 
     51     def get_balance_request(self):
     52         request = BalanceRequest()
     53         info_log = 'Request: Get PLEX balance: {request}\n'.format(request=request)
     54         status_code, payload = self._send_request(request, response_class=BalanceResponse, info_log=info_log)
     55         if status_code == httplib.OK:
     56             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
     57             balance_in_cents = payload.balance.total_in_cents
     58             info_log += 'Returning: {balance_in_cents} (PLEX cents)\n'.format(balance_in_cents=balance_in_cents)
     59             logger.info(info_log)
     60             return payload.balance.total_in_cents
     61         self._raise_error_and_log(info_log, status_code)
     62 
     63     def get_statistics_request(self):
     64         request = GetStatisticsRequest()
     65         info_log = 'Request: Get PLEX transaction statistics\n'
     66         status_code, payload = self._send_request(request, response_class=GetStatisticsResponse, info_log=info_log)
     67         if status_code == httplib.OK:
     68             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
     69             statistics = TransactionStatistics.from_proto(payload)
     70             info_log += 'Returning: {stats}\n'.format(stats=statistics)
     71             logger.info(info_log)
     72             return statistics
     73         self._raise_error_and_log(info_log, status_code)
     74 
     75     def _send_request(self, request, response_class, info_log, timeout_seconds = 10, max_attempts = 1):
     76         try:
     77             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)
     78         except (TimeoutException, UnpackException) as exc:
     79             error_info = 'ERROR: %s' % exc.__class__.__name__
     80             info_log += error_info
     81             logger.info(info_log)
     82             request_cls = request.__class__.__name__
     83             raise ServiceUnavailableError('%s, Failed to receive response from %s: %s' % (error_info, request_cls, exc))
     84 
     85         return (response_primitive.status_code, response)
     86 
     87     @staticmethod
     88     def _raise_error_and_log(info_text, status_code):
     89         info_text += 'ERROR: %s(%s)\n' % (httplib.responses[status_code], status_code)
     90         logger.info(info_text)
     91         if status_code == httplib.NOT_FOUND:
     92             raise GenericNotFoundError(info_text)
     93         if status_code == httplib.INTERNAL_SERVER_ERROR:
     94             raise GenericInternalServerError(info_text)
     95         raise GenericError(info_text)