mirror of
https://github.com/arcan1s/ffxivbis.git
synced 2025-04-24 17:27:17 +00:00
76 lines
2.5 KiB
Python
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) |