- Добавить экспоненциальную задержку между попытками retry (1с, 2с, 4с) в pogoda.py - Заменить time.sleep на await asyncio.sleep для неблокирующих ожиданий - Обернуть requests.get в asyncio.to_thread для предотвращения блокировки event loop (news.py, cat.py, pogoda.py) - Добавить правило AGENTS.md: не использовать эмодзи - Добавить ISSUES.md с фиксацией проблем проекта
6.0 KiB
6.0 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 - Проблема: Логика погоды и новостей полностью продублирована. Изменения нужно вносить в два места.
- Решение: Вынести общую логику в
utils/(например,utils/weather.py,utils/rss.py) и использовать её из обоих мест.
4. from datetime import datetime внутри метода
- Где:
commands/news.py→_format_and_send(), строки 56 и 72 - Проблема: Импорт внутри метода — антипаттерн. Замедляет выполнение, нарушает 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может случайно попасть в репозиторий, хотя AGENTS.md говорит ".envв.gitignore". - Решение: Создать
.gitignoreс правилами для Python (__pycache__/,*.pyc,.env,venv/,*.egg-info/).
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.