split apis

This commit is contained in:
Evgenii Alekseev 2019-09-06 02:33:16 +03:00
parent 608854dad7
commit 52a3c7fee7
13 changed files with 180 additions and 75 deletions

5
setup.cfg Normal file
View File

@ -0,0 +1,5 @@
[aliases]
test=pytest
[tool:pytest]
addopts = --verbose --pyargs .

View File

@ -25,7 +25,9 @@ setup(
packages=find_packages(exclude=['contrib', 'docs', 'tests']), packages=find_packages(exclude=['contrib', 'docs', 'tests']),
install_requires=[ install_requires=[
'aiohttp_jinja2',
'aiohttp', 'aiohttp',
'Jinja2',
'requests', 'requests',
'yoyo_migrations' 'yoyo_migrations'
], ],

View File

@ -8,9 +8,9 @@
# #
from aiohttp.web import Application from aiohttp.web import Application
from .views.bis import BiSView from service.api.views.api.bis import BiSView
from .views.loot import LootView from service.api.views.api.loot import LootView
from .views.player import PlayerView from service.api.views.api.player import PlayerView
def setup_routes(app: Application) -> None: def setup_routes(app: Application) -> None:

View File

View File

@ -6,28 +6,21 @@
# #
# License: 3-clause BSD, see https://opensource.org/licenses/BSD-3-Clause # License: 3-clause BSD, see https://opensource.org/licenses/BSD-3-Clause
# #
from aiohttp.web import Response, View from aiohttp.web import Response
from typing import Iterable, Optional
from service.core.ariyala_parser import AriyalaParser
from service.models.job import Job from service.models.job import Job
from service.models.piece import Piece from service.models.piece import Piece
from service.models.player import Player, PlayerId from service.models.player import PlayerId
from ..utils import wrap_exception, wrap_invalid_param, wrap_json from service.api.utils import wrap_exception, wrap_invalid_param, wrap_json
from service.api.views.common.bis_base import BiSBaseView
class BiSView(View): class BiSView(BiSBaseView):
async def get(self) -> Response: async def get(self) -> Response:
try: try:
nick = self.request.query.getone('nick', None) loot = self.bis_get(self.request.query.getone('nick', None))
party: Iterable[Player] = [
player
for player in self.request.app['party'].party
if nick is None or player.nick == nick
]
loot = list(sum([player.bis.pieces for player in party], []))
except Exception as e: except Exception as e:
self.request.app.logger.exception('could not get bis') self.request.app.logger.exception('could not get bis')
@ -44,18 +37,15 @@ class BiSView(View):
required = ['action', 'is_tome', 'job', 'nick', 'piece'] required = ['action', 'is_tome', 'job', 'nick', 'piece']
if any(param not in data for param in required): if any(param not in data for param in required):
return wrap_invalid_param(required, data) return wrap_invalid_param(required, data)
player_id = PlayerId(Job[data['job']], data['nick'])
action = data.get('action') action = data.get('action')
if action not in ('add', 'remove'): if action not in ('add', 'remove'):
return wrap_invalid_param(['action'], data) return wrap_invalid_param(['action'], data)
try: try:
piece = Piece.get(data) # type: ignore player_id = PlayerId(Job[data['job']], data['nick'])
if action == 'add': piece: Piece = Piece.get(data) # type: ignore
self.request.app['party'].set_item_bis(player_id, piece) self.bis_post(action, player_id, piece)
elif action == 'remove':
self.request.app['party'].remove_item_bis(player_id, piece)
except Exception as e: except Exception as e:
self.request.app.logger.exception('could not add bis') self.request.app.logger.exception('could not add bis')
@ -72,17 +62,13 @@ class BiSView(View):
required = ['job', 'link', 'nick'] required = ['job', 'link', 'nick']
if any(param not in data for param in required): if any(param not in data for param in required):
return wrap_invalid_param(required, data) return wrap_invalid_param(required, data)
player_id = PlayerId(Job[data['job']], data['nick'])
try: try:
parser = AriyalaParser(self.request.app['config']) player_id = PlayerId(Job[data['job']], data['nick'])
items = parser.get(data['link']) link = self.bis_put(player_id, data['link'])
for piece in items:
self.request.app['party'].set_item_bis(player_id, piece)
self.request.app['party'].set_bis_link(player_id, data['link'])
except Exception as e: except Exception as e:
self.request.app.logger.exception('could not parse bis') self.request.app.logger.exception('could not parse bis')
return wrap_exception(e, data) return wrap_exception(e, data)
return wrap_json({'link': data['link']}, data) return wrap_json({'link': link}, data)

View File

@ -6,27 +6,21 @@
# #
# License: 3-clause BSD, see https://opensource.org/licenses/BSD-3-Clause # License: 3-clause BSD, see https://opensource.org/licenses/BSD-3-Clause
# #
from aiohttp.web import Response, View from aiohttp.web import Response
from typing import Iterable
from service.models.job import Job from service.models.job import Job
from service.models.piece import Piece from service.models.piece import Piece
from service.models.player import Player, PlayerId from service.models.player import PlayerId
from ..utils import wrap_exception, wrap_invalid_param, wrap_json from service.api.utils import wrap_exception, wrap_invalid_param, wrap_json
from service.api.views.common.loot_base import LootBaseView
class LootView(View): class LootView(LootBaseView):
async def get(self) -> Response: async def get(self) -> Response:
try: try:
nick = self.request.query.getone('nick', None) loot = self.loot_get(self.request.query.getone('nick', None))
party: Iterable[Player] = [
player
for player in self.request.app['party'].party
if nick is None or player.nick == nick
]
loot = list(sum([player.loot for player in party], []))
except Exception as e: except Exception as e:
self.request.app.logger.exception('could not get loot') self.request.app.logger.exception('could not get loot')
@ -50,11 +44,8 @@ class LootView(View):
try: try:
player_id = PlayerId(Job[data['job']], data['nick']) player_id = PlayerId(Job[data['job']], data['nick'])
piece = Piece.get(data) piece: Piece = Piece.get(data) # type: ignore
if action == 'add': self.loot_post(action, player_id, piece)
self.request.app['party'].set_item(player_id, piece)
elif action == 'remove':
self.request.app['party'].remove_item(player_id, piece)
except Exception as e: except Exception as e:
self.request.app.logger.exception('could not add loot') self.request.app.logger.exception('could not add loot')
@ -73,8 +64,8 @@ class LootView(View):
return wrap_invalid_param(required, data) return wrap_invalid_param(required, data)
try: try:
piece = Piece.get(data) piece: Piece = Piece.get(data) # type: ignore
players = self.request.app['loot'].suggest(piece) players = self.loot_put(piece)
except Exception as e: except Exception as e:
self.request.app.logger.exception('could not suggest loot') self.request.app.logger.exception('could not suggest loot')

View File

@ -6,27 +6,19 @@
# #
# License: 3-clause BSD, see https://opensource.org/licenses/BSD-3-Clause # License: 3-clause BSD, see https://opensource.org/licenses/BSD-3-Clause
# #
from aiohttp.web import Response, View from aiohttp.web import Response
from typing import Iterable
from service.core.ariyala_parser import AriyalaParser
from service.models.bis import BiS
from service.models.job import Job from service.models.job import Job
from service.models.player import Player, PlayerId
from ..utils import wrap_exception, wrap_invalid_param, wrap_json from service.api.utils import wrap_exception, wrap_invalid_param, wrap_json
from service.api.views.common.player_base import PlayerBaseView
class PlayerView(View): class PlayerView(PlayerBaseView):
async def get(self) -> Response: async def get(self) -> Response:
try: try:
nick = self.request.query.getone('nick', None) party = self.player_get(self.request.query.getone('nick', None))
party: Iterable[Player] = [
player
for player in self.request.app['party'].party
if nick is None or player.nick == nick
]
except Exception as e: except Exception as e:
self.request.app.logger.exception('could not get loot') self.request.app.logger.exception('could not get loot')
@ -51,20 +43,7 @@ class PlayerView(View):
return wrap_invalid_param(['action'], data) return wrap_invalid_param(['action'], data)
try: try:
if action == 'add': player_id = self.player_post(action, Job[data['job']], data['nick'], link, priority)
player = Player(Job[data['job']], data['nick'], BiS(), [], link, priority)
player_id = player.player_id
self.request.app['party'].set_player(player)
if link is not None:
parser = AriyalaParser(self.request.app['config'])
items = parser.get(link)
for piece in items:
self.request.app['party'].set_item_bis(player_id, piece)
elif action == 'remove':
player_id = PlayerId(Job[data['job']], data['nick'])
self.request.app['party'].remove_player(player_id)
except Exception as e: except Exception as e:
self.request.app.logger.exception('could not add loot') self.request.app.logger.exception('could not add loot')

View File

View File

@ -0,0 +1,48 @@
#
# 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
#
from aiohttp.web import View
from typing import List, Optional
from service.core.ariyala_parser import AriyalaParser
from service.models.piece import Piece
from service.models.player import PlayerId
class BiSBaseView(View):
def bis_add(self, player_id: PlayerId, piece: Piece) -> Piece:
self.request.app['party'].set_item_bis(player_id, piece)
return piece
def bis_get(self, nick: Optional[str]) -> List[Piece]:
party = [
player
for player in self.request.app['party'].party
if nick is None or player.nick == nick
]
return list(sum([player.bis.pieces for player in party], []))
def bis_post(self, action: str, player_id: PlayerId, piece: Piece) -> Optional[Piece]:
if action == 'add':
return self.bis_add(player_id, piece)
elif action == 'remove':
return self.bis_remove(player_id, piece)
return None
def bis_put(self, player_id: PlayerId, link: str) -> str:
parser = AriyalaParser(self.request.app['config'])
items = parser.get(link)
for piece in items:
self.request.app['party'].set_item_bis(player_id, piece)
self.request.app['party'].set_bis_link(player_id, link)
return link
def bis_remove(self, player_id: PlayerId, piece: Piece) -> Piece:
self.request.app['party'].remove_item_bis(player_id, piece)
return piece

View File

@ -0,0 +1,42 @@
#
# 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
#
from aiohttp.web import View
from typing import List, Optional
from service.models.piece import Piece
from service.models.player import PlayerId, PlayerIdWithCounters
class LootBaseView(View):
def loot_add(self, player_id: PlayerId, piece: Piece) -> Piece:
self.request.app['party'].set_item(player_id, piece)
return piece
def loot_get(self, nick: Optional[str]) -> List[Piece]:
party = [
player
for player in self.request.app['party'].party
if nick is None or player.nick == nick
]
return list(sum([player.loot for player in party], []))
def loot_post(self, action: str, player_id: PlayerId, piece: Piece) -> Optional[Piece]:
if action == 'add':
return self.loot_add(player_id, piece)
elif action == 'remove':
return self.loot_remove(player_id, piece)
return None
def loot_put(self, piece: Piece) -> List[PlayerIdWithCounters]:
return self.request.app['loot'].suggest(piece)
def loot_remove(self, player_id: PlayerId, piece: Piece) -> Piece:
self.request.app['party'].remove_item(player_id, piece)
return piece

View File

@ -0,0 +1,50 @@
#
# 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
#
from aiohttp.web import View
from typing import List, Optional
from service.core.ariyala_parser import AriyalaParser
from service.models.bis import BiS
from service.models.job import Job
from service.models.player import Player, PlayerId
class PlayerBaseView(View):
def player_add(self, job: Job, nick: str, link: Optional[str], priority: int) -> PlayerId:
player = Player(job, nick, BiS(), [], link, priority)
player_id = player.player_id
self.request.app['party'].set_player(player)
if link is not None:
parser = AriyalaParser(self.request.app['config'])
items = parser.get(link)
for piece in items:
self.request.app['party'].set_item_bis(player_id, piece)
return player_id
def player_get(self, nick: Optional[str]) -> List[Player]:
return [
player
for player in self.request.app['party'].party
if nick is None or player.nick == nick
]
def player_post(self, action: str, job: Job, nick: str, link: Optional[str], priority: int) -> Optional[PlayerId]:
if action == 'add':
return self.player_add(job, nick, link, priority)
elif action == 'remove':
return self.player_remove(job, nick)
return None
def player_remove(self, job: Job, nick: str) -> PlayerId:
player_id = PlayerId(job, nick)
self.request.app['party'].remove_player(player_id)
return player_id

View File

View File

@ -30,6 +30,8 @@ class Configuration(configparser.RawConfigParser):
self.read(os.path.join(self.include, conf)) self.read(os.path.join(self.include, conf))
def __with_root_path(self, path: str) -> str: def __with_root_path(self, path: str) -> str:
if self.root_path is None:
return path
return os.path.join(self.root_path, path) return os.path.join(self.root_path, path)
def get_section(self, section: str) -> Dict[str, str]: def get_section(self, section: str) -> Dict[str, str]: