Review copilot neuroslop and fixed bugs

This commit is contained in:
2026-05-01 15:34:45 +03:00
parent b983126e6e
commit 2d55baf3ad
4 changed files with 100 additions and 103 deletions

119
bot.py
View File

@@ -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 <ID> - Просмотр полной информации о ВН с обложкой
ример: /vn_detail v17_
_ример: /vn_detail v17__
/char_detail <ID> - Просмотр информации о персонаже с аватаром
ример: /char_detail c1_
_ример: /char_detail c1__
/release_detail <ID> - Просмотр информации о релизе с картинкой
ример: /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")