fixes
This commit is contained in:
@@ -51,57 +51,66 @@ async def new_char_bio(message: Message, state: FSMContext, dao: DAO, bot: Bot):
|
||||
wait_msg = await message.answer("💾 Сохраняю персонажа...")
|
||||
|
||||
try:
|
||||
# ВОТ ТУТ скачиваем файл (прямо перед сохранением)
|
||||
# 1. Скачиваем файл (один раз)
|
||||
# TODO: Для больших файлов лучше использовать streaming или сохранять во временный файл
|
||||
file_io = await bot.download(file_id)
|
||||
# photo_bytes = file_io.getvalue() # Получаем байты
|
||||
|
||||
|
||||
# Создаем модель
|
||||
file_bytes = file_io.read()
|
||||
|
||||
# 2. Создаем Character (сначала без ассета, чтобы получить ID)
|
||||
char = Character(
|
||||
id=None,
|
||||
name=name,
|
||||
character_image_data=file_io.read(),
|
||||
character_image_tg_id=None,
|
||||
character_image_doc_tg_id=file_id,
|
||||
character_bio=bio,
|
||||
created_by=str(message.from_user.id)
|
||||
)
|
||||
file_io.close()
|
||||
|
||||
# Сохраняем через DAO
|
||||
|
||||
|
||||
# Сохраняем, чтобы получить ID
|
||||
await dao.chars.add_character(char)
|
||||
file_info = await bot.get_file(char.character_image_doc_tg_id)
|
||||
file_bytes = await bot.download_file(file_info.file_path)
|
||||
file_io = file_bytes.read()
|
||||
avatar_asset = await dao.assets.create_asset(
|
||||
Asset(name="avatar.png", type=AssetType.UPLOADED, content_type=AssetContentType.IMAGE, linked_char_id=str(char.id), data=file_io,
|
||||
tg_doc_file_id=file_id))
|
||||
char.avatar_image = avatar_asset.link
|
||||
|
||||
# 3. Создаем Asset (связанный с персонажем)
|
||||
avatar_asset_id = await dao.assets.create_asset(
|
||||
Asset(
|
||||
name="avatar.png",
|
||||
type=AssetType.UPLOADED,
|
||||
content_type=AssetContentType.IMAGE,
|
||||
linked_char_id=str(char.id),
|
||||
data=file_bytes,
|
||||
tg_doc_file_id=file_id
|
||||
)
|
||||
)
|
||||
|
||||
# 4. Обновляем персонажа ссылками на ассет
|
||||
char.avatar_asset_id = avatar_asset_id
|
||||
char.avatar_image = f"/api/assets/{avatar_asset_id}" # Формируем ссылку вручную или используем метод, если появится
|
||||
|
||||
# Отправляем подтверждение
|
||||
# Используем байты для отправки обратно
|
||||
photo_msg = await message.answer_photo(
|
||||
photo=BufferedInputFile(file_io,
|
||||
filename="char.jpg") if not char.character_image_tg_id else char.character_image_tg_id,
|
||||
photo=BufferedInputFile(file_bytes, filename="char.jpg"),
|
||||
caption=(
|
||||
"🎉 <b>Персонаж создан!</b>\n\n"
|
||||
f"👤 <b>Имя:</b> {char.name}\n"
|
||||
f"📝 <b>Био:</b> {char.character_bio}"
|
||||
)
|
||||
)
|
||||
file_bytes.close()
|
||||
char.character_image_tg_id = photo_msg.photo[0].file_id
|
||||
|
||||
# Сохраняем TG ID фото (которое отправили как фото, а не документ)
|
||||
char.character_image_tg_id = photo_msg.photo[-1].file_id
|
||||
|
||||
# Финальное обновление персонажа
|
||||
await dao.chars.update_char(char.id, char)
|
||||
|
||||
await wait_msg.delete()
|
||||
file_io.close()
|
||||
|
||||
# Сбрасываем состояние
|
||||
await state.clear()
|
||||
|
||||
except Exception as e:
|
||||
logging.error(e)
|
||||
logger.error(f"Error creating character: {e}")
|
||||
traceback.print_exc()
|
||||
await wait_msg.edit_text(f"❌ Ошибка при сохранении: {e}")
|
||||
# Не сбрасываем стейт, даем возможность попробовать ввести био снова или начать заново
|
||||
|
||||
|
||||
@router.message(Command("chars"))
|
||||
|
||||
Reference in New Issue
Block a user