diff --git a/service/const.py b/service/const.py index 79718ded0..bc13bae27 100644 --- a/service/const.py +++ b/service/const.py @@ -46,6 +46,7 @@ class EsiEndpoints(Enum): CHAR_SKILLS = "/v4/characters/{character_id}/skills/" CHAR_FITTINGS = "/v1/characters/{character_id}/fittings/" CHAR_DEL_FIT = "/v1/characters/{character_id}/fittings/{fitting_id}/" + DYNAMIC_ITEM = "/v1/dogma/dynamic/items/{type_id}/{item_id}/" @unique diff --git a/service/esiAccess.py b/service/esiAccess.py index f3495266b..a79321177 100644 --- a/service/esiAccess.py +++ b/service/esiAccess.py @@ -67,12 +67,13 @@ class EsiAccess: # session request stuff self._session = Session() - self._session.headers.update({ + self._basicHeaders = { 'Accept': 'application/json', 'User-Agent': ( 'pyfa v{}'.format(config.version) ) - }) + } + self._session.headers.update(self._basicHeaders) self._session.proxies = NetworkSettings.getInstance().getProxySettingsInRequestsFormat() @property @@ -97,6 +98,9 @@ class EsiAccess: def oauth_token(self): return '%s/oauth/token' % self.sso_url + def getDynamicItem(self, typeID, itemID): + return self.get(None, EsiEndpoints.DYNAMIC_ITEM.value, type_id=typeID, item_id=itemID) + def getSkills(self, char): return self.get(char, EsiEndpoints.CHAR_SKILLS.value, character_id=char.characterID) @@ -236,6 +240,11 @@ class EsiAccess: return json_res def _before_request(self, ssoChar): + self._session.headers.clear() + self._session.headers.update(self._basicHeaders) + if ssoChar is None: + return + if ssoChar.is_token_expired(): pyfalog.info("Refreshing token for {}".format(ssoChar.characterName)) self.refresh(ssoChar) @@ -256,17 +265,17 @@ class EsiAccess: return resp - def get(self, ssoChar, endpoint, *args, **kwargs): + def get(self, ssoChar, endpoint, **kwargs): self._before_request(ssoChar) endpoint = endpoint.format(**kwargs) return self._after_request(self._session.get("{}{}".format(self.esi_url, endpoint))) - def post(self, ssoChar, endpoint, json, *args, **kwargs): + def post(self, ssoChar, endpoint, json, **kwargs): self._before_request(ssoChar) endpoint = endpoint.format(**kwargs) return self._after_request(self._session.post("{}{}".format(self.esi_url, endpoint), data=json)) - def delete(self, ssoChar, endpoint, *args, **kwargs): + def delete(self, ssoChar, endpoint, **kwargs): self._before_request(ssoChar) endpoint = endpoint.format(**kwargs) return self._after_request(self._session.delete("{}{}".format(self.esi_url, endpoint))) diff --git a/service/port/muta.py b/service/port/muta.py index 3686475fb..f5da3cc33 100644 --- a/service/port/muta.py +++ b/service/port/muta.py @@ -18,9 +18,12 @@ # ============================================================================= +import re + from eos.db.gamedata.queries import getAttributeInfo, getDynamicItem from eos.utils.float import floatUnerr from service.port.shared import fetchItem +from service.esiAccess import EsiAccess def renderMutant(mutant, firstPrefix='', prefix=''): @@ -77,3 +80,23 @@ def parseMutant(lines): continue mutations[attrInfo.ID] = value return baseItem, mutaplasmidItem, mutations + + +def parseDynamicItemString(text): + m = re.search(r'\d+)//(?P\d+)>.+', text) + if m: + typeID = int(m.group('typeid')) + itemID = int(m.group('itemid')) + return typeID, itemID + return None + + +def fetchDynamicItem(dynamicItemData): + typeID, itemID = dynamicItemData + esiData = EsiAccess().getDynamicItem(typeID, itemID).json() + baseItemID = esiData['source_type_id'] + mutaplasmidID = esiData['mutator_type_id'] + attrs = {i['attribute_id']: i['value'] for i in esiData['dogma_attributes']} + baseItem = fetchItem(baseItemID) + mutaplasmid = getDynamicItem(mutaplasmidID) + return baseItem, mutaplasmid, attrs diff --git a/service/port/port.py b/service/port/port.py index edb02bce8..f11a3e6af 100644 --- a/service/port/port.py +++ b/service/port/port.py @@ -41,7 +41,7 @@ from service.port.multibuy import exportMultiBuy from service.port.shared import IPortUser, UserCancelException, processing_notify from service.port.shipstats import exportFitStats from service.port.xml import importXml, exportXml -from service.port.muta import parseMutant +from service.port.muta import parseMutant, parseDynamicItemString, fetchDynamicItem pyfalog = Logger(__name__) @@ -255,6 +255,15 @@ class Port: return "DNA", True, (cls.importDnaAlt(m.group("dna")),) if activeFit is not None: + + # Try to import mutated item from network + dynData = parseDynamicItemString(string) + if dynData is not None: + itemData = fetchDynamicItem(dynData) + if itemData is not None: + baseItem, mutaplasmidItem, mutations = itemData + return "FittingItem", False, ((baseItem, mutaplasmidItem, mutations),) + # Try to import mutated module try: baseItem, mutaplasmidItem, mutations = parseMutant(lines)