Обновление обработчиков команд: замена метода извлечения аргументов на CommandObject и улучшение сообщений об ошибках

This commit is contained in:
2026-05-01 18:22:24 +03:00
parent 27d262ddb5
commit f11fc602e7

69
bot.py
View File

@@ -2,7 +2,7 @@ import os
import logging import logging
import httpx import httpx
from aiogram import Bot, Dispatcher, types from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command from aiogram.filters import Command, CommandObject
from aiogram.client.default import DefaultBotProperties from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode from aiogram.enums import ParseMode
@@ -13,7 +13,6 @@ API_URL = os.getenv("VNDB_API_URL", "https://api.vndb.org/kana")
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# Исправленная инициализация для aiogram 3.7.0+
bot = Bot( bot = Bot(
token=TOKEN, token=TOKEN,
default=DefaultBotProperties(parse_mode=ParseMode.HTML) default=DefaultBotProperties(parse_mode=ParseMode.HTML)
@@ -21,7 +20,6 @@ bot = Bot(
dp = Dispatcher() dp = Dispatcher()
async def fetch_vndb(endpoint: str, filters: list, fields: str): async def fetch_vndb(endpoint: str, filters: list, fields: str):
"""Универсальный и безопасный клиент для VNDB API"""
payload = {"filters": filters, "fields": fields} payload = {"filters": filters, "fields": fields}
async with httpx.AsyncClient(timeout=10.0) as client: async with httpx.AsyncClient(timeout=10.0) as client:
try: try:
@@ -37,67 +35,66 @@ async def fetch_vndb(endpoint: str, filters: list, fields: str):
@dp.message(Command("start", "help")) @dp.message(Command("start", "help"))
async def cmd_help(message: types.Message): async def cmd_help(message: types.Message):
help_text = ( help_text = (
"🤖 <b>VNDB Bot v2.0</b>\n\n" "🤖 <b>VNDB Bot</b>\n\n"
"<b>Поиск:</b>\n" "<b>Поиск:</b>\n"
"/search &lt;name&gt; — поиск VN\n" "/search &lt;name&gt;\n"
"/char &lt;name&gt; — поиск персонажа\n" "/char &lt;name&gt;\n"
"/release &lt;name&gt; — поиск релиза\n\n" "/release &lt;name&gt;\n\n"
"<b>Инфо по ID:</b>\n" "<b>Инфо по ID:</b>\n"
"/vn &lt;id&gt; (напр. v17)\n" "/vn &lt;id&gt; (v17)\n"
"/char_id &lt;id&gt; (напр. c1)\n" "/char_id &lt;id&gt; (c1)\n"
"/rel_id &lt;id&gt; (напр. r1)" "/rel_id &lt;id&gt; (r1)"
) )
await message.answer(help_text) await message.answer(help_text)
# --- SEARCH HANDLERS --- # --- SEARCH HANDLERS ---
@dp.message(Command("search")) @dp.message(Command("search"))
async def search_vn(message: types.Message): async def search_vn(message: types.Message, command: CommandObject):
query = message.extract_args() if not command.args:
if not query: return await message.answer("Пример: <code>/search Steins;Gate</code>") return await message.answer("Пример: <code>/search Steins;Gate</code>")
res = await fetch_vndb("vn", ["search", "=", query], "title, rating") res = await fetch_vndb("vn", ["search", "=", command.args], "title")
if not res: return await message.answer("❌ Ничего не найдено.") if not res: return await message.answer("❌ Ничего не найдено.")
out = ["🔍 <b>VN Results:</b>"] out = ["🔍 <b>VN Results:</b>"]
for i in res[:10]: for i in res[:10]:
out.append(f"{i['title']} (ID: <code>{i['id']}</code>)") out.append(f"{i['title']} (<code>{i['id']}</code>)")
await message.answer("\n".join(out)) await message.answer("\n".join(out))
@dp.message(Command("char")) @dp.message(Command("char"))
async def search_char(message: types.Message): async def search_char(message: types.Message, command: CommandObject):
query = message.extract_args() if not command.args:
if not query: return await message.answer("Пример: <code>/char Kurisu</code>") return await message.answer("Пример: <code>/char Kurisu</code>")
res = await fetch_vndb("character", ["search", "=", query], "name") res = await fetch_vndb("character", ["search", "=", command.args], "name")
if not res: return await message.answer("❌ Персонаж не найден.") if not res: return await message.answer("❌ Персонаж не найден.")
out = ["👤 <b>Characters:</b>"] out = ["👤 <b>Characters:</b>"]
for i in res[:10]: for i in res[:10]:
out.append(f"{i['name']} (ID: <code>{i['id']}</code>)") out.append(f"{i['name']} (<code>{i['id']}</code>)")
await message.answer("\n".join(out)) await message.answer("\n".join(out))
@dp.message(Command("release")) @dp.message(Command("release"))
async def search_release(message: types.Message): async def search_release(message: types.Message, command: CommandObject):
query = message.extract_args() if not command.args:
if not query: return await message.answer("Пример: <code>/release Chaos;Head</code>") return await message.answer("Пример: <code>/release Chaos;Head</code>")
res = await fetch_vndb("release", ["search", "=", query], "title") res = await fetch_vndb("release", ["search", "=", command.args], "title")
if not res: return await message.answer("❌ Релиз не найден.") if not res: return await message.answer("❌ Релиз не найден.")
out = ["💿 <b>Releases:</b>"] out = ["💿 <b>Releases:</b>"]
for i in res[:10]: for i in res[:10]:
out.append(f"{i['title']} (ID: <code>{i['id']}</code>)") out.append(f"{i['title']} (<code>{i['id']}</code>)")
await message.answer("\n".join(out)) await message.answer("\n".join(out))
# --- DETAIL HANDLERS --- # --- DETAIL HANDLERS ---
@dp.message(Command("vn")) @dp.message(Command("vn"))
async def detail_vn(message: types.Message): async def detail_vn(message: types.Message, command: CommandObject):
vid = message.extract_args() if not command.args: return await message.answer("Введите ID (v17)")
if not vid: return await message.answer("Введите ID (например v17)")
res = await fetch_vndb("vn", ["id", "=", vid], "id, title, original, released, rating, votecount") res = await fetch_vndb("vn", ["id", "=", command.args], "id, title, original, released, rating, votecount")
if not res: return await message.answer("❌ VN не найдена.") if not res: return await message.answer("❌ VN не найдена.")
v = res[0] v = res[0]
@@ -110,11 +107,10 @@ async def detail_vn(message: types.Message):
await message.answer(text) await message.answer(text)
@dp.message(Command("char_id")) @dp.message(Command("char_id"))
async def detail_char(message: types.Message): async def detail_char(message: types.Message, command: CommandObject):
cid = message.extract_args() if not command.args: return await message.answer("Введите ID (c1)")
if not cid: return await message.answer("Введите ID (например c1)")
res = await fetch_vndb("character", ["id", "=", cid], "id, name, original") res = await fetch_vndb("character", ["id", "=", command.args], "id, name, original")
if not res: return await message.answer("❌ Персонаж не найден.") if not res: return await message.answer("❌ Персонаж не найден.")
c = res[0] c = res[0]
@@ -124,11 +120,10 @@ async def detail_char(message: types.Message):
await message.answer(text) await message.answer(text)
@dp.message(Command("rel_id")) @dp.message(Command("rel_id"))
async def detail_rel(message: types.Message): async def detail_rel(message: types.Message, command: CommandObject):
rid = message.extract_args() if not command.args: return await message.answer("Введите ID (r1)")
if not rid: return await message.answer("Введите ID (например r1)")
res = await fetch_vndb("release", ["id", "=", rid], "id, title, released") res = await fetch_vndb("release", ["id", "=", command.args], "id, title, released")
if not res: return await message.answer("❌ Релиз не найден.") if not res: return await message.answer("❌ Релиз не найден.")
r = res[0] r = res[0]