ffxivbis/src/service/core/ariyala_parser.py

80 lines
2.7 KiB
Python

#
# Copyright (c) 2019 Evgeniy Alekseev.
#
# This file is part of ffxivbis
# (see https://github.com/arcan1s/ffxivbis).
#
# License: 3-clause BSD, see https://opensource.org/licenses/BSD-3-Clause
#
import os
import requests
from typing import Dict, List, Optional
from service.models.piece import Piece
from .config import Configuration
class AriyalaParser:
def __init__(self, config: Configuration) -> None:
self.ariyala_url = config.get('ariyala', 'ariyala_url')
self.xivapi_key = config.get('ariyala', 'xivapi_key', fallback=None)
self.xivapi_url = config.get('ariyala', 'xivapi_url')
self.request_timeout = config.getfloat('ariyala', 'request_timeout', fallback=30)
def __remap_key(self, key: str) -> Optional[str]:
if key == 'mainhand':
return 'weapon'
elif key == 'chest':
return 'body'
elif key == 'ringLeft':
return 'left_ring'
elif key == 'ringRight':
return 'right_ring'
elif key in ('head', 'hands', 'waist', 'legs', 'feet', 'ears', 'neck', 'wrist'):
return key
return None
def get(self, url: str, job: str) -> List[Piece]:
items = self.get_ids(url, job)
return [
Piece.get({'piece': slot, 'is_tome': self.get_is_tome(item_id)}) # type: ignore
for slot, item_id in items.items()
]
def get_ids(self, url: str, job: str) -> Dict[str, int]:
norm_path = os.path.normpath(url)
set_id = os.path.basename(norm_path)
response = requests.get(f'{self.ariyala_url}/store.app', params={'identifier': set_id})
response.raise_for_status()
data = response.json()
# it has job in response but for some reasons job name differs sometimes from one in dictionary,
# e.g. http://ffxiv.ariyala.com/store.app?identifier=1AJB8
api_job = data['content']
try:
bis = data['datasets'][api_job]['normal']['items']
except KeyError:
bis = data['datasets'][job]['normal']['items']
result: Dict[str, int] = {}
for original_key, value in bis.items():
key = self.__remap_key(original_key)
if key is None:
continue
result[key] = value
return result
def get_is_tome(self, item_id: int) -> bool:
params = {'columns': 'IsEquippable'}
if self.xivapi_key is not None:
params['private_key'] = self.xivapi_key
response = requests.get(f'{self.xivapi_url}/item/{item_id}', params=params, timeout=self.request_timeout)
response.raise_for_status()
data = response.json()
return data['IsEquippable'] == 0 # don't ask