Исправление обработчиков для детального просмотра: улучшение сообщений об ошибках и упрощение текста ответов

This commit is contained in:
2026-05-01 17:46:10 +03:00
parent fc9739018e
commit ea5c1b55fc

View File

@@ -1,8 +1,8 @@
""" """
Inline handlers for detailed item viewing with images Inline handlers for detailed item viewing with images (FIXED VERSION)
""" """
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram import Update
from telegram.ext import ContextTypes, CommandHandler, CallbackQueryHandler from telegram.ext import ContextTypes, CommandHandler
from vndb_client import VndbClient from vndb_client import VndbClient
from utils import ImageHandler from utils import ImageHandler
from config import Config from config import Config
@@ -13,281 +13,215 @@ vndb_client = VndbClient(use_sandbox=Config.USE_SANDBOX)
class DetailedHandlers: class DetailedHandlers:
"""Handlers for detailed item viewing"""
# =========================
# VN DETAIL
# =========================
@staticmethod @staticmethod
async def view_vn_detail(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: async def view_vn_detail(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""View detailed VN information with image"""
try: try:
if not context.args: if not context.args:
await update.message.reply_text( await update.message.reply_text(
"Пожалуйста, укажите ID визуальной новеллы\n" "Укажи ID VN\nПример: /vn_detail v2002"
"Пример: /vn_detail v17"
) )
return return
vn_id = context.args[0] vn_id = context.args[0].strip()
await update.message.reply_text(f"⏳ Загружаю информацию о {vn_id}...", parse_mode="Markdown")
await update.message.reply_text(
# Get detailed VN information f"⏳ Загружаю информацию о {vn_id}..."
filters = ["id", "=", vn_id]
results = await vndb_client.query_vn(
filters=[filters],
fields=[
"title", "original", "released", "rating", "votecount",
"description", "image{url,dims}", "length", "developer"
]
) )
results = await vndb_client.query_vn(
filters=["id", "=", vn_id],
fields=[
"id", "title", "original", "released",
"rating", "votecount", "description",
"length", "developer", "image{url,dims}"
],
results=1
)
if not results.get("results"): if not results.get("results"):
await update.message.reply_text(f"😞 ВН с ID {vn_id} не найдена") await update.message.reply_text(f"😞 VN {vn_id} не найдена")
return return
vn = results["results"][0] vn = results["results"][0]
# Build detailed text text = f"🎮 {vn.get('title','Unknown')} (`{vn_id}`)\n"
title = vn.get("title", "Unknown")
original = vn.get("original", "") if vn.get("original"):
released = vn.get("released", "Unknown") text += f"Оригинал: {vn['original']}\n"
rating = vn.get("rating", 0)
votecount = vn.get("votecount", 0) text += f"Релиз: {vn.get('released','?')}\n"
description = vn.get("description", "") text += f"Рейтинг: {vn.get('rating',0)/10:.1f} ({vn.get('votecount',0)} голосов)\n"
length = vn.get("length", "")
developer = vn.get("developer", "") if vn.get("developer"):
text += f"Разработчик: {vn['developer']}\n"
detail_text = f"""
**🎮 {title}** (`{vn_id}`) if vn.get("description"):
""" desc = vn["description"][:300]
text += f"\nОписание:\n{desc}...\n"
if original:
detail_text += f"Оригинал: {original}\n" text += f"\nhttps://vndb.org/{vn_id}"
detail_text += f""" img = vn.get("image")
Дата релиза: {released} if img:
Рейтинг: {rating/10:.1f}/10 ({votecount} голосов) url = ImageHandler.get_image_url(img)
""" if url:
await update.message.reply_photo(photo=url, caption=text)
if length: return
detail_text += f"Длительность: {length}\n"
await update.message.reply_text(text)
if developer:
detail_text += f"Разработчик: {developer}\n"
if description:
# Truncate long descriptions
desc_truncated = description[:300] + "..." if len(description) > 300 else description
detail_text += f"\nОписание:\n{desc_truncated}\n"
detail_text += f"\n[Открыть на VNDB](https://vndb.org/{vn_id})"
# Send with image if available
image_data = vn.get("image")
if image_data:
image_url = ImageHandler.get_image_url(image_data)
if image_url:
try:
await update.message.reply_photo(
photo=image_url,
caption=detail_text,
parse_mode="Markdown"
)
except Exception as e:
logger.warning(f"Could not send VN image: {e}")
await update.message.reply_text(detail_text, parse_mode="Markdown")
else:
await update.message.reply_text(detail_text, parse_mode="Markdown")
else:
await update.message.reply_text(detail_text, parse_mode="Markdown")
except Exception as e: except Exception as e:
logger.error(f"Error viewing VN detail: {e}") logger.error(f"VN detail error: {e}")
await update.message.reply_text(f"❌ Ошибка при загрузке информации: {str(e)}") await update.message.reply_text(f"❌ Ошибка: {e}")
# =========================
# CHARACTER DETAIL
# =========================
@staticmethod @staticmethod
async def view_character_detail(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: async def view_character_detail(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""View detailed character information with image"""
try: try:
if not context.args: if not context.args:
await update.message.reply_text( await update.message.reply_text("❌ Пример: /char_detail c6498")
"❌ Пожалуйста, укажите ID персонажа\n"
"Пример: /char_detail c1"
)
return return
char_id = context.args[0] char_id = context.args[0].strip()
await update.message.reply_text(f"⏳ Загружаю информацию о {char_id}...", parse_mode="Markdown")
await update.message.reply_text(f"⏳ Загружаю {char_id}...")
# Get detailed character information
filters = ["id", "=", char_id]
results = await vndb_client.query_character( results = await vndb_client.query_character(
filters=[filters], filters=["id", "=", char_id],
fields=[ fields=[
"name", "original", "gender", "bloodtype", "height", "weight", "id", "name", "original",
"bust", "waist", "hips", "description", "image{url,dims}", "vn" "gender", "bloodtype",
] "description", "image{url,dims}",
"vn"
],
results=1
) )
if not results.get("results"): if not results.get("results"):
await update.message.reply_text(f"😞 Персонаж с ID {char_id} не найден") await update.message.reply_text("😞 Персонаж не найден")
return return
char = results["results"][0] c = results["results"][0]
# Build detailed text text = f"👤 {c.get('name','Unknown')} (`{char_id}`)\n"
name = char.get("name", "Unknown")
original = char.get("original", "") if c.get("original"):
gender = char.get("gender", "") text += f"{c['original']}\n"
bloodtype = char.get("bloodtype", "")
description = char.get("description", "") if c.get("gender"):
vns = char.get("vn", []) text += f"Пол: {c['gender']}\n"
detail_text = f"**👤 {name}** (`{char_id}`)\n" if c.get("bloodtype"):
text += f"Кровь: {c['bloodtype']}\n"
if original:
detail_text += f"Оригинал: {original}\n" if c.get("vn"):
text += "\nVN:\n"
if gender: for vn in c["vn"][:5]:
detail_text += f"Пол: {gender}\n" if vn.get("id"):
text += f"{vn['id']}\n"
if bloodtype:
detail_text += f"Группа крови: {bloodtype}\n" if c.get("description"):
text += f"\n{c['description'][:300]}...\n"
if vns:
detail_text += f"\nПоявляется в:\n" text += f"\nhttps://vndb.org/{char_id}"
for vn in vns[:5]: # Show first 5 VNs
vn_id = vn.get("id", "") img = c.get("image")
if vn_id: if img:
detail_text += f"• [{vn_id}](https://vndb.org/{vn_id})\n" url = ImageHandler.get_image_url(img)
if url:
if description: await update.message.reply_photo(photo=url, caption=text)
desc_truncated = description[:300] + "..." if len(description) > 300 else description return
detail_text += f"\nОписание:\n{desc_truncated}\n"
await update.message.reply_text(text)
detail_text += f"\n[Открыть на VNDB](https://vndb.org/{char_id})"
# Send with image if available
image_data = char.get("image")
if image_data:
image_url = ImageHandler.get_image_url(image_data)
if image_url:
try:
await update.message.reply_photo(
photo=image_url,
caption=detail_text,
parse_mode="Markdown"
)
except Exception as e:
logger.warning(f"Could not send character image: {e}")
await update.message.reply_text(detail_text, parse_mode="Markdown")
else:
await update.message.reply_text(detail_text, parse_mode="Markdown")
else:
await update.message.reply_text(detail_text, parse_mode="Markdown")
except Exception as e: except Exception as e:
logger.error(f"Error viewing character detail: {e}") logger.error(f"CHAR detail error: {e}")
await update.message.reply_text(f"❌ Ошибка при загрузке информации: {str(e)}") await update.message.reply_text(f"❌ Ошибка: {e}")
# =========================
# RELEASE DETAIL
# =========================
@staticmethod @staticmethod
async def view_release_detail(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: async def view_release_detail(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""View detailed release information with image"""
try: try:
if not context.args: if not context.args:
await update.message.reply_text( await update.message.reply_text("❌ Пример: /release_detail r3930")
"❌ Пожалуйста, укажите ID релиза\n"
"Пример: /release_detail r1"
)
return return
release_id = context.args[0] release_id = context.args[0].strip()
await update.message.reply_text(f"⏳ Загружаю информацию о {release_id}...", parse_mode="Markdown")
await update.message.reply_text(f"⏳ Загружаю {release_id}...")
# Get detailed release information
filters = ["id", "=", release_id]
results = await vndb_client.query_release( results = await vndb_client.query_release(
filters=[filters], filters=["id", "=", release_id],
fields=[ fields=[
"title", "original", "released", "platform", "type", "language", "id", "title", "original",
"edition", "description", "image{url,dims}", "vn" "released", "platform",
] "type", "language",
"description",
"image{url,dims}",
"vn"
],
results=1
) )
if not results.get("results"): if not results.get("results"):
await update.message.reply_text(f"😞 Релиз с ID {release_id} не найден") await update.message.reply_text("😞 Релиз не найден")
return return
release = results["results"][0] r = results["results"][0]
# Build detailed text text = f"🎬 {r.get('title','Unknown')} (`{release_id}`)\n"
title = release.get("title", "Unknown")
original = release.get("original", "") if r.get("original"):
released = release.get("released", "Unknown") text += f"{r['original']}\n"
platform = release.get("platform", "")
rel_type = release.get("type", "") text += f"Дата: {r.get('released','?')}\n"
language = release.get("language", []) text += f"Платформа: {r.get('platform','?')}\n"
edition = release.get("edition", "") text += f"Тип: {r.get('type','?')}\n"
description = release.get("description", "")
vns = release.get("vn", []) if r.get("language"):
text += f"Языки: {', '.join(r['language'])}\n"
detail_text = f"**🎬 {title}** (`{release_id}`)\n"
if r.get("vn"):
if original: text += "\nVN:\n"
detail_text += f"Оригинал: {original}\n" for vn in r["vn"][:3]:
if vn.get("id"):
detail_text += f""" text += f"{vn['id']}\n"
Дата выпуска: {released}
Платформа: {platform} if r.get("description"):
Тип: {rel_type} text += f"\n{r['description'][:200]}...\n"
"""
text += f"\nhttps://vndb.org/{release_id}"
if language:
lang_str = ", ".join(language) if isinstance(language, list) else str(language) img = r.get("image")
detail_text += f"Языки: {lang_str}\n" if img:
url = ImageHandler.get_image_url(img)
if edition: if url:
detail_text += f"Издание: {edition}\n" await update.message.reply_photo(photo=url, caption=text)
return
if vns:
detail_text += f"\nЧасть из:\n" await update.message.reply_text(text)
for vn in vns[:3]:
vn_id = vn.get("id", "")
if vn_id:
detail_text += f"• [{vn_id}](https://vndb.org/{vn_id})\n"
if description:
desc_truncated = description[:200] + "..." if len(description) > 200 else description
detail_text += f"\nОписание:\n{desc_truncated}\n"
detail_text += f"\n[Открыть на VNDB](https://vndb.org/{release_id})"
# Send with image if available
image_data = release.get("image")
if image_data:
image_url = ImageHandler.get_image_url(image_data)
if image_url:
try:
await update.message.reply_photo(
photo=image_url,
caption=detail_text,
parse_mode="Markdown"
)
except Exception as e:
logger.warning(f"Could not send release image: {e}")
await update.message.reply_text(detail_text, parse_mode="Markdown")
else:
await update.message.reply_text(detail_text, parse_mode="Markdown")
else:
await update.message.reply_text(detail_text, parse_mode="Markdown")
except Exception as e: except Exception as e:
logger.error(f"Error viewing release detail: {e}") logger.error(f"RELEASE detail error: {e}")
await update.message.reply_text(f"❌ Ошибка при загрузке информации: {str(e)}") await update.message.reply_text(f"❌ Ошибка: {e}")
# =========================
# REGISTER
# =========================
def get_detail_handlers(): def get_detail_handlers():
"""Get all detail view handlers"""
return [ return [
CommandHandler("vn_detail", DetailedHandlers.view_vn_detail), CommandHandler("vn_detail", DetailedHandlers.view_vn_detail),
CommandHandler("char_detail", DetailedHandlers.view_character_detail), CommandHandler("char_detail", DetailedHandlers.view_character_detail),
CommandHandler("release_detail", DetailedHandlers.view_release_detail), CommandHandler("release_detail", DetailedHandlers.view_release_detail),
] ]