campaigns_messenger.py (13065B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\campaigns\client\v2\messengers\campaigns_messenger.py 2 from __future__ import absolute_import, division, print_function 3 import logging 4 from campaigns.client.errors import CampaignRequestError, CampaignBadRequestError, CampaignNotFoundError, CampaignUnauthorizedError, CampaignForbiddenError, CampaignCommitmentNotRequiredError 5 from campaigns.client.v2.data_model.campaign import CampaignDefinition, CampaignID, CampaignStatus, UpcomingCampaign 6 from campaigns.client.v2.data_model.track import TrackID, TrackStatus 7 from campaigns.client.v2.data_model.track_reward import TrackUnredeemedRewards 8 from eveProto.generated.eve_public.campaign.api.requests_pb2 import GetAllForNamespaceRequest, GetAllForNamespaceResponse, GetLimitsRequest, GetLimitsResponse, GetRequest, GetResponse, GetStatusRequest, GetStatusResponse, GetAllUnredeemedParticipantRewardsRequest, GetAllUnredeemedParticipantRewardsResponse 9 from eveProto.generated.eve_public.public_pb2 import Page 10 from eveProto.generated.eve_public.campaign.objective.api.requests_pb2 import CommitRequest, CommitResponse, ResignRequest, ResignResponse 11 from six.moves.http_client import OK, BAD_REQUEST, NOT_FOUND, UNAUTHORIZED, FORBIDDEN, NOT_ACCEPTABLE, NOT_MODIFIED 12 from stackless_response_router.exceptions import TimeoutException, UnpackException 13 logger = logging.getLogger('campaigns_v2') 14 PAGE_SIZE = 1000 15 16 class CampaignsMessenger(object): 17 18 def __init__(self, public_gateway): 19 self.public_gateway = public_gateway 20 21 def override_gateway(self, public_gateway): 22 self.public_gateway = public_gateway 23 24 def get_all_for_namespace_request(self, namespace): 25 request = GetAllForNamespaceRequest(namespace=namespace.to_proto()) 26 info_log = 'Request: Campaigns: GetAllForNamespaceRequest: {request}\n'.format(request=request) 27 try: 28 response_primitive, response = self.public_gateway.send_blocking_character_request_and_receive_response(request_payload=request, expected_response_class=GetAllForNamespaceResponse, timeout_seconds=4, max_attempts=2, retry_delay_in_seconds=1) 29 except (TimeoutException, UnpackException) as exc: 30 info_log += 'ERROR: %s' % exc.__class__.__name__ 31 logger.info(info_log) 32 raise CampaignRequestError('Failed to receive response from GetAllForNamespaceRequest: %s' % exc) 33 34 status_code = response_primitive.status_code 35 if status_code == NOT_FOUND: 36 raise CampaignNotFoundError('Namespace not found in GetAllForNamespaceRequest: %s' % namespace) 37 if status_code == BAD_REQUEST: 38 raise CampaignBadRequestError('Bad request in GetAllForNamespaceRequest: %s' % namespace) 39 if status_code != OK: 40 raise CampaignRequestError('Received error status code for GetAllForNamespaceResponse: %s' % status_code) 41 info_log += 'Response: Campaigns: GetAllForNamespaceResponse: {response}'.format(response=response) 42 logger.info(info_log) 43 campaign_ids = [ CampaignID.from_proto(identifier) for identifier in response.campaigns ] 44 upcoming = [ UpcomingCampaign.from_proto(namespace, upcoming) for upcoming in response.upcoming_campaigns ] 45 return (campaign_ids, upcoming) 46 47 def get_limits_request(self): 48 request = GetLimitsRequest() 49 info_log = 'Request: Campaigns: GetLimitsRequest: {request}\n'.format(request=request) 50 try: 51 response_primitive, response = self.public_gateway.send_blocking_character_request_and_receive_response(request_payload=request, expected_response_class=GetLimitsResponse, timeout_seconds=4, max_attempts=2, retry_delay_in_seconds=1) 52 except (TimeoutException, UnpackException) as exc: 53 info_log += 'ERROR: %s' % exc.__class__.__name__ 54 logger.info(info_log) 55 raise CampaignRequestError('Failed to receive response from GetLimitsRequest: %s' % exc) 56 57 status_code = response_primitive.status_code 58 if status_code != OK: 59 raise CampaignRequestError('Received error status code for GetLimitsResponse: %s' % status_code) 60 info_log += 'Response: Campaigns: GetLimitsResponse: {response}'.format(response=response) 61 logger.info(info_log) 62 return response.max_active_objectives_per_participant 63 64 def commit_request(self, objective_id): 65 request = CommitRequest(objective=objective_id.to_proto()) 66 info_log = 'Request: Campaigns: CommitRequest: {request}\n'.format(request=request) 67 try: 68 response_primitive, response = self.public_gateway.send_blocking_character_request_and_receive_response(request_payload=request, expected_response_class=CommitResponse, timeout_seconds=4, max_attempts=2, retry_delay_in_seconds=1) 69 except (TimeoutException, UnpackException) as exc: 70 info_log += 'ERROR: %s' % exc.__class__.__name__ 71 logger.info(info_log) 72 raise CampaignRequestError('Failed to receive response from CommitRequest: %s' % exc) 73 74 status_code = response_primitive.status_code 75 if status_code == NOT_FOUND: 76 raise CampaignNotFoundError('Could not find requested objective in CommitRequest: %s' % objective_id) 77 if status_code == UNAUTHORIZED: 78 raise CampaignUnauthorizedError('Could not authorize request in CommitRequest: %s' % objective_id) 79 if status_code == BAD_REQUEST: 80 raise CampaignBadRequestError('Bad request in CommitRequest: %s' % objective_id) 81 if status_code == FORBIDDEN: 82 raise CampaignForbiddenError('Cannot commit in CommitRequest: %s' % objective_id) 83 if status_code == NOT_ACCEPTABLE: 84 raise CampaignCommitmentNotRequiredError('Objective does not require commitment in CommitRequest: %s' % objective_id) 85 if status_code != OK: 86 raise CampaignRequestError('Received error status code for CommitRequest: %s' % status_code) 87 info_log += 'Response: Campaigns: CommitResponse: {response}'.format(response=response) 88 logger.info(info_log) 89 90 def resign_request(self, objective_id): 91 request = ResignRequest(objective=objective_id.to_proto()) 92 info_log = 'Request: Campaigns: ResignRequest: {request}\n'.format(request=request) 93 try: 94 response_primitive, response = self.public_gateway.send_blocking_character_request_and_receive_response(request_payload=request, expected_response_class=ResignResponse, timeout_seconds=4, max_attempts=2, retry_delay_in_seconds=1) 95 except (TimeoutException, UnpackException) as exc: 96 info_log += 'ERROR: %s' % exc.__class__.__name__ 97 logger.info(info_log) 98 raise CampaignRequestError('Failed to receive response from ResignRequest: %s' % exc) 99 100 status_code = response_primitive.status_code 101 if status_code == NOT_FOUND: 102 raise CampaignNotFoundError('Could not find requested objective in ResignRequest: %s' % objective_id) 103 if status_code == UNAUTHORIZED: 104 raise CampaignUnauthorizedError('Could not authorize request in ResignRequest: %s' % objective_id) 105 if status_code == BAD_REQUEST: 106 raise CampaignBadRequestError('Bad request in ResignRequest: %s' % objective_id) 107 if status_code == FORBIDDEN: 108 raise CampaignForbiddenError('Cannot resign in ResignRequest: %s' % objective_id) 109 if status_code != OK: 110 raise CampaignRequestError('Received error status code for ResignRequest: %s' % status_code) 111 info_log += 'Response: Campaigns: ResignResponse: {response}'.format(response=response) 112 logger.info(info_log) 113 114 def get_request(self, campaign_id, current_version = None): 115 request = GetRequest(campaign=campaign_id.to_proto()) 116 if current_version is None: 117 request.no_version = True 118 else: 119 request.version.MergeFrom(current_version.to_proto()) 120 info_log = 'Request: Campaigns: GetRequest: {request}\n'.format(request=request) 121 try: 122 response_primitive, response = self.public_gateway.send_blocking_character_request_and_receive_response(request_payload=request, expected_response_class=GetResponse, timeout_seconds=4, max_attempts=2, retry_delay_in_seconds=1) 123 except (TimeoutException, UnpackException) as exc: 124 info_log += 'ERROR: %s' % exc.__class__.__name__ 125 logger.info(info_log) 126 raise CampaignRequestError('Failed to receive response from GetRequest: %s' % exc) 127 128 status_code = response_primitive.status_code 129 if status_code == NOT_MODIFIED: 130 logger.info(info_log + 'Response: Campaigns: GetResponse: NOT_MODIFIED') 131 return NOT_MODIFIED 132 if status_code == NOT_FOUND: 133 raise CampaignNotFoundError('Could not find requested campaign in GetRequest: %s' % campaign_id) 134 if status_code == BAD_REQUEST: 135 raise CampaignBadRequestError('Bad request in GetRequest: %s' % campaign_id) 136 if status_code != OK: 137 raise CampaignRequestError('Received error status code for GetRequest: %s' % status_code) 138 info_log += 'Response: Campaigns: GetResponse: {response}'.format(response=response) 139 logger.info(info_log) 140 campaign_definition = CampaignDefinition.from_proto(campaign_id, response) 141 campaign_status = None 142 if response.HasField('stats'): 143 campaign_status = CampaignStatus.from_get_proto(campaign_id, response) 144 track_statuses = [ TrackStatus.from_get_proto(track) for track in response.tracks if track.HasField('stats') ] 145 return (campaign_definition, campaign_status, track_statuses) 146 147 def get_status_request(self, campaign_id): 148 request = GetStatusRequest(campaign=campaign_id.to_proto()) 149 info_log = 'Request: Campaigns: GetStatusRequest: {request}\n'.format(request=request) 150 try: 151 response_primitive, response = self.public_gateway.send_blocking_character_request_and_receive_response(request_payload=request, expected_response_class=GetStatusResponse, timeout_seconds=4, max_attempts=2, retry_delay_in_seconds=1) 152 except (TimeoutException, UnpackException) as exc: 153 info_log += 'ERROR: %s' % exc.__class__.__name__ 154 logger.info(info_log) 155 raise CampaignRequestError('Failed to receive response from GetStatusRequest: %s' % exc) 156 157 status_code = response_primitive.status_code 158 if status_code == NOT_FOUND: 159 raise CampaignNotFoundError('Could not find requested campaign in GetStatusRequest: %s' % campaign_id) 160 if status_code == BAD_REQUEST: 161 raise CampaignBadRequestError('Bad request in GetStatusRequest: %s' % campaign_id) 162 if status_code != OK: 163 raise CampaignRequestError('Received error status code for GetStatusRequest: %s' % status_code) 164 info_log += 'Response: Campaigns: GetStatusResponse: {response}'.format(response=response) 165 logger.info(info_log) 166 return (CampaignStatus.from_status_proto(campaign_id, response), [ TrackStatus.from_status_proto(track) for track in response.tracks ]) 167 168 def get_all_unredeemed_participant_rewards_request(self, namespace, page_token = None): 169 request = GetAllUnredeemedParticipantRewardsRequest(namespace=namespace.to_proto(), page=Page(size=PAGE_SIZE, token=page_token or '')) 170 info_log = 'Request: Campaigns: GetAllUnredeemedParticipantRewardsRequest: {request}\n'.format(request=request) 171 try: 172 response_primitive, response = self.public_gateway.send_blocking_character_request_and_receive_response(request_payload=request, expected_response_class=GetAllUnredeemedParticipantRewardsResponse, timeout_seconds=4, max_attempts=2, retry_delay_in_seconds=1) 173 except (TimeoutException, UnpackException) as exc: 174 info_log += 'ERROR: %s' % exc.__class__.__name__ 175 logger.info(info_log) 176 raise CampaignRequestError('Failed to receive response from GetAllUnredeemedParticipantRewardsRequest: %s' % exc) 177 178 status_code = response_primitive.status_code 179 if status_code == BAD_REQUEST: 180 raise CampaignBadRequestError('Bad request in GetAllUnredeemedParticipantRewardsRequest: %s' % namespace) 181 if status_code == UNAUTHORIZED: 182 raise CampaignUnauthorizedError('Unauthorized in GetAllUnredeemedParticipantRewardsRequest: %s' % namespace) 183 if status_code != OK: 184 raise CampaignRequestError('Received error status code for GetAllUnredeemedParticipantRewardsRequest: %s' % status_code) 185 info_log += 'Response: Campaigns: GetAllUnredeemedParticipantRewardsResponse: {response}'.format(response=response) 186 logger.info(info_log) 187 unredeemed_rewards = [ (TrackID.from_proto(track_rewards.track), TrackUnredeemedRewards.from_proto(track_rewards)) for track_rewards in response.tracks ] 188 return (unredeemed_rewards, response.next_page.token)