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)