mirror of
https://github.com/arcan1s/ffxivbis.git
synced 2025-07-01 08:05:46 +00:00
replace requests by aiohttp
This commit is contained in:
@ -63,7 +63,6 @@ and add new password to configuration.
|
|||||||
Settings related to ariyala parser.
|
Settings related to ariyala parser.
|
||||||
|
|
||||||
* `ariyala_url`: ariyala base url, string, required.
|
* `ariyala_url`: ariyala base url, string, required.
|
||||||
* `request_timeout`: xivapi request timeout, float, optional, default 30.
|
|
||||||
* `xivapi_key`: xivapi developer key, string, optional.
|
* `xivapi_key`: xivapi developer key, string, optional.
|
||||||
* `xivapi_url`: xivapi base url, string, required.
|
* `xivapi_url`: xivapi base url, string, required.
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
[ariyala]
|
[ariyala]
|
||||||
ariyala_url = https://ffxiv.ariyala.com
|
ariyala_url = https://ffxiv.ariyala.com
|
||||||
request_timeout = 1
|
|
||||||
xivapi_url = https://xivapi.com
|
xivapi_url = https://xivapi.com
|
||||||
|
1
setup.py
1
setup.py
@ -33,7 +33,6 @@ setup(
|
|||||||
'iniherit',
|
'iniherit',
|
||||||
'Jinja2',
|
'Jinja2',
|
||||||
'passlib',
|
'passlib',
|
||||||
'requests',
|
|
||||||
'yoyo_migrations'
|
'yoyo_migrations'
|
||||||
],
|
],
|
||||||
setup_requires=[
|
setup_requires=[
|
||||||
|
@ -38,7 +38,7 @@ class BiSBaseView(View):
|
|||||||
|
|
||||||
async def bis_put(self, player_id: PlayerId, link: str) -> BiS:
|
async def bis_put(self, player_id: PlayerId, link: str) -> BiS:
|
||||||
parser = AriyalaParser(self.request.app['config'])
|
parser = AriyalaParser(self.request.app['config'])
|
||||||
items = parser.get(link, player_id.job.name)
|
items = await parser.get(link, player_id.job.name)
|
||||||
for piece in items:
|
for piece in items:
|
||||||
await self.request.app['party'].set_item_bis(player_id, piece)
|
await self.request.app['party'].set_item_bis(player_id, piece)
|
||||||
await self.request.app['party'].set_bis_link(player_id, link)
|
await self.request.app['party'].set_bis_link(player_id, link)
|
||||||
|
@ -24,7 +24,7 @@ class PlayerBaseView(View):
|
|||||||
|
|
||||||
if link:
|
if link:
|
||||||
parser = AriyalaParser(self.request.app['config'])
|
parser = AriyalaParser(self.request.app['config'])
|
||||||
items = parser.get(link, job.name)
|
items = await parser.get(link, job.name)
|
||||||
for piece in items:
|
for piece in items:
|
||||||
await self.request.app['party'].set_item_bis(player_id, piece)
|
await self.request.app['party'].set_item_bis(player_id, piece)
|
||||||
|
|
||||||
|
@ -7,8 +7,9 @@
|
|||||||
# License: 3-clause BSD, see https://opensource.org/licenses/BSD-3-Clause
|
# License: 3-clause BSD, see https://opensource.org/licenses/BSD-3-Clause
|
||||||
#
|
#
|
||||||
import os
|
import os
|
||||||
import requests
|
import socket
|
||||||
|
|
||||||
|
from aiohttp import ClientSession
|
||||||
from typing import Dict, List, Optional
|
from typing import Dict, List, Optional
|
||||||
|
|
||||||
from ffxivbis.models.piece import Piece
|
from ffxivbis.models.piece import Piece
|
||||||
@ -22,7 +23,6 @@ class AriyalaParser:
|
|||||||
self.ariyala_url = config.get('ariyala', 'ariyala_url')
|
self.ariyala_url = config.get('ariyala', 'ariyala_url')
|
||||||
self.xivapi_key = config.get('ariyala', 'xivapi_key', fallback=None)
|
self.xivapi_key = config.get('ariyala', 'xivapi_key', fallback=None)
|
||||||
self.xivapi_url = config.get('ariyala', 'xivapi_url')
|
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]:
|
def __remap_key(self, key: str) -> Optional[str]:
|
||||||
if key == 'mainhand':
|
if key == 'mainhand':
|
||||||
@ -37,19 +37,20 @@ class AriyalaParser:
|
|||||||
return key
|
return key
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def get(self, url: str, job: str) -> List[Piece]:
|
async def get(self, url: str, job: str) -> List[Piece]:
|
||||||
items = self.get_ids(url, job)
|
items = await self.get_ids(url, job)
|
||||||
return [
|
return [
|
||||||
Piece.get({'piece': slot, 'is_tome': self.get_is_tome(item_id)}) # type: ignore
|
Piece.get({'piece': slot, 'is_tome': await self.get_is_tome(item_id)}) # type: ignore
|
||||||
for slot, item_id in items.items()
|
for slot, item_id in items.items()
|
||||||
]
|
]
|
||||||
|
|
||||||
def get_ids(self, url: str, job: str) -> Dict[str, int]:
|
async def get_ids(self, url: str, job: str) -> Dict[str, int]:
|
||||||
norm_path = os.path.normpath(url)
|
norm_path = os.path.normpath(url)
|
||||||
set_id = os.path.basename(norm_path)
|
set_id = os.path.basename(norm_path)
|
||||||
response = requests.get(f'{self.ariyala_url}/store.app', params={'identifier': set_id})
|
async with ClientSession() as session:
|
||||||
response.raise_for_status()
|
async with session.get(f'{self.ariyala_url}/store.app', params={'identifier': set_id}) as response:
|
||||||
data = response.json()
|
response.raise_for_status()
|
||||||
|
data = await response.json(content_type='text/html')
|
||||||
|
|
||||||
# it has job in response but for some reasons job name differs sometimes from one in dictionary,
|
# 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
|
# e.g. http://ffxiv.ariyala.com/store.app?identifier=1AJB8
|
||||||
@ -67,13 +68,16 @@ class AriyalaParser:
|
|||||||
result[key] = value
|
result[key] = value
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def get_is_tome(self, item_id: int) -> bool:
|
async def get_is_tome(self, item_id: int) -> bool:
|
||||||
params = {'columns': 'IsEquippable'}
|
params = {'columns': 'IsEquippable'}
|
||||||
if self.xivapi_key is not None:
|
if self.xivapi_key is not None:
|
||||||
params['private_key'] = self.xivapi_key
|
params['private_key'] = self.xivapi_key
|
||||||
|
|
||||||
response = requests.get(f'{self.xivapi_url}/item/{item_id}', params=params, timeout=self.request_timeout)
|
async with ClientSession() as session:
|
||||||
response.raise_for_status()
|
# for some reasons ipv6 does not work for me
|
||||||
data = response.json()
|
session.connector._family = socket.AF_INET # type: ignore
|
||||||
|
async with session.get(f'{self.xivapi_url}/item/{item_id}', params=params) as response:
|
||||||
|
response.raise_for_status()
|
||||||
|
data = await response.json()
|
||||||
|
|
||||||
return data['IsEquippable'] == 0 # don't ask
|
return data['IsEquippable'] == 0 # don't ask
|
||||||
|
@ -5,7 +5,7 @@ from ffxivbis.models.piece import Piece
|
|||||||
from ffxivbis.models.player import Player
|
from ffxivbis.models.player import Player
|
||||||
|
|
||||||
|
|
||||||
def test_get(parser: AriyalaParser, player: Player, bis_link: str, bis_set: List[Piece]) -> None:
|
async def test_get(parser: AriyalaParser, player: Player, bis_link: str, bis_set: List[Piece]) -> None:
|
||||||
items = parser.get(bis_link, player.job.name)
|
items = await parser.get(bis_link, player.job.name)
|
||||||
|
|
||||||
assert items == bis_set
|
assert items == bis_set
|
||||||
|
Reference in New Issue
Block a user