Files
ai-char-bot/routers/char_router.py
2026-02-02 16:20:24 +03:00

88 lines
3.3 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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, Bot
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`."
)