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