""" Inline handlers for detailed item viewing (NO IMAGES VERSION - STABLE) """ from telegram import Update from telegram.ext import ContextTypes, CommandHandler from vndb_client import VndbClient 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("❌ Пример: /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" ], results=1 ) if not results.get("results"): await update.message.reply_text("😞 VN не найдена") 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("length"): text += f"Длина: {vn['length']}\n" if vn.get("developer"): text += f"Разработчик: {vn['developer']}\n" if vn.get("description"): text += f"\nОписание:\n{vn['description'][:300]}...\n" text += f"\nhttps://vndb.org/{vn_id}" 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", ], 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("description"): text += f"\nОписание:\n{c['description'][:300]}...\n" text += f"\nhttps://vndb.org/{char_id}" 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" ], 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("description"): text += f"\nОписание:\n{r['description'][:200]}...\n" text += f"\nhttps://vndb.org/{release_id}" 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), ]