from peewee import * import constants as c from src.model.BaseModel import BaseModel from src.model.GroupChat import GroupChat from src.model.User import User from src.model.enums.GameStatus import GameStatus class DocQGame(BaseModel): """ Doc Q Game class """ user: User | ForeignKeyField = ForeignKeyField( User, backref="doc_q_game_users", on_delete="CASCADE", on_update="CASCADE" ) status: GameStatus | SmallIntegerField = SmallIntegerField(default=GameStatus.IN_PROGRESS) correct_choices_index: str | CharField = CharField(max_length=99, null=True) group_chat: GroupChat | ForeignKeyField = ForeignKeyField( GroupChat, null=True, backref="doc_q_game_groups_chats", on_delete="RESTRICT", on_update="CASCADE", ) message_id: int | IntegerField = IntegerField(null=True) belly: int | BigIntegerField = BigIntegerField(null=True) class Meta: db_table = "doc_q_game" @staticmethod def get_total_win_or_loss(user: User, status: GameStatus) -> int: """ Get the total amount of wins or losses a user has param user: The user param status: The status (won or lost) return: The total amount of wins or losses """ return ( DocQGame() .select() .where((DocQGame.user == user) & (DocQGame.status == status)) .count() ) @staticmethod def get_total_belly_won_or_lost(user: User, status: GameStatus) -> int: """ Get the total amount of belly a user has won or lost param user: The user param status: The status (won or lost) return: The total amount of belly won or lost """ return ( DocQGame() .select(fn.SUM(DocQGame.belly)) .where((DocQGame.user == user) & (DocQGame.status == status)) ).scalar() @staticmethod def get_max_won_or_lost(user: User, status: GameStatus) -> "DocQGame": """ Get the DocQGame with the max amount of belly won or lost param user: The user param status: The status (won or lost) return: The max amount of belly won or lost """ return ( DocQGame() .select() .where((DocQGame.user == user) & (DocQGame.status == status)) .order_by(DocQGame.belly.desc()) .first() ) def get_status(self) -> GameStatus: """ Get the status of the game :return: The status of the game """ return GameStatus(self.status) def get_correct_apple_number(self) -> int: """ Get the correct apple number :return: The correct apple number """ return int((str(self.correct_choices_index).split(c.STANDARD_SPLIT_CHAR))[0]) + 1 DocQGame.create_table()