Files
ayako/detailed_handlers.py

227 lines
7.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
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.
"""
Inline handlers for detailed item viewing with images (FIXED VERSION)
"""
from telegram import Update
from telegram.ext import ContextTypes, CommandHandler
from vndb_client import VndbClient
from utils import ImageHandler
from config import Config
import logging
logger = logging.getLogger(__name__)
vndb_client = VndbClient(use_sandbox=Config.USE_SANDBOX)
class DetailedHandlers:
# =========================
# VN DETAIL
# =========================
@staticmethod
async def view_vn_detail(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
try:
if not context.args:
await update.message.reply_text(
"❌ Укажи ID VN\nПример: /vn_detail v2002"
)
return
vn_id = context.args[0].strip()
await update.message.reply_text(
f"⏳ Загружаю информацию о {vn_id}..."
)
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"):
await update.message.reply_text(f"😞 VN {vn_id} не найдена")
return
vn = results["results"][0]
text = f"🎮 {vn.get('title','Unknown')} (`{vn_id}`)\n"
if vn.get("original"):
text += f"Оригинал: {vn['original']}\n"
text += f"Релиз: {vn.get('released','?')}\n"
text += f"Рейтинг: {vn.get('rating',0)/10:.1f} ({vn.get('votecount',0)} голосов)\n"
if vn.get("developer"):
text += f"Разработчик: {vn['developer']}\n"
if vn.get("description"):
desc = vn["description"][:300]
text += f"\nОписание:\n{desc}...\n"
text += f"\nhttps://vndb.org/{vn_id}"
img = vn.get("image")
if img:
url = ImageHandler.get_image_url(img)
if url:
await update.message.reply_photo(photo=url, caption=text)
return
await update.message.reply_text(text)
except Exception as e:
logger.error(f"VN detail error: {e}")
await update.message.reply_text(f"❌ Ошибка: {e}")
# =========================
# CHARACTER DETAIL
# =========================
@staticmethod
async def view_character_detail(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
try:
if not context.args:
await update.message.reply_text("❌ Пример: /char_detail c6498")
return
char_id = context.args[0].strip()
await update.message.reply_text(f"⏳ Загружаю {char_id}...")
results = await vndb_client.query_character(
filters=["id", "=", char_id],
fields=[
"id", "name", "original",
"gender", "bloodtype",
"description", "image{url,dims}",
"vn"
],
results=1
)
if not results.get("results"):
await update.message.reply_text("😞 Персонаж не найден")
return
c = results["results"][0]
text = f"👤 {c.get('name','Unknown')} (`{char_id}`)\n"
if c.get("original"):
text += f"{c['original']}\n"
if c.get("gender"):
text += f"Пол: {c['gender']}\n"
if c.get("bloodtype"):
text += f"Кровь: {c['bloodtype']}\n"
if c.get("vn"):
text += "\nVN:\n"
for vn in c["vn"][:5]:
if vn.get("id"):
text += f"{vn['id']}\n"
if c.get("description"):
text += f"\n{c['description'][:300]}...\n"
text += f"\nhttps://vndb.org/{char_id}"
img = c.get("image")
if img:
url = ImageHandler.get_image_url(img)
if url:
await update.message.reply_photo(photo=url, caption=text)
return
await update.message.reply_text(text)
except Exception as e:
logger.error(f"CHAR detail error: {e}")
await update.message.reply_text(f"❌ Ошибка: {e}")
# =========================
# RELEASE DETAIL
# =========================
@staticmethod
async def view_release_detail(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
try:
if not context.args:
await update.message.reply_text("❌ Пример: /release_detail r3930")
return
release_id = context.args[0].strip()
await update.message.reply_text(f"⏳ Загружаю {release_id}...")
results = await vndb_client.query_release(
filters=["id", "=", release_id],
fields=[
"id", "title", "original",
"released", "platform",
"type", "language",
"description",
"image{url,dims}",
"vn"
],
results=1
)
if not results.get("results"):
await update.message.reply_text("😞 Релиз не найден")
return
r = results["results"][0]
text = f"🎬 {r.get('title','Unknown')} (`{release_id}`)\n"
if r.get("original"):
text += f"{r['original']}\n"
text += f"Дата: {r.get('released','?')}\n"
text += f"Платформа: {r.get('platform','?')}\n"
text += f"Тип: {r.get('type','?')}\n"
if r.get("language"):
text += f"Языки: {', '.join(r['language'])}\n"
if r.get("vn"):
text += "\nVN:\n"
for vn in r["vn"][:3]:
if vn.get("id"):
text += f"{vn['id']}\n"
if r.get("description"):
text += f"\n{r['description'][:200]}...\n"
text += f"\nhttps://vndb.org/{release_id}"
img = r.get("image")
if img:
url = ImageHandler.get_image_url(img)
if url:
await update.message.reply_photo(photo=url, caption=text)
return
await update.message.reply_text(text)
except Exception as e:
logger.error(f"RELEASE detail error: {e}")
await update.message.reply_text(f"❌ Ошибка: {e}")
# =========================
# REGISTER
# =========================
def get_detail_handlers():
return [
CommandHandler("vn_detail", DetailedHandlers.view_vn_detail),
CommandHandler("char_detail", DetailedHandlers.view_character_detail),
CommandHandler("release_detail", DetailedHandlers.view_release_detail),
]