ffxivbis/src/service/api/views/loot.py
2019-09-06 00:54:27 +03:00

76 lines
2.5 KiB
Python

from aiohttp.web import Response, View
from typing import Iterable
from service.models.job import Job
from service.models.piece import Piece
from service.models.player import Player, PlayerId
from ..utils import wrap_exception, wrap_invalid_param, wrap_json
class LootView(View):
async def get(self) -> Response:
try:
nick = 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:
self.request.app.logger.exception('could not get loot')
return wrap_exception(e, self.request.query)
return wrap_json(loot, self.request.query)
async def post(self) -> Response:
try:
data = await self.request.json()
except Exception:
data = dict(await self.request.post())
required = ['action', 'is_tome', 'job', 'nick', 'piece']
if any(param not in data for param in required):
return wrap_invalid_param(required, data)
action = data.get('action')
if action not in ('add', 'remove'):
return wrap_invalid_param(['action'], data)
try:
player_id = PlayerId(Job[data['job']], data['nick'])
piece = Piece.get(data)
if action == 'add':
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:
self.request.app.logger.exception('could not add loot')
return wrap_exception(e, data)
return wrap_json({'piece': piece, 'player_id': player_id}, data)
async def put(self) -> Response:
try:
data = await self.request.json()
except Exception:
data = dict(await self.request.post())
required = ['is_tome', 'piece']
if any(param not in data for param in required):
return wrap_invalid_param(required, data)
try:
piece = Piece.get(data)
players = self.request.app['loot'].suggest(piece)
except Exception as e:
self.request.app.logger.exception('could not suggest loot')
return wrap_exception(e, data)
return wrap_json(players, data)