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

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]