diff --git a/EXAMPLES.md b/EXAMPLES.md index db8d3f2..63b3d36 100644 --- a/EXAMPLES.md +++ b/EXAMPLES.md @@ -94,8 +94,8 @@ ``` **Получите:** -- 🖼️ Высокое качество обложки -- 📋 Полная информация: +- Высокое качество обложки +- Полная информация: - Название: Steins;Gate - Оригинальное название: シュタインズ・ゲート - Дата выпуска: 2009-09-15 @@ -120,8 +120,8 @@ ``` **Получите:** -- 👤 Аватар персонажа высокого качества -- 📋 Информация: +- Аватар персонажа высокого качества +- Информация: - Имя и оригинальное имя - Пол - Группа крови @@ -244,7 +244,7 @@ ## Советы и трюки -### 💡 Совет 1: Комбинирование команд +### Совет 1: Комбинирование команд Эффективный способ использования: ```bash @@ -252,7 +252,7 @@ /[type]_detail [id] # Посмотрите детали ``` -### 💡 Совет 2: Использование ID +### Совет 2: Использование ID После поиска вы видите ID в скобках: ``` @@ -264,7 +264,7 @@ /vn_detail v17 ``` -### 💡 Совет 3: Максимум информации за раз +### Совет 3: Максимум информации за раз Команды подробного просмотра дают максимум информации: - Картинку (если есть) @@ -273,7 +273,7 @@ - Связанные элементы - Ссылку на оригинальный сайт -### 💡 Совет 4: Работа с изображениями +### Совет 4: Работа с изображениями - **Быстрый поиск**: используйте `/search`, получите автоматические картинки - **Качество**: используйте `/vn_detail` и т.д. для лучшего качества картинок @@ -310,28 +310,28 @@ ## Полезные команды для разных целей -### 📚 Исследование ВН +### Исследование ВН ```bash /stats # Сколько всего ВН /search [имя] # Найти конкретную ВН /vn_detail [id] # Полная информация о ВН ``` -### 👥 Изучение персонажей +### Изучение персонажей ```bash /char [имя] # Найти персонажа /char_detail [id] # Полная информация о персонаже /trait # Посмотреть черты характера ``` -### 🎬 Поиск релизов +### Поиск релизов ```bash /release [название] # Найти релиз /release_detail [id] # Информация о релизе /search [ВН] # Найти ВН и её релизы ``` -### 🏷️ Просмотр категорий +### Просмотр категорий ```bash /tag # Теги и категории /trait # Черты характера diff --git a/IMAGES.md b/IMAGES.md index 701a952..9ffc670 100644 --- a/IMAGES.md +++ b/IMAGES.md @@ -1,13 +1,13 @@ # Работа с изображениями в VNDB Telegram Bot -## 📸 Поддерживаемые изображения +## Поддерживаемые изображения Бот может отправлять изображения для: -- 🎮 **Визуальные новеллы** - обложки и постеры -- 👤 **Персонажи** - аватары и официальные картинки -- 📦 **Релизы** - коробки и обложки физических изданий +- **Визуальные новеллы** - обложки и постеры +- **Персонажи** - аватары и официальные картинки +- **Релизы** - коробки и обложки физических изданий -## 🚀 Использование изображений +## Использование изображений ### 1. Автоматическая отправка при поиске @@ -18,8 +18,8 @@ ``` Бот вернёт: -- 📝 Текстовую информацию со списком найденных ВН -- 🖼️ Обложки первых 3 ВН +- Текстовую информацию со списком найденных ВН +- Обложки первых 3 ВН ### 2. Детальный просмотр с полной информацией @@ -32,8 +32,8 @@ ``` Отправит: -- 🎮 Обложку ВН (высокое качество) -- 📋 Полная информация: +- Обложку ВН (высокое качество) +- Полная информация: - Название и оригинальное название - Дата выпуска - Рейтинг и количество голосов @@ -49,8 +49,8 @@ ``` Отправит: -- 👤 Аватар персонажа -- 📋 Информация: +- Аватар персонажа +- Информация: - Имя и оригинальное имя - Пол - Группа крови @@ -64,8 +64,8 @@ ``` Отправит: -- 📦 Картинку релиза -- 📋 Информация: +- Картинку релиза +- Информация: - Название - Дата выпуска - Платформа @@ -75,7 +75,7 @@ - ВН, к которой относится - Описание -## 🎨 Примеры +## Примеры ### Поиск и просмотр ВН @@ -133,20 +133,20 @@ /vn_detail v17 ``` -## ⚠️ Обработка ошибок при изображениях +## Обработка ошибок при изображениях Если изображение недоступно или бот не может его отправить: - Бот вернёт текстовую информацию без изображения - Информация будет полной и точной - Вы по-прежнему можете посетить VNDB напрямую для просмотра изображения -## 🌐 Источник изображений +## Источник изображений Все изображения загружаются с официального CDN VNDB: - **URL база**: `https://t.vndb.org` - **Качество**: Оптимальное для отображения в Telegram -## 💡 Советы +## Советы 1. **Для быстрого поиска**: используйте `/search`, `/char`, `/release` - Автоматически получите первые изображения @@ -165,7 +165,7 @@ # Получаете полную информацию с обложкой ``` -## 📝 Примечания +## Примечания - Не все элементы имеют изображения в VNDB - Если изображение отсутствует, бот отправит только текстовую информацию diff --git a/README.md b/README.md index a3b1e5a..04aa8ff 100644 --- a/README.md +++ b/README.md @@ -7,16 +7,16 @@ Бот поддерживает **все методы** VNDB API v2: ### Поиск и запросы -- 🎮 **Визуальные новеллы** - полный поиск по названию, языку, платформе, тегам, рейтингу и дате выпуска -- 👥 **Персонажи** - поиск по имени, полу, роли, чертам характера -- 🎬 **Релизы** - поиск по названию, платформе, типу, дате выпуска -- 👨‍💼 **Сотрудники** - поиск сценаристов, художников, композиторов и других -- 🏢 **Продюсеры** - поиск издателей и разработчиков -- 🏷️ **Теги** - просмотр популярных тегов и категорий -- ✨ **Черты характера** - список черт персонажей -- 💬 **Цитаты** - получение случайных цитат из ВН +- **Визуальные новеллы** - полный поиск по названию, языку, платформе, тегам, рейтингу и дате выпуска +- **Персонажи** - поиск по имени, полу, роли, чертам характера +- **Релизы** - поиск по названию, платформе, типу, дате выпуска +- **Сотрудники** - поиск сценаристов, художников, композиторов и других +- **Продюсеры** - поиск издателей и разработчиков +- **Теги** - просмотр популярных тегов и категорий +- **Черты характера** - список черт персонажей +- **Цитаты** - получение случайных цитат из ВН -### Изображения 📸 +### Изображения - **Обложки ВН** - автоматическая отправка обложек при поиске визуальных новелл - **Аватары персонажей** - картинки персонажей при поиске - **Картинки релизов** - изображения для каждого релиза @@ -29,9 +29,9 @@ - Управление меткамиме ### Информация -- 📊 Статистика базы данных -- 📋 Информация о схеме API -- 🔐 Информация об авторизации +- Статистика базы данных +- Информация о схеме API +- Информация об авторизации ## Установка diff --git a/bot.py b/bot.py index 580aaf9..7cdb4aa 100644 --- a/bot.py +++ b/bot.py @@ -1,7 +1,3 @@ -""" -VNDB Telegram Bot -Main bot implementation with command handlers -""" import logging from typing import Optional from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup @@ -43,7 +39,7 @@ class BotHandlers: async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: """Start command handler""" welcome_text = """ -🎮 **Добро пожаловать в VNDB Telegram Бот!** +**Добро пожаловать в VNDB Telegram Бот!** Этот бот позволяет искать информацию о визуальных новеллах, персонажах, релизах и многом другом из базы данных VNDB. @@ -60,7 +56,8 @@ class BotHandlers: /schema - Информация о схеме API /help - Справка по командам -*Используйте /help для получения подробной информации* +__Используйте /help для получения подробной информации__ +__Также можете ознакомится с примерами команд по ссылке: https://git.kotac.ru/King-of-the-all-Cookies/ayako/src/branch/main/EXAMPLES.md__ """ await update.message.reply_text(welcome_text, parse_mode="Markdown") @@ -68,7 +65,7 @@ class BotHandlers: async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: """Help command handler""" help_text = """ -**📚 Справка по командам VNDB Бота** +**Справка по командам VNDB Бота** **Поиск информации:** /search <название> - Поиск визуальных новелл по названию @@ -82,11 +79,11 @@ class BotHandlers: **Подробный просмотр (с картинками):** /vn_detail - Просмотр полной информации о ВН с обложкой - _Пример: /vn_detail v17_ + __Пример: /vn_detail v17__ /char_detail - Просмотр информации о персонаже с аватаром - _Пример: /char_detail c1_ + __Пример: /char_detail c1__ /release_detail - Просмотр информации о релизе с картинкой - _Пример: /release_detail r1_ + __Пример: /release_detail r1__ **Информация:** /stats - Показать статистику базы данных VNDB @@ -119,15 +116,15 @@ class BotHandlers: stats = await vndb_client.get_stats() stats_text = f""" -📊 **Статистика базы данных VNDB:** +**Статистика базы данных VNDB:** -🎮 Визуальные новеллы: {stats.get('vn', 0):,} -👥 Персонажи: {stats.get('chars', 0):,} -🎬 Релизы: {stats.get('releases', 0):,} -🏢 Продюсеры: {stats.get('producers', 0):,} -👨‍💼 Сотрудники: {stats.get('staff', 0):,} -🏷️ Теги: {stats.get('tags', 0):,} -✨ Черты характера: {stats.get('traits', 0):,} +Визуальные новеллы: {stats.get('vn', 0):,} +Персонажи: {stats.get('chars', 0):,} +Релизы: {stats.get('releases', 0):,} +Продюсеры: {stats.get('producers', 0):,} +Сотрудники: {stats.get('staff', 0):,} +Теги: {stats.get('tags', 0):,} +Черты характера: {stats.get('traits', 0):,} """ await update.message.reply_text(stats_text, parse_mode="Markdown") except Exception as e: @@ -147,7 +144,7 @@ class BotHandlers: schema = await vndb_client.get_schema() # Build schema info - schema_text = "📋 **Информация о схеме VNDB API:**\n\n" + schema_text = "**Информация о схеме VNDB API:**\n\n" # Database types if "db_types" in schema: @@ -163,7 +160,7 @@ class BotHandlers: schema_text += f"• {field_type}\n" schema_text += "\n" - schema_text += "Для полного списка полей и типов посетите: https://api.vndb.org/kana" + schema_text += "**Для полного списка полей и типов посетите: https://api.vndb.org/kana**" await update.message.reply_text(schema_text, parse_mode="Markdown") except Exception as e: @@ -179,12 +176,12 @@ class BotHandlers: if not args: await update.message.reply_text( - "❌ Пожалуйста, укажите название для поиска\n" + "Пожалуйста, укажите название для поиска\n" "Пример: /search Steins Gate" ) return ConversationHandler.END - await update.message.reply_text(f"🔍 Поиск визуальных новелл: **{args}**\n⏳ Загрузка...", parse_mode="Markdown") + await update.message.reply_text(f"Поиск визуальных новелл: **{args}**\nЗагрузка...", parse_mode="Markdown") # Search for VN filters = ["search", "=", args] @@ -195,7 +192,7 @@ class BotHandlers: ) if not results.get("results"): - await update.message.reply_text("😞 Ничего не найдено") + await update.message.reply_text("Ничего не найдено") return ConversationHandler.END # Format results @@ -220,7 +217,7 @@ class BotHandlers: f" Рейтинг: {rating/10:.1f}/10 ({votecount} голосов)\n\n" ) - response_text += f"\n📌 Всего найдено: {len(results['results'])} результатов" + response_text += f"\nВсего найдено: {len(results['results'])} результатов" if results.get("more"): response_text += " (есть еще результаты)" @@ -236,7 +233,7 @@ class BotHandlers: title = vn.get("title", "VN") await update.message.reply_photo( photo=f"https://t.vndb.org{image_url}", - caption=f"🎮 {title}", + caption=f"{title}", parse_mode="Markdown" ) except Exception as e: @@ -248,7 +245,7 @@ class BotHandlers: except Exception as e: logger.error(f"Error searching VN: {e}") error_msg = ErrorHandler.format_error(e) - await update.message.reply_text(f"❌ {error_msg}") + await update.message.reply_text(f"{error_msg}") return ConversationHandler.END @@ -260,12 +257,12 @@ class BotHandlers: if not args: await update.message.reply_text( - "❌ Пожалуйста, укажите имя персонажа\n" + "Пожалуйста, укажите имя персонажа\n" "Пример: /char Okabe" ) return ConversationHandler.END - await update.message.reply_text(f"🔍 Поиск персонажей: **{args}**\n⏳ Загрузка...", parse_mode="Markdown") + await update.message.reply_text(f"Поиск персонажей: **{args}**\n⏳ Загрузка...", parse_mode="Markdown") filters = ["search", "=", args] results = await vndb_client.query_character( @@ -275,7 +272,7 @@ class BotHandlers: ) if not results.get("results"): - await update.message.reply_text("😞 Ничего не найдено") + await update.message.reply_text("Ничего не найдено") return ConversationHandler.END response_text = f"**Результаты поиска персонажей: {args}**\n\n" @@ -311,7 +308,7 @@ class BotHandlers: name = char.get("name", "Character") await update.message.reply_photo( photo=f"https://t.vndb.org{image_url}", - caption=f"👤 {name}", + caption=f"{name}", parse_mode="Markdown" ) except Exception as e: @@ -322,7 +319,7 @@ class BotHandlers: except Exception as e: logger.error(f"Error searching characters: {e}") error_msg = ErrorHandler.format_error(e) - await update.message.reply_text(f"❌ {error_msg}") + await update.message.reply_text(f"{error_msg}") return ConversationHandler.END @@ -334,12 +331,12 @@ class BotHandlers: if not args: await update.message.reply_text( - "❌ Пожалуйста, укажите название для поиска\n" + "Пожалуйста, укажите название для поиска\n" "Пример: /release Windows" ) return ConversationHandler.END - await update.message.reply_text(f"🔍 Поиск релизов: **{args}**\n⏳ Загрузка...", parse_mode="Markdown") + await update.message.reply_text(f"Поиск релизов: **{args}**\nЗагрузка...", parse_mode="Markdown") filters = ["search", "=", args] results = await vndb_client.query_release( @@ -349,7 +346,7 @@ class BotHandlers: ) if not results.get("results"): - await update.message.reply_text("😞 Ничего не найдено") + await update.message.reply_text("Ничего не найдено") return ConversationHandler.END response_text = f"**Результаты поиска релизов: {args}**\n\n" @@ -386,7 +383,7 @@ class BotHandlers: title = release.get("title", "Release") await update.message.reply_photo( photo=f"https://t.vndb.org{image_url}", - caption=f"🎬 {title}", + caption=f"{title}", parse_mode="Markdown" ) except Exception as e: @@ -397,7 +394,7 @@ class BotHandlers: except Exception as e: logger.error(f"Error searching releases: {e}") error_msg = ErrorHandler.format_error(e) - await update.message.reply_text(f"❌ {error_msg}") + await update.message.reply_text(f"{error_msg}") return ConversationHandler.END @@ -409,12 +406,12 @@ class BotHandlers: if not args: await update.message.reply_text( - "❌ Пожалуйста, укажите имя\n" + "Пожалуйста, укажите имя\n" "Пример: /staff Yoko" ) return ConversationHandler.END - await update.message.reply_text(f"🔍 Поиск сотрудников: **{args}**\n⏳ Загрузка...", parse_mode="Markdown") + await update.message.reply_text(f"Поиск сотрудников: **{args}**\nЗагрузка...", parse_mode="Markdown") filters = ["search", "=", args] results = await vndb_client.query_staff( @@ -424,7 +421,7 @@ class BotHandlers: ) if not results.get("results"): - await update.message.reply_text("😞 Ничего не найдено") + await update.message.reply_text("Ничего не найдено") return ConversationHandler.END response_text = f"**Результаты поиска сотрудников: {args}**\n\n" @@ -449,7 +446,7 @@ class BotHandlers: except Exception as e: logger.error(f"Error searching staff: {e}") error_msg = ErrorHandler.format_error(e) - await update.message.reply_text(f"❌ {error_msg}") + await update.message.reply_text(f"{error_msg}") return ConversationHandler.END @@ -461,12 +458,12 @@ class BotHandlers: if not args: await update.message.reply_text( - "❌ Пожалуйста, укажите название\n" + "Пожалуйста, укажите название\n" "Пример: /producer Key" ) return ConversationHandler.END - await update.message.reply_text(f"🔍 Поиск продюсеров: **{args}**\n⏳ Загрузка...", parse_mode="Markdown") + await update.message.reply_text(f"Поиск продюсеров: **{args}**\n⏳ Загрузка...", parse_mode="Markdown") filters = ["search", "=", args] results = await vndb_client.query_producer( @@ -476,7 +473,7 @@ class BotHandlers: ) if not results.get("results"): - await update.message.reply_text("😞 Ничего не найдено") + await update.message.reply_text("Ничего не найдено") return ConversationHandler.END response_text = f"**Результаты поиска продюсеров: {args}**\n\n" @@ -500,7 +497,7 @@ class BotHandlers: except Exception as e: logger.error(f"Error searching producers: {e}") error_msg = ErrorHandler.format_error(e) - await update.message.reply_text(f"❌ {error_msg}") + await update.message.reply_text(f"{error_msg}") return ConversationHandler.END @@ -508,7 +505,7 @@ class BotHandlers: async def list_tags(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: """List popular tags""" try: - await update.message.reply_text("⏳ Загружаю теги...", parse_mode="Markdown") + await update.message.reply_text("Загружаю теги...", parse_mode="Markdown") results = await vndb_client.query_tag( fields=["name", "description"], @@ -518,10 +515,10 @@ class BotHandlers: ) if not results.get("results"): - await update.message.reply_text("😞 Ничего не найдено") + await update.message.reply_text("Ничего не найдено") return - response_text = "**🏷️ Популярные теги VNDB:**\n\n" + response_text = "**Популярные теги VNDB:**\n\n" for i, tag in enumerate(results["results"], 1): tag_id = tag.get("id", "Unknown") @@ -538,13 +535,13 @@ class BotHandlers: except Exception as e: logger.error(f"Error listing tags: {e}") error_msg = ErrorHandler.format_error(e) - await update.message.reply_text(f"❌ {error_msg}") + await update.message.reply_text(f"{error_msg}") @staticmethod async def list_traits(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: """List character traits""" try: - await update.message.reply_text("⏳ Загружаю черты характера...", parse_mode="Markdown") + await update.message.reply_text("Загружаю черты характера...", parse_mode="Markdown") results = await vndb_client.query_trait( fields=["name", "description"], @@ -554,10 +551,10 @@ class BotHandlers: ) if not results.get("results"): - await update.message.reply_text("😞 Ничего не найдено") + await update.message.reply_text("Ничего не найдено") return - response_text = "**✨ Популярные черты характера:**\n\n" + response_text = "**Популярные черты характера:**\n\n" for i, trait in enumerate(results["results"], 1): trait_id = trait.get("id", "Unknown") @@ -574,7 +571,7 @@ class BotHandlers: except Exception as e: logger.error(f"Error listing traits: {e}") error_msg = ErrorHandler.format_error(e) - await update.message.reply_text(f"❌ {error_msg}") + await update.message.reply_text(f"{error_msg}") @staticmethod async def get_quote(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: @@ -584,7 +581,7 @@ class BotHandlers: if context.args and context.args[0].isdigit(): count = min(int(context.args[0]), 5) # Max 5 quotes - await update.message.reply_text(f"⏳ Загружаю {count} цитат...", parse_mode="Markdown") + await update.message.reply_text(f"Загружаю {count} цитат...", parse_mode="Markdown") results = await vndb_client.query_quote( fields=["character", "quote"], @@ -593,10 +590,10 @@ class BotHandlers: ) if not results.get("results"): - await update.message.reply_text("😞 Ничего не найдено") + await update.message.reply_text("Ничего не найдено") return - response_text = "**💬 Случайные цитаты:**\n\n" + response_text = "**Случайные цитаты:**\n\n" for quote in results["results"]: quote_text = quote.get("quote", "") @@ -611,7 +608,7 @@ class BotHandlers: except Exception as e: logger.error(f"Error getting quotes: {e}") error_msg = ErrorHandler.format_error(e) - await update.message.reply_text(f"❌ {error_msg}") + await update.message.reply_text(f"{error_msg}") @staticmethod async def authinfo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: @@ -620,7 +617,7 @@ class BotHandlers: token = Config.VNDB_TOKEN if not token: await update.message.reply_text( - "❌ Токен VNDB не установлен\n\n" + "Токен VNDB не установлен\n\n" "Чтобы использовать функции авторизации:\n" "1. Посетите https://vndb.org/u/tokens\n" "2. Создайте новый токен\n" @@ -632,7 +629,7 @@ class BotHandlers: auth_info = await client_with_token.get_authinfo() response_text = f""" -**👤 Информация об авторизации:** +**Информация об авторизации:** ID: {auth_info.get('id', 'Unknown')} Пользователь: {auth_info.get('username', 'Unknown')} @@ -642,12 +639,12 @@ ID: {auth_info.get('id', 'Unknown')} permissions = auth_info.get("permissions", []) if "listread" in permissions: - response_text += "✅ Чтение списка (listread)\n" + response_text += "Чтение списка (listread)\n" if "listwrite" in permissions: - response_text += "✅ Запись в список (listwrite)\n" + response_text += "Запись в список (listwrite)\n" if not permissions: - response_text += "❌ Нет разрешений" + response_text += "Нет разрешений" await update.message.reply_text(response_text, parse_mode="Markdown")