fix: !hp теперь показывает правильные описания команд

Проблема: cmd.__doc__ возвращал docstring класса Command из discord.py
(одинаковый для всех команд), а не docstring callback-функции.

Решение:
- Использовать cmd.help вместо cmd.__doc__ для получения описания
- Скрыть !hp из списка через hidden=True
- Пропускать hidden-команды и команды без описания
- Обновить тесты под новый интерфейс
This commit is contained in:
deadzilla 2026-07-09 09:18:48 +05:00
parent a8e9be09c7
commit 48ed9aa07b
2 changed files with 11 additions and 6 deletions

View File

@ -4,7 +4,7 @@ from discord.ext import commands
class Help(commands.Cog): class Help(commands.Cog):
"""Команда !hp — список всех команд бота""" """Команда !hp — список всех команд бота"""
@commands.command(name="hp") @commands.command(name="hp", hidden=True)
async def hp(self, ctx: commands.Context) -> None: async def hp(self, ctx: commands.Context) -> None:
"""Показать список доступных команд""" """Показать список доступных команд"""
await self._show_help(ctx) await self._show_help(ctx)
@ -12,11 +12,15 @@ class Help(commands.Cog):
async def _show_help(self, ctx: commands.Context): async def _show_help(self, ctx: commands.Context):
"""Вывести список команд в простом текстовом формате.""" """Вывести список команд в простом текстовом формате."""
# Собираем команды автоматически из bot.commands # Собираем команды автоматически из bot.commands
# Используем cmd.help — discord.py берёт docstring из callback функции
commands_list = [] commands_list = []
for cmd in ctx.bot.commands: for cmd in ctx.bot.commands:
if cmd.hidden:
continue
name = cmd.name name = cmd.name
# Описание из docstring первой команды (если есть дубликаты) desc = cmd.help or "Без описания"
desc = (cmd.__doc__ or "".strip()).split("\n")[0].strip() if desc == "Без описания":
continue
commands_list.append(f"!{name}{desc}") commands_list.append(f"!{name}{desc}")
commands_list.sort() commands_list.sort()

View File

@ -10,11 +10,12 @@ class TestHelpCommandDiscord:
"""Тесты для команды help на Discord.""" """Тесты для команды help на Discord."""
@staticmethod @staticmethod
def _make_mock_command(name, doc): def _make_mock_command(name, doc, hidden=False):
"""Создать mock-объект команды с name и docstring.""" """Создать mock-объект команды с name, help и hidden."""
cmd = MagicMock(spec=[]) cmd = MagicMock(spec=[])
cmd.name = name cmd.name = name
cmd.__doc__ = doc cmd.help = doc
cmd.hidden = hidden
return cmd return cmd
async def test_show_help_sends_simple_text(self) -> None: async def test_show_help_sends_simple_text(self) -> None: