227 lines
7.3 KiB
Python
227 lines
7.3 KiB
Python
"""
|
||
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),
|
||
] |