ffxivbis/src/service/models/bis.py

55 lines
1.6 KiB
Python

#
# 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
#
import itertools
from dataclasses import dataclass
from typing import Dict, List, Optional, Union
from .piece import Piece
from .upgrade import Upgrade
@dataclass
class BiS:
weapon: Optional[Piece] = None
head: Optional[Piece] = None
body: Optional[Piece] = None
hands: Optional[Piece] = None
waist: Optional[Piece] = None
legs: Optional[Piece] = None
feet: Optional[Piece] = None
ears: Optional[Piece] = None
neck: Optional[Piece] = None
wrist: Optional[Piece] = None
left_ring: Optional[Piece] = None
right_ring: Optional[Piece] = None
def has_piece(self, piece: Union[Piece, Upgrade]) -> bool:
if isinstance(piece, Piece):
return piece in self.pieces
elif isinstance(piece, Upgrade):
return self.upgrades_required.get(piece) is not None
return False
@property
def pieces(self) -> List[Piece]:
return [piece for piece in self.__dict__.values() if isinstance(piece, Piece)]
@property
def upgrades_required(self) -> Dict[Upgrade, int]:
return {
upgrade: len(list(pieces))
for upgrade, pieces in itertools.groupby(self.pieces, lambda piece: piece.upgrade)
}
def set_item(self, piece: Union[Piece, Upgrade]) -> None:
setattr(self, piece.name, piece)
def remove_item(self, piece: Union[Piece, Upgrade]) -> None:
setattr(self, piece.name, None)