replace requests by aiohttp

This commit is contained in:
2019-09-15 03:27:29 +03:00
parent 28dabcb44e
commit 2d84459c4d
7 changed files with 21 additions and 20 deletions

View File

@ -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.

View File

@ -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

View File

@ -33,7 +33,6 @@ setup(
'iniherit', 'iniherit',
'Jinja2', 'Jinja2',
'passlib', 'passlib',
'requests',
'yoyo_migrations' 'yoyo_migrations'
], ],
setup_requires=[ setup_requires=[

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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