from aiogram.filters import Command from aiogram.fsm.context import FSMContext from aiogram.fsm.state import State, StatesGroup from aiogram.types import * from aiogram import Router, F from models.Character import Character from repos.dao import DAO router = Router() class States(StatesGroup): char_wait_name = State() char_wait_bio = State() @router.message(F.document, Command("add_char")) async def add_char(message: Message, state: FSMContext, dao: DAO): if not message.document.mime_type.startswith("image/"): await message.answer("❌ Пожалуйста, отправьте файл изображения (png/jpg).") return await state.set_data({"photo": message.document.file_id}) await state.set_state(States.char_wait_name) await message.answer("Кайф, теперь напиши ее имя") @router.callback_query(States.char_wait_name) async def new_char_name(message: Message, state: FSMContext, dao: DAO): await state.set_data({"name": message.text}) await state.set_state(States.char_wait_bio) await message.answer("А теперь напиши био. Хоть чуть чуть.") # 3. Хендлер био (Финал) @router.message(States.char_wait_bio, F.text) async def new_char_bio(message: Message, state: FSMContext, dao: DAO, bot: Bot): # Получаем все накопленные данные data = await state.get_data() file_id = data["file_id"] name = data["name"] bio = message.text wait_msg = await message.answer("💾 Сохраняю персонажа...") try: # ВОТ ТУТ скачиваем файл (прямо перед сохранением) file_io = await bot.download(file_id) photo_bytes = file_io.getvalue() # Получаем байты # Создаем модель char = Character( id=None, name=name, character_image=photo_bytes, character_bio=bio ) # Сохраняем через DAO await dao.chars.add_character(char) # Отправляем подтверждение # Используем байты для отправки обратно await message.answer_photo( photo=BufferedInputFile(photo_bytes, filename="char.png"), caption=( "🎉 **Персонаж создан!**\n\n" f"👤 **Имя:** {char.name}\n" f"📝 **Био:** {char.character_bio}" ) ) await wait_msg.delete() # Сбрасываем состояние await state.clear() except Exception as e: await wait_msg.edit_text(f"❌ Ошибка при сохранении: {e}") # Не сбрасываем стейт, даем возможность попробовать ввести био снова или начать заново # 4. Хендлер-помощник (если отправили команду без файла) @router.message(Command("add_char")) async def add_char_help(message: Message): await message.answer( "ℹ️ **Как добавить персонажа:**\n" "Прикрепите фото (файлом/документом) и добавьте в подпись команду `/add_char`." )