6.4 KiB
6.4 KiB
Issues — список проблем проекта
Состояние на: 2026-05-26
🔴 Критические
1. Retry без задержки между попытками ✅ РЕШЕНО
- Где:
commands/pogoda.py,console_commands/pogoda.py - Проблема: Цикл
for attempt in range(3)не содержитtime.sleep(). Все 3 попытки выполняются мгновенно, что бессмысленно при временных сетевых сбоях. - AGENTS.md обещает: "Retry: 3 попытки с экспоненциальной задержкой" — но задержки нет.
- Решение: Добавить
time.sleep(2 ** attempt)внутри цикла retry. - Статус: Исправлено. Добавлена экспоненциальная задержка: 2 сек, 4 сек между попытками.
2. Блокировка event loop в async-методе ✅ РЕШЕНО
- Где:
commands/news.py,commands/cat.py,commands/pogoda.py - Проблема: Асинхронные методы вызывали синхронный
requests.get(), блокируя весь event loop. - Решение: Обернуть
requests.get()вawait asyncio.to_thread()и заменитьtime.sleep()наawait asyncio.sleep(). - Статус: Исправлено. В
news.py,cat.py,pogoda.pyвсе HTTP-запросы выполняются в отдельных потоках, а ожидания — неблокирующие.
🟡 Средние
3. Дублирование кода между Discord и console командами ✅ РЕШЕНО
- Где:
console_commands/pogoda.py,console_commands/news.py(и их аналоги вcommands/) - Проблема: Логика погоды и новостей полностью продублирована. Изменения нужно вносить в два места.
- Решение: Вынести общую логику в
utils/(utils/pogoda.py,utils/news.py) и использовать её из обоих мест. - Статус: Исправлено. Созданы
utils/pogoda.pyиutils/news.py. Оба файла используют единые функции без дублирования.
4. from datetime import datetime внутри метода ✅ РЕШЕНО
- Где:
utils/news.py→_parse_date(), строка 67 - Проблема: Импорт внутри метода — антипаттерн. Замедляет выполнение, нарушает PEP 8.
- Решение: Перенести
from datetime import datetimeв начало файла. - Статус: Исправлено. Импорт вынесен на уровень модуля.
5. Консольная команда cat — заглушка
- Где:
console_commands/cat.py - Проблема: Функция просто печатает
"🐱 тут должен быть котик". Заглушка видна пользователю. - Решение: Либо реализовать (вызвать API котиков), либо убрать из
ALL_CONSOLE_COMMANDSиREADME.md.
6. on_command_error не сообщает пользователю об ошибке
- Где:
bot.py→on_command_error() - Проблема: Ошибки команд просто печатаются в
stdout. Пользователь в чате не видит, что команда выполнилась с ошибкой. - Решение: Добавить
await ctx.send("Произошла ошибка при выполнении команды.")или отправить embed с деталями (еслиctxне None).
7. Нет .gitignore ✅ РЕШЕНО
- Где: проект
- Проблема: Отсутствовал
.gitignore,.envмог случайно попасть в репозиторий. - Решение: Создать
.gitignoreс правилами для Python (__pycache__/,*.pyc,.env,venv/,*.egg-info/), логов, временных файлов, кэша ОС и IDE. - Статус: Исправлено.
.gitignoreсоздан и обновлён.
8. requests без Session — нет переиспользования соединений
- Где: все файлы (
pogoda.py,news.py) - Проблема: Каждый
requests.get()создаёт новое TCP-соединение. Для частых запросов это расточительно. - Решение: Создать
requests.Session()и использоватьsession.get().
🟢 Малые улучшения
9. Linear search в _translate_weather
- Где:
commands/pogoda.py,console_commands/pogoda.py - Проблема: Метод
_translate_weather()перебирает весь словарьmappingцикломfor key, value in mapping.items(). При большом словаре — неэффективно. - Решение: Сортировать ключи по длине (убывание) и использовать
reилиany(key.lower() in text.lower() for key in sorted_keys).
10. Нет __all__ в __init__.py
- Где:
commands/__init__.py,console_commands/__init__.py - Проблема: Нет явного экспорта публичного API модулей.
- Решение: Добавить
__all__ = ["ALL_COMMANDS"]/__all__ = ["ALL_CONSOLE_COMMANDS"].
11. Жёстко заданные URL в разных файлах
- Где:
commands/news.pyиconsole_commands/news.py - Проблема: Константы
RSS_URL_ARTICLESиRSS_URL_POSTSпродублированы. - Решение: Вынести в
config.pyи импортировать оттуда.
12. Потенциальная гонка при остановке бота
- Где:
bot.py - Проблема:
stop_event.set()иbot.close()вызываются изconsole_input(),KeyboardInterruptиconsole_commands/stop.py. Возможна гонка. - Решение: Добавить флаг
is_stoppingили использоватьasyncio.Lock.