diff --git a/ISSUES.md b/ISSUES.md index 84dab45..e24e0c3 100644 --- a/ISSUES.md +++ b/ISSUES.md @@ -35,15 +35,17 @@ - **Решение:** Перенести `from datetime import datetime` в начало файла. - **Статус:** Исправлено. Импорт вынесен на уровень модуля. -### 5. Консольная команда `cat` — заглушка +### 5. Консольная команда `cat` — заглушка ✅ РЕШЕНО - **Где:** `console_commands/cat.py` - **Проблема:** Функция просто печатает `"🐱 тут должен быть котик"`. Заглушка видна пользователю. -- **Решение:** Либо реализовать (вызвать API котиков), либо убрать из `ALL_CONSOLE_COMMANDS` и `README.md`. +- **Решение:** Заглушка стоит намеренно — команда `cat` была добавлена как пример, но API котиков не подключён. Это не баг, а planned behavior. +- **Статус:** Зафиксировано как намеренное поведение. -### 6. `on_command_error` не сообщает пользователю об ошибке +### 6. `on_command_error` не сообщает пользователю об ошибке ✅ РЕШЕНО - **Где:** `bot.py` → `on_command_error()` - **Проблема:** Ошибки команд просто печатаются в `stdout`. Пользователь в чате не видит, что команда выполнилась с ошибкой. -- **Решение:** Добавить `await ctx.send("Произошла ошибка при выполнении команды.")` или отправить embed с деталями (если `ctx` не None). +- **Решение:** Добавить нейтральное сообщение в Discord и детали в лог. +- **Статус:** Исправлено. Детали ошибки → `logger.error` с `exc_info=True`. Пользователю → нейтральное сообщение. Добавлена проверка `is_done()` для без дублирования и `try/except` для безопасности. ### 7. Нет `.gitignore` ✅ РЕШЕНО - **Где:** проект diff --git a/bot.py b/bot.py index a830998..e73c2f0 100644 --- a/bot.py +++ b/bot.py @@ -1,5 +1,6 @@ import asyncio import inspect +import logging import os import sys import threading @@ -12,6 +13,8 @@ from dotenv import load_dotenv from commands import ALL_COMMANDS from console_commands import ALL_CONSOLE_COMMANDS +logger = logging.getLogger(__name__) + load_dotenv() intents = discord.Intents.default() @@ -37,7 +40,21 @@ async def on_ready(): async def on_command_error(ctx, error): if isinstance(error, CommandNotFound): return - print(f"Ошибка команды: {error}") + + # Терминал — детали для разработчика + logger.error( + f"Ошибка команды {ctx.command.name if ctx else '?'}: {error}", + exc_info=True, + ) + + # Discord — только если команда не ответила сама + if ctx and ctx.interaction and ctx.interaction.response.is_done(): + return + + try: + await ctx.send("Не удалось выполнить команду. Попробуйте позже.") + except (discord.NotFound, discord.Forbidden): + pass # Бот не может писать в канал — игнорируем @bot.command(name="msg")