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

request_messenger.py (14815B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\achievement_system\client\repository\message_bus\request_messenger.py
      2 import logging
      3 from six.moves import http_client as httplib
      4 from achievement_system.client.model.definition.contribution_method.parameter.configuration import ContributionMethodParameterConfiguration
      5 from achievement_system.client.model.definition.achievement.identifier import AchievementDefinitionIdentifier
      6 from achievement_system.client.model.definition.achievement.milestone.identifier import AchievementMilestoneDefinitionIdentifier
      7 from achievement_system.client.model.definition.category.identifier import CategoryDefinitionIdentifier
      8 from achievement_system.client.model.definition.category.milestone.identifier import CategoryMilestoneDefinitionIdentifier
      9 from achievement_system.client.model.definition.reward.identifier import RewardDefinitionIdentifier
     10 from achievement_system.client.model.state.achievement import AchievementStateAttributes
     11 from achievement_system.client.model.state.category import CategoryStateAttributes
     12 from achievement_system.client.model.state.checklist import Checklist
     13 from achievement_system.client.repository.message_bus.unclaimed_reward_data import AchievementUnclaimedRewardData, CategoryUnclaimedRewardData
     14 from achievement_system.common.const import LOGGER_NAME
     15 from carbon.common.script.sys.serviceConst import ROLE_QA
     16 from character.client.identifier import CharacterIdentifier
     17 from eveProto.generated.eve_public.achievement.api.requests_pb2 import GetRequest, GetResponse
     18 from eveProto.generated.eve_public.achievement.api.admin.requests_pb2 import ResetAllRequest, ResetAllResponse, ResetRequest, ResetResponse, CompleteRequest, CompleteResponse, AddProgressRequest, AddProgressResponse
     19 from eveProto.generated.eve_public.achievement.category.api.requests_pb2 import GetRequest as GetCategoryScoreRequest, GetResponse as GetCategoryScoreResponse
     20 from eveProto.generated.eve_public.achievement.showcase.api.requests_pb2 import GetCharacterScoreRequest, GetCharacterScoreResponse
     21 from eveProto.generated.eve_public.achievement.reward.api.requests_pb2 import GetUnclaimedRequest, GetUnclaimedResponse, ClaimRequest, ClaimResponse
     22 from eveProto.generated.eve_public.public_pb2 import Page as ProtoPage
     23 from publicGateway.gateway import PublicGateway
     24 from stackless_response_router.exceptions import TimeoutException, UnpackException
     25 from achievement_system.client.api.error import ServiceUnavailableError, GenericInternalServerError, GenericError, RewardAlreadyClaimedError
     26 logger = logging.getLogger(LOGGER_NAME)
     27 
     28 class AchievementRequestMessenger(object):
     29 
     30     def __init__(self, public_gateway):
     31         self.public_gateway = public_gateway
     32 
     33     def get_achievement_request(self, achievement_id):
     34         request = GetRequest(achievement=AchievementDefinitionIdentifier.to_proto(achievement_id))
     35         info_log = 'Request: Get Achievement: {request}\n'.format(request=request)
     36         status_code, payload = self._send_character_request(request, response_class=GetResponse, info_log=info_log)
     37         if status_code == httplib.OK:
     38             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
     39             results = AchievementStateAttributes.from_proto(payload=payload)
     40             logger.info(info_log)
     41             return results
     42         if status_code == httplib.NOT_FOUND:
     43             info_log += 'Achievement State Not Found, treat as No Progress: {payload}\n'.format(payload=payload)
     44             results = AchievementStateAttributes(completed_date=None, checklist=None, progress=None, reached_milestones=[])
     45             logger.info(info_log)
     46             return results
     47         self._raise_error_and_log(info_log, status_code)
     48 
     49     def get_category_state_request(self, category_id):
     50         request = GetCategoryScoreRequest(category=CategoryDefinitionIdentifier.to_proto(category_id))
     51         info_log = 'Request: Get Category Score: {request}\n'.format(request=request)
     52         status_code, payload = self._send_character_request(request, response_class=GetCategoryScoreResponse, info_log=info_log)
     53         if status_code == httplib.OK:
     54             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
     55             results = CategoryStateAttributes.from_proto(category=payload)
     56             logger.info(info_log)
     57             return results
     58         self._raise_error_and_log(info_log, status_code)
     59 
     60     def get_achievement_score_request(self, character_id):
     61         request = GetCharacterScoreRequest(character=CharacterIdentifier.to_proto(character_id))
     62         info_log = 'Request: Get Character Score: {request}\n'.format(request=request)
     63         status_code, payload = self._send_user_request(request, response_class=GetCharacterScoreResponse, info_log=info_log)
     64         if status_code == httplib.OK:
     65             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
     66             results = payload.score
     67             logger.info(info_log)
     68             return results
     69         if status_code == httplib.NOT_FOUND:
     70             info_log += 'Character Score Not Found, treat as No Progress: {payload}\n'.format(payload=payload)
     71             results = 0
     72             logger.info(info_log)
     73             return results
     74         self._raise_error_and_log(info_log, status_code)
     75 
     76     def get_unclaimed_rewards_request(self, page):
     77         request = GetUnclaimedRequest(page=ProtoPage(size=100, token=page))
     78         info_log = 'Request: Get Unclaimed Rewards: {request}\n'.format(request=request)
     79         status_code, payload = self._send_character_request(request, response_class=GetUnclaimedResponse, info_log=info_log, max_attempts=2)
     80         if status_code == httplib.OK:
     81             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
     82             unclaimed_achievement_rewards = []
     83             unclaimed_category_rewards = []
     84             for entry in payload.rewards:
     85                 if entry.HasField('achievement_source'):
     86                     unclaimed_achievement_rewards.append(AchievementUnclaimedRewardData(achievement_id=AchievementDefinitionIdentifier.from_proto(entry.achievement_source.achievement), milestone_id=AchievementMilestoneDefinitionIdentifier.from_proto(entry.achievement_source.milestone), unclaimed_reward_ids=[ RewardDefinitionIdentifier.from_proto(x) for x in entry.unclaimed_rewards ]))
     87                 elif entry.HasField('category_source'):
     88                     unclaimed_category_rewards.append(CategoryUnclaimedRewardData(category_id=CategoryDefinitionIdentifier.from_proto(entry.category_source.category), milestone_id=CategoryMilestoneDefinitionIdentifier.from_proto(entry.category_source.milestone), unclaimed_reward_ids=[ RewardDefinitionIdentifier.from_proto(x) for x in entry.unclaimed_rewards ]))
     89 
     90             next_page_token = payload.next_page.token if payload.next_page.token else None
     91             logger.info(info_log)
     92             return (unclaimed_achievement_rewards, unclaimed_category_rewards, next_page_token)
     93         self._raise_error_and_log(info_log, status_code)
     94 
     95     def claim_achievement_milestone_rewards_request(self, achievement_id, milestone_id):
     96         request = ClaimRequest(achievement_source=ClaimRequest.AchievementSource(achievement=AchievementDefinitionIdentifier.to_proto(achievement_id), milestone=AchievementMilestoneDefinitionIdentifier.to_proto(milestone_id)))
     97         info_log = 'Request: Claim Reward: {request}\n'.format(request=request)
     98         status_code, payload = self._send_character_request(request, response_class=ClaimResponse, info_log=info_log)
     99         if status_code == httplib.OK:
    100             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
    101             logger.info(info_log)
    102             return
    103         self._raise_error_and_log(info_log, status_code)
    104 
    105     def claim_category_milestone_rewards_request(self, category_id, milestone_id):
    106         request = ClaimRequest(category_source=ClaimRequest.CategorySource(category=CategoryDefinitionIdentifier.to_proto(category_id), milestone=CategoryMilestoneDefinitionIdentifier.to_proto(milestone_id)))
    107         info_log = 'Request: Claim Reward: {request}\n'.format(request=request)
    108         status_code, payload = self._send_character_request(request, response_class=ClaimResponse, info_log=info_log)
    109         if status_code == httplib.OK:
    110             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
    111             logger.info(info_log)
    112             return
    113         self._raise_error_and_log(info_log, status_code)
    114 
    115     def admin_reset_all_request(self):
    116         if not session.role & ROLE_QA:
    117             return
    118         request = ResetAllRequest()
    119         info_log = 'Admin Request: Reset All: {request}\n'.format(request=request)
    120         status_code, payload = self._send_character_request(request, response_class=ResetAllResponse, info_log=info_log)
    121         if status_code == httplib.OK:
    122             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
    123             logger.info(info_log)
    124             return
    125         self._raise_error_and_log(info_log, status_code)
    126 
    127     def admin_add_cumulative_progress_request(self, achievement_id, progress_delta):
    128         if not session.role & ROLE_QA:
    129             return
    130         request = AddProgressRequest(achievement=AchievementDefinitionIdentifier.to_proto(achievement_id), progress_delta=progress_delta)
    131         info_log = 'Admin Request: Add Achievement Progress for achievement {id}: {request}\n'.format(id=achievement_id, request=request)
    132         status_code, payload = self._send_character_request(request, response_class=AddProgressResponse, info_log=info_log)
    133         if status_code == httplib.OK:
    134             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
    135             logger.info(info_log)
    136             return
    137         self._raise_error_and_log(info_log, status_code)
    138 
    139     def admin_add_checklist_progress_request(self, achievement_id, checklist_delta):
    140         if not session.role & ROLE_QA:
    141             return
    142         request = AddProgressRequest(achievement=AchievementDefinitionIdentifier.to_proto(achievement_id), checklist=Checklist.to_proto(checklist_delta))
    143         info_log = 'Admin Request: Add Achievement Progress for achievement {id}: {request}\n'.format(id=achievement_id, request=request)
    144         status_code, payload = self._send_character_request(request, response_class=AddProgressResponse, info_log=info_log)
    145         if status_code == httplib.OK:
    146             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
    147             logger.info(info_log)
    148             return
    149         self._raise_error_and_log(info_log, status_code)
    150 
    151     def admin_add_set_progress_request(self, achievement_id, set_delta):
    152         if not session.role & ROLE_QA:
    153             return
    154         request = AddProgressRequest(achievement=AchievementDefinitionIdentifier.to_proto(achievement_id), unique_item_count=set_delta)
    155         info_log = 'Admin Request: Add Achievement Progress for achievement {id}: {request}\n'.format(id=achievement_id, request=request)
    156         status_code, payload = self._send_character_request(request, response_class=AddProgressResponse, info_log=info_log)
    157         if status_code == httplib.OK:
    158             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
    159             logger.info(info_log)
    160             return
    161         self._raise_error_and_log(info_log, status_code)
    162 
    163     def admin_complete_achievement_request(self, achievement_id):
    164         if not session.role & ROLE_QA:
    165             return
    166         request = CompleteRequest(achievement=AchievementDefinitionIdentifier.to_proto(achievement_id))
    167         info_log = 'Admin Request: Complete Achievement: {request}\n'.format(request=request)
    168         status_code, payload = self._send_character_request(request, response_class=CompleteResponse, info_log=info_log)
    169         if status_code == httplib.OK:
    170             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
    171             logger.info(info_log)
    172             return
    173         self._raise_error_and_log(info_log, status_code)
    174 
    175     def admin_reset_achievement_request(self, achievement_id):
    176         if not session.role & ROLE_QA:
    177             return
    178         request = ResetRequest(achievement=AchievementDefinitionIdentifier.to_proto(achievement_id))
    179         info_log = 'Admin Request: Reset Achievement: {request}\n'.format(request=request)
    180         status_code, payload = self._send_character_request(request, response_class=ResetResponse, info_log=info_log)
    181         if status_code == httplib.OK:
    182             info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload)
    183             logger.info(info_log)
    184             return
    185         self._raise_error_and_log(info_log, status_code)
    186 
    187     def _send_character_request(self, request, response_class, info_log, timeout_seconds = 10, max_attempts = 1):
    188         try:
    189             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)
    190         except (TimeoutException, UnpackException) as exc:
    191             error_info = 'ERROR: %s' % exc.__class__.__name__
    192             info_log += error_info
    193             logger.info(info_log)
    194             request_cls = request.__class__.__name__
    195             raise ServiceUnavailableError('%s, Failed to receive response from %s: %s' % (error_info, request_cls, exc))
    196 
    197         return (response_primitive.status_code, response)
    198 
    199     def _send_user_request(self, request, response_class, info_log, timeout_seconds = 10, max_attempts = 1):
    200         try:
    201             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)
    202         except (TimeoutException, UnpackException) as exc:
    203             error_info = 'ERROR: %s' % exc.__class__.__name__
    204             info_log += error_info
    205             logger.info(info_log)
    206             request_cls = request.__class__.__name__
    207             raise ServiceUnavailableError('%s, Failed to receive response from %s: %s' % (error_info, request_cls, exc))
    208 
    209         return (response_primitive.status_code, response)
    210 
    211     @staticmethod
    212     def _raise_error_and_log(info_text, status_code):
    213         info_text += 'ERROR: %s(%s)\n' % (httplib.responses[status_code], status_code)
    214         logger.info(info_text)
    215         if status_code == httplib.INTERNAL_SERVER_ERROR:
    216             raise GenericInternalServerError(info_text)
    217         if status_code == httplib.GONE:
    218             raise RewardAlreadyClaimedError(info_text)
    219         raise GenericError(info_text)