messenger.py (12141B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\sovereignty\resource\client\messenger.py 2 from six.moves import http_client as httplib 3 import eveProto.generated.eve_public.sovereignty.resource.planet.api.requests_pb2 as SovResourcePlanetAPI 4 import eveProto.generated.eve_public.sovereignty.resource.star.api.requests_pb2 as SovResourceStarAPI 5 import eveProto.generated.eve_public.sovereignty.hub.api.requests_pb2 as HubAPI 6 from eveuniverse.security import is_zero_sec_solar_system 7 from publicGateway.grpc.exceptions import GenericException 8 from sovereignty.client.base_external_messenger import BaseClientExternalMessenger 9 from sovereignty.resource.client.data_types import AvailableHubResources, ReagentDefinition, HarvestSplitConfiguration 10 import sovereignty.resource.client.errors as errors 11 from semantic_version import SemanticVersion 12 from sovereignty.resource.shared.planetary_resources_cache import ResourceVersionUnchanged, ResourceVersionNotFound 13 import logging 14 logger = logging.getLogger('sov_resources') 15 TIMEOUT_SECONDS = 10 16 17 class SkyhookNotFoundError(Exception): 18 pass 19 20 21 class SovereigntyResourceMessenger(BaseClientExternalMessenger): 22 23 def __init__(self, public_gateway): 24 super(SovereigntyResourceMessenger, self).__init__(public_gateway) 25 self.public_gateway = public_gateway 26 27 def get_all_planet_definitions(self, current_known_version = None): 28 request = SovResourcePlanetAPI.GetAllDefinitionsRequest() 29 if current_known_version is not None: 30 request.known_version.CopyFrom(current_known_version.to_eve_public_proto()) 31 else: 32 request.no_known_version = True 33 logger.info('get_all_planet_definitions %s', request) 34 try: 35 request_wrapper, response_wrapper, response_payload = self._send_request(request, SovResourcePlanetAPI.GetAllDefinitionsResponse) 36 except GenericException as e: 37 if e.response_primitive.status_code == httplib.NOT_MODIFIED: 38 raise ResourceVersionUnchanged() 39 raise 40 41 logger.info('get_all_planet_definitions response %s', response_payload) 42 power_by_planet, workforce_by_planet, reagents_by_planet = self._parse_definitions(response_payload.definitions) 43 resource_version = SemanticVersion.from_proto(response_payload.version) 44 logger.info('get_all_planet_definitions resource version %s', resource_version) 45 return (power_by_planet, 46 workforce_by_planet, 47 reagents_by_planet, 48 resource_version) 49 50 def get_all_planet_definitions_by_version(self, requested_version): 51 request = SovResourcePlanetAPI.GetDefinitionsVersionRequest() 52 request.version.CopyFrom(requested_version.to_eve_public_proto()) 53 logger.info('get_all_planet_definitions_by_version %s', request) 54 try: 55 request_wrapper, response_wrapper, response_payload = self._send_request(request, SovResourcePlanetAPI.GetDefinitionsVersionResponse) 56 except GenericException as e: 57 if e.response_primitive.status_code == httplib.NOT_FOUND: 58 raise ResourceVersionNotFound() 59 raise 60 61 return self._parse_definitions(response_payload.definitions) 62 63 def _parse_definitions(self, definition_protos): 64 power_by_planet = {} 65 workforce_by_planet = {} 66 reagents_by_planet = {} 67 for definition in definition_protos: 68 power_by_planet[definition.planet.sequential] = definition.power 69 workforce_by_planet[definition.planet.sequential] = definition.workforce 70 reagents_definitions = [] 71 for reagent_definition_response in definition.reagent_definitions: 72 reagent_definition = ReagentDefinition.create_from_proto(reagent_definition_response.reagent_type.sequential, reagent_definition_response.definition) 73 reagents_definitions.append(reagent_definition) 74 75 reagents_by_planet[definition.planet.sequential] = reagents_definitions 76 77 return (power_by_planet, workforce_by_planet, reagents_by_planet) 78 79 def get_all_star_configurations(self): 80 request = SovResourceStarAPI.GetAllConfigurationsRequest() 81 request_wrapper, response_wrapper, response_payload = self._send_request(request, SovResourceStarAPI.GetAllConfigurationsResponse) 82 power_by_star = {} 83 for configuration in response_payload.configurations: 84 power_by_star[configuration.star.sequential] = configuration.power 85 86 return power_by_star 87 88 def get_available_hub_resources(self, hubID): 89 try: 90 request = HubAPI.GetResourcesRequest() 91 request.hub.sequential = hubID 92 request_wrapper, response_wrapper, response_payload = self._send_request(request, HubAPI.GetResourcesResponse) 93 except GenericException as e: 94 if e.response_primitive.status_code == httplib.FORBIDDEN: 95 raise errors.SovGetResourcesResponseForbiddenError(e) 96 raise errors.SovGetResourcesResponseError(e) 97 98 power = response_payload.power 99 workforce = response_payload.workforce 100 return AvailableHubResources(power.allocated, power.available, power.local_harvest, workforce.allocated, workforce.available, workforce.local_harvest) 101 102 def _send_request(self, request, response_class): 103 request_primitive, response_channel = self.public_gateway.send_character_request(request, response_class, TIMEOUT_SECONDS) 104 response_primitive, payload = response_channel.receive() 105 if response_primitive.status_code != httplib.OK: 106 raise GenericException(request_primitive=request_primitive, response_primitive=response_primitive) 107 return (request_primitive, response_primitive, payload) 108 109 110 class FakeResourceExternalMessenger(object): 111 112 def _GetAllPlanetsInSovNull(self): 113 allPlanetsInSovNull = set() 114 for ssID, solarSystem in cfg.mapSystemCache.iteritems(): 115 if not is_zero_sec_solar_system(ssID): 116 continue 117 if getattr(solarSystem, 'factionID', None): 118 continue 119 allPlanetsInSovNull.update(solarSystem.planetItemIDs) 120 121 return allPlanetsInSovNull 122 123 def _GetAllStarsInSovNull(self): 124 from eve.common.script.sys.idCheckers import IsKnownSpaceSystem 125 allStarsInSovNull = set() 126 for ssID, solarSystem in cfg.mapSystemCache.iteritems(): 127 if not is_zero_sec_solar_system(ssID) or not IsKnownSpaceSystem(ssID): 128 continue 129 if getattr(solarSystem, 'factionID', None): 130 continue 131 allStarsInSovNull.add(cfg.mapSolarSystemContentCache[ssID].star.id) 132 133 return allStarsInSovNull 134 135 def get_all_planet_definitions(self): 136 allPlanetsInSovNull = self._GetAllPlanetsInSovNull() 137 fakeData = FakeResourceDataForPlanets() 138 power_data_by_planet = {} 139 workforce_data_by_planet = {} 140 reagent_data_by_planet_id = {} 141 for planetID in allPlanetsInSovNull: 142 planetInfo = fakeData.GetData(planetID) 143 if planetInfo.power: 144 power_data_by_planet[planetID] = planetInfo.power 145 if planetInfo.workforce: 146 workforce_data_by_planet[planetID] = planetInfo.workforce 147 if planetInfo.staticReagents: 148 reagent_data_by_planet_id[planetID] = [planetInfo.staticReagents] 149 150 return (power_data_by_planet, workforce_data_by_planet, reagent_data_by_planet_id) 151 152 def get_all_star_configurations(self): 153 allStarsInSovNull = self._GetAllStarsInSovNull() 154 power_by_star = {} 155 for starID in allStarsInSovNull: 156 power_by_star[starID] = 100 157 158 return power_by_star 159 160 def get_production_state(self, planetID): 161 fakeData = FakeResourceDataForPlanets() 162 planetInfo = fakeData.GetData(planetID) 163 return planetInfo.isProducing 164 165 def get_available_hub_resources(self, hubID): 166 fakeData = FakeResources() 167 return fakeData.GetData(hubID) 168 169 170 class FakePlanetData(object): 171 172 def __init__(self, power, workforce, isProducing): 173 self.power = power 174 self.workforce = workforce 175 self.reagent_type_id = None 176 self.staticReagents = None 177 self.isProducing = isProducing 178 179 180 class FakePlanetDataSplitReagents(object): 181 182 def __init__(self, power, workforce, reagent_type_id, isProducing, secure_amount, unsecure_amount, amount_per_period, period, secure_ratio, secure_capacity, unsecure_capacity): 183 splitStatic = HarvestSplitConfiguration(amount_per_period, period, secure_ratio, secure_capacity, unsecure_capacity) 184 self.power = power 185 self.workforce = workforce 186 self.secure_amount = secure_amount 187 self.insecure_amount = unsecure_amount 188 self.reagent_type_id = reagent_type_id 189 self.staticReagents = ReagentDefinition(reagent_type_id, splitStatic) 190 self.isProducing = isProducing 191 192 193 class FakeResourceDataForPlanets(object): 194 planetInfoByRemainder = {} 195 planetInfoByRemainder[0] = FakePlanetDataSplitReagents(power=None, workforce=None, reagent_type_id=81143, isProducing=True, secure_amount=40, amount_per_period=2001, period=161, secure_ratio=50, secure_capacity=501, unsecure_amount=60, unsecure_capacity=601) 196 planetInfoByRemainder[1] = FakePlanetData(power=100, workforce=0, isProducing=True) 197 planetInfoByRemainder[2] = FakePlanetData(power=0, workforce=500, isProducing=True) 198 planetInfoByRemainder[3] = FakePlanetDataSplitReagents(power=None, workforce=None, reagent_type_id=81144, isProducing=True, secure_amount=10, amount_per_period=1, period=10, secure_ratio=60, secure_capacity=50, unsecure_amount=100, unsecure_capacity=1001) 199 planetInfoByPlanetID = {} 200 planetInfoByPlanetID[40030269] = planetInfoByRemainder[0] 201 planetInfoByPlanetID[40239111] = planetInfoByRemainder[0] 202 planetInfoByPlanetID[40239179] = planetInfoByRemainder[3] 203 planetInfoByPlanetID[40239204] = planetInfoByRemainder[2] 204 planetInfoByPlanetID[40239109] = planetInfoByRemainder[1] 205 planetInfoByPlanetID[40239114] = planetInfoByRemainder[1] 206 planetInfoByPlanetID[40267883] = FakePlanetData(power=0, workforce=500, isProducing=True) 207 planetInfoByPlanetID[40267600] = FakePlanetData(power=0, workforce=400, isProducing=True) 208 planetInfoByPlanetID[40267943] = FakePlanetData(power=0, workforce=375, isProducing=True) 209 planetInfoByPlanetID[40267881] = FakePlanetData(power=0, workforce=200, isProducing=True) 210 planetInfoByPlanetID[40267593] = FakePlanetData(power=0, workforce=150, isProducing=True) 211 planetInfoByPlanetID[40267589] = FakePlanetData(power=0, workforce=100, isProducing=True) 212 planetInfoByPlanetID[40267590] = FakePlanetData(power=0, workforce=50, isProducing=True) 213 planetInfoByPlanetID[40267886] = FakePlanetData(power=100, workforce=0, isProducing=True) 214 planetInfoByPlanetID[40267909] = FakePlanetData(power=50, workforce=0, isProducing=True) 215 planetInfoByPlanetID[40267915] = FakePlanetData(power=25, workforce=0, isProducing=True) 216 planetInfoByPlanetID[40267940] = planetInfoByRemainder[3] 217 planetInfoByPlanetID[40267586] = planetInfoByRemainder[3] 218 planetInfoByPlanetID[40267597] = planetInfoByRemainder[0] 219 planetInfoByPlanetID[40267585] = planetInfoByRemainder[0] 220 221 def GetData(self, planetID): 222 if planetID in self.planetInfoByPlanetID: 223 return self.planetInfoByPlanetID[planetID] 224 return self.planetInfoByRemainder[planetID % 4] 225 226 227 class FakeResources(object): 228 resourcesByRemainder = {} 229 resourcesByRemainder[0] = (100, 5000, 2000, 15000) 230 resourcesByRemainder[1] = (10, 25000, 0, 5000) 231 resourcesByRemainder[2] = (500, 1000, 10, 500) 232 resourcesByRemainder[3] = (220, 7500, 100, 1000) 233 resourcesByHubID = {1016094683696L: resourcesByRemainder[0], 234 1016094694774L: resourcesByRemainder[0]} 235 236 def GetData(self, hubID): 237 if hubID in self.resourcesByHubID: 238 return self.resourcesByHubID[hubID] 239 return self.resourcesByRemainder[hubID % 4]