20 Commits

Author SHA1 Message Date
deadzilla
8ee5ed669f Исправление планировщика morning: tasks.loop → asyncio.sleep
- 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 и уточнил имена).
2026-06-16 22:10:40 +05:00
deadzilla
4027b7df6c feat: ротация логов по размеру (RotatingFileHandler, 5 МБ, 5 бэкапов) 2026-06-12 21:43:00 +05:00
deadzilla
9c7909bde5 fix: автоматическое создание директории logs при запуске бота 2026-06-12 21:11:23 +05:00
deadzilla
c37baafacc feat: добавлены консольные команды logs, reload, trigger morning
- console_commands/logs.py — чтение последних строк лога (tail -20)
- console_commands/reload.py — горячая перезагрузка всех cogs
- console_commands/trigger_morning.py — ручной запуск morning-дайджеста
- logs доступна через admin.py (docker exec) и интерактивный терминал
- reload и trigger morning доступны через интерактивный терминал
- сохранён bot._scheduler для доступа к планировщику
- обновлены __init__.py, admin.py, README.md, ISSUES.md
- добавлены тесты: test_console_logs.py (4), test_console_reload.py (2), test_console_trigger_morning.py (3)
- итого 243 теста
2026-06-12 18:03:47 +05:00
deadzilla
f4d267d254 fix: !stats исключает CategoryChannel из подсчёта каналов
guild.channels содержит все типы включая CategoryChannel.
Категории — это контейнеры для группировки, а не каналы.

Изменено:
  - commands/stats.py: filter по isinstance(CategoryChannel)
  - console_commands/stats.py: аналогичный фильтр
  - test_commands_stats.py: тест test_stats_excludes_categories
  - Итого: 234 теста
2026-06-12 17:01:53 +05:00
deadzilla
f2844f0453 fix: uptime читается с bot._start_time вместо Cog
Проблема: _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
2026-06-12 16:32:55 +05:00
deadzilla
91f34625a8 feat: команды !status и !stats
Добавлены Discord-команды:
  - !status — пинг к gateway, uptime, статус (embed)
  - !stats — серверы, каналы, пользователи (embed)

Добавлены консольные команды:
  - status — статус бота в терминале
  - stats — статистика серверов в терминале

Тесты:
  - test_commands_status.py (6 тестов)
  - test_commands_stats.py (4 теста)
  - всего: 233 теста

Обновления:
  - README.md — новые команды в таблицах и архитектуре
  - ISSUES.md — высокий приоритет закрыт
  - admin.py — hint на !status и !stats
2026-06-12 16:19:21 +05:00
deadzilla
12ed515cca feat: admin.py для управления ботом через docker exec
- Добавлен console_commands/admin.py — CLI-скрипт с командами
  pogoda, news, cat, morning, help
- Добавлен docstring к методу pg (отображается в !hp)
- Обновлён README.md: архитектура, администрирование в Docker, тесты
- Добавлены тесты test_admin.py (5 тестов)
- Итого тестов: 223
2026-06-12 16:06:35 +05:00
deadzilla
a52bb94224 feat: настроить логирование (stdout + файл, LOG_LEVEL) 2026-06-11 23:43:01 +05:00
deadzilla
26666550ac feat: добавить rate-limiting для всех внешних API-вызовов 2026-06-11 22:42:23 +05:00
deadzilla
071e313015 refactor: инкапсулировать глобальные переменные в BotRunner + валидация конфига
- bot.py: создан класс BotRunner (bot, stop_event, bot_ready, scheduler)
- bot.py: добавлена _validate_config() — проверка MORNING_TIME (ЧЧ:ММ) и MORNING_CHANNEL_ID (int)
- bot.py: убраны все глобальные переменные
- Dockerfile: healthcheck через ps aux (проверка процесса python bot.py)
- docker-compose.yml: добавлен MORNING_CHANNEL_ID
- ISSUES.md: закрыто 3 задачи (валидация конфига, инкапсуляция, multi-stage)
- tests/test_bot.py: адаптирован тест под BotRunner
2026-06-09 23:09:02 +05:00
deadzilla
2690ee72e3 refactor: !hp собирает список команд из bot.commands вместо хардкода
- commands/help.py: список команд генерируется автоматически из
  ctx.bot.commands с описаниями из docstring
- tests/test_help_discord.py: добавлен _make_mock_command() и мок
  ctx.bot.commands для тестов
2026-06-09 20:39:43 +05:00
deadzilla
560dc558a9 refactor: убрал дублирование логики получения данных
- utils/pogoda.py: добавлена API_URL_WEATHER, format_weather_for_embed(),
  проверка None в format_weather_data_for_console()
- utils/morning_runner.py: вынесен MorningData (dataclass) и gather_morning();
  run_morning() использует их вместо ручного asyncio.gather
- utils/__init__.py: экспортирован публичный API (__all__)
- commands/pg.py: убран ручной парсинг погоды, используется
  format_weather_data_for_console()
- console_commands/morning.py: дубликат asyncio.gather заменён на gather_morning()
- console_commands/pogoda.py: хардкод URL заменён на API_URL_WEATHER
- console_commands/cat.py: заглушка заменена на рабочий вызов fetch_cat()
- tests/test_commands_pg.py: обновлён тест fetch_returns_none (бот теперь
  отправляет сообщение об ошибке вместо молчаливого возврата)
2026-06-09 17:37:18 +05:00
deadzilla
2188a7d3fd feat: упростить вывод команды !hp, добавить тесты
- Убран discord.Embed в пользу простого текста без timestamp ошибки
- Добавлены разделители = вокруг заголовка
- Создан tests/test_help_discord.py с 2 тестами для Discord команды
- Создан tests/test_help_console.py с 2 тестами для консольной команды
- Закрыто: AttributeError 'Message' object has no attribute 'timestamp'
2026-06-02 23:14:37 +05:00
deadzilla
da84ecacdc fix: исправить совместимость с discord.py без raise_exception=True
Исправление ошибки совместимости:
• 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 тестов проходят успешно
2026-06-01 16:38:44 +05:00
deadzilla
71bcd66794 feat: закрываю Sprint 1 — все 3 задачи выполнены
Задачи 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
2026-06-01 16:32:02 +05:00
deadzilla
0d605eea5a Переименовать команду погоды: pogoda -> pg, удалить docker-audit.md 2026-05-31 23:13:23 +05:00
deadzilla
8cd1e48ede fix: устранить RuntimeWarning о не-awaited coroutine в тестах
- TestSchedulerInit: замокать tasks.loop через контекстный менеджер
- TestSchedulerCalculateNextRun: добавить autouse fixture для патча tasks.loop
- TestSchedulerStartStop: добавить autouse fixture для патча tasks.loop
- test_run_morning_sends_embed: патчить fetch_weather/fetch_rss/fetch_cat
  напрямую вместо asyncio.gather, чтобы избежать не-awaited корутин
2026-05-31 12:34:29 +05:00
deadzilla
66d188c1cd Добавить планировщик утреннего дайджеста
- utils/morning_runner.py: Scheduler + run_morning()
- bot.py: автоматический запуск планировщика при старте
- commands/morning.py: использовать run_morning() вместо дублирования
- .env.example: добавить MORNING_TIME=07:00
- AGENTS.md: обновить документацию
- tests/test_morning_runner.py: 10 тестов для Scheduler
2026-05-29 17:48:26 +05:00
deadzilla
4b9bb7e97a Добавить pytest-тесты и конфигурацию
- pytest.ini для конфигурации тестов
- tests/test_pogoda.py — тесты translate_weather, pressure_to_mmhg, wmo_to_russian (93 теста)
- tests/test_fetch_cat.py — тесты fetch_cat (10 тестов)
- tests/test_fetch_rss.py — тесты fetch_rss (20 тестов)
- tests/test_format_articles.py — тесты truncate_title, parse_date, format_articles (24 теста)
- tests/test_fetch_weather.py — тесты fetch_weather, fetch_open_meteo (20 тестов)
- tests/test_commands_pogoda.py — тесты команды !pogoda (13 тестов)
- Обновить AGENTS.md и requirements.txt
2026-05-29 15:45:56 +05:00