diff --git a/handlers/player/other_games.py b/handlers/player/other_games.py index 70c6497..f397923 100644 --- a/handlers/player/other_games.py +++ b/handlers/player/other_games.py @@ -10,6 +10,7 @@ from db.models import Campaign, Character, Participation, User from states.other_games import OtherGames from states.other_games_campaign import OtherGamesCampaign +from states.other_games_character import OtherGamesCharacter from utils.character import CharacterData, parse_character_data router = Router() @@ -45,7 +46,12 @@ async def available_campaigns_getter(dialog_manager: DialogManager, **kwargs) -> async def on_character_selected(c: CallbackQuery, b: Button, m: DialogManager, character_id: UUID): - pass + await m.start( + OtherGamesCharacter.preview, + data={ + "character_id": character_id, + }, + ) async def on_available_games(c: CallbackQuery, b: Button, m: DialogManager): diff --git a/handlers/player/other_games_character.py b/handlers/player/other_games_character.py new file mode 100644 index 0000000..6aa90db --- /dev/null +++ b/handlers/player/other_games_character.py @@ -0,0 +1,51 @@ +import json + +from aiogram import Router +from aiogram.types import CallbackQuery +from aiogram_dialog import Dialog, DialogManager, Window +from aiogram_dialog.widgets.kbd import Button, Cancel +from aiogram_dialog.widgets.media import DynamicMedia +from aiogram_dialog.widgets.text import Const, Format + +from db.models import Campaign, Character, Participation, User +from services.character_data import character_preview_getter +from states.other_games_campaign import OtherGamesCampaign +from states.other_games_character import OtherGamesCharacter + +router = Router() + + +async def character_data_getter(dialog_manager: DialogManager, **kwargs) -> dict: + character = await Character.get(id=dialog_manager.start_data["character_id"]) + data = json.loads(character.data["data"]) + + return character_preview_getter(character, data) + + +async def on_campaign_info(c: CallbackQuery, b: Button, m: DialogManager): + user: User = m.middleware_data["user"] + character = await Character.get(id=m.start_data["character_id"]).prefetch_related("campaign") + campaign: Campaign = character.campaign + participation = await Participation.get(user=user, campaign=campaign) + await m.start( + OtherGamesCampaign.preview, + data={ + **m.start_data, + "campaign_id": campaign.id, + "participation_id": participation.id, + }, + ) + + +router.include_router( + Dialog( + Window( + DynamicMedia("avatar", when="avatar"), + Format("{character_data_preview}", when="character_data_preview"), + Button(Const("Информация о кампании"), id="campaign_info", on_click=on_campaign_info), + Cancel(Const("Назад")), + getter=character_data_getter, + state=OtherGamesCharacter.preview, + ) + ) +) diff --git a/services/character_data.py b/services/character_data.py index 5582257..30ae6f2 100644 --- a/services/character_data.py +++ b/services/character_data.py @@ -3,7 +3,6 @@ from aiogram.enums import ContentType from aiogram_dialog.api.entities import MediaAttachment -from db.models import User from db.models.base import CharacterData as BaseCharacterData from utils.character import CharacterData, parse_character_data @@ -15,7 +14,7 @@ async def update_char_data(holder: BaseCharacterData, data: dict): await holder.save() -def character_preview_getter(user: User, data: dict): +def character_preview_getter(user: BaseCharacterData, data: dict): ret = {} info: CharacterData = parse_character_data(data) ret["character_data_preview"] = info.preview() diff --git a/states/other_games_character.py b/states/other_games_character.py new file mode 100644 index 0000000..7ec648e --- /dev/null +++ b/states/other_games_character.py @@ -0,0 +1,5 @@ +from aiogram.fsm.state import State, StatesGroup + + +class OtherGamesCharacter(StatesGroup): + preview = State()