- Scheduler больше не опрашивает каждую секунду (tasks.loop мог пропустить
момент срабатывания из-за неточности тайминга). Теперь спит ровно до
целевого времени через asyncio.sleep, затем запускает morning и повторяет.
- Добавлено логирование ожидания и срабатывания расписания.
- Перенес инициализацию планировщика из on_ready в on_guild_available —
гарантирует, что кэш гильдии загружен до запуска Scheduler.
- Обновлены тесты под новый Scheduler (asyncio.create_task вместо tasks.loop).
- README.md: исправлены пути admin.py → console_commands/admin.py для docker exec.
- docker-compose.yml: добавлены переменные LOG_LEVEL и rate-limit конфиги.
- console_commands/__init__.py: переименованы help → console_help,
reload → reload_cogs (избежал конфликта с built-in и уточнил имена).
Проблема: _start_time хранился в Status Cog, но консольная
команда искала его на объекте bot — всегда получала fallback
time.time() и показывала 0с.
Решение: _start_time устанавливается в BotRunner.__init__ на
объекте bot. Cog и console_command читают getattr(bot, '_start_time').
Изменено: bot.py, commands/status.py, console_commands/status.py,
tests/test_commands_status.py
- ctx.command.name: добавлена проверка ctx.command на None
- ctx.interaction: добавлен hasattr() — атрибута нет у commands.Context
(текстовые команды !prefix), что вызывало AttributeError
Исправление ошибки совместимости:
• bot.py — убран параметр raise_exception=True (не поддерживается в версии discord.py)
* bot.run(token, raise_exception=True) → bot.run(token)
* Обработка исключений сохранена через try/except вокруг bot.run()
• tests/test_bot.py — обновлённый тест проверки кода обработки ошибок
* Убрана проверка на 'raise_exception=True' (не поддерживается)
* Добавлена проверка на вызов 'bot.run(token)'
Преимущества:
- Бот корректно запускается без ошибки TypeError
- Обработка ошибок сохранена (LoginFailure, HTTPException, Exception)
- Все сообщения об ошибках выводятся пользователю и логируются критически
- 200 тестов проходят успешно
Задачи Sprint 1 (Critical Fixes):
- [1.1] Fallback в пустом embed (!morning) — добавлена проверка has_real_data и fallback сообщение при отключении внешних API
- [1.2] Обработка ошибок токена/сети в bot.run() — raise_exception=True + логирование LoginFailure, HTTPException, Exception
- [1.3] Рефакторинг парсинга погоды — вынесено в format_weather_data_for_console(), убран дублирующий код из 2 файлов
Изменения:
• utils/morning_runner.py — добавлена проверка has_real_data после формирования description_lines
• bot.py — обработчики исключений для запуска бота с детализированным логированием и пользовательскими сообщениями
• utils/pogoda.py — новая функция format_weather_data_for_console() для центрального форматирования погодных данных
• console_commands/pogoda.py — замена 15 строк дублирующейся логики на вызов единой функции (24→8 строк)
• console_commands/morning.py — аналогичные изменения для команды morning (19→13 строк с погодой)
• tests/test_morning_runner.py — +2 теста для fallback сценариев empty embed и only weather data
• tests/test_bot.py — новый файл с 2 тестами на проверку кода обработки ошибок
• tests/test_pogoda.py — +6 тестов для format_weather_data_for_console()
Статистика тестирования:
• Общее количество тестов: 200 (было 190)
• Новые тесты: 10
• Все тесты проходят успешно
Примечания:
- Сообщения без восклицательных знаков согласно preferencem
- bot.py: добавить проверку sys.stdin.isatty() для консольного ввода
- В Docker stdin не является терминалом, input() падал с EOFError
- Консольный режим теперь запускается только в интерактивном терминале
- Dockerfile: добавить console_commands/, убрать копирование .env,
использовать переменные docker-compose
- Create utils/news.py with shared RSS parsing and formatting logic
- Refactor commands/news.py and console_commands/news.py to use utils/news.py
- Fix bot.py to handle async console commands (news, pogoda)
- Fix utils/pogoda.py to fall back to Open-Meteo on requests.RequestException
- Mark issue #3 as resolved in ISSUES.md
- Добавить bot_ready = threading.Event() для синхронизации
- Переместить bot_ready.set() после цикла загрузки команд
- Добавить bot_ready.wait() в console_input()
- Меню появляется только после 'Бот вошёл' и 'Загружен: ...'