54 Commits

Author SHA1 Message Date
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
47e4b60111 docs: синхронизировать ISSUES.md, обновить README.md, очистить AGENTS.md
- ISSUES.md: закрыто 7 задач с ссылками на коммиты (on_command_error, !hp харкод, харкод URL, utils/__init__.py, print→logging, автогенерация !hp, дублирование команд, healthcheck)
- AGENTS.md: удалена пустая секция 'Структура проекта' (есть в README.md)
- README.md: обновлена архитектура (добавлены utils/__init__.py, utils/morning_runner.py, console_commands/help.py, Docker-файлы), исправлено кол-во тестов (262→204), добавлена секция 'Запуск в Docker', убрана ссылка на AGENTS.md как основной документ, добавлена консольная команда help, обновлены таблицы утилит
2026-06-09 21:37:07 +05:00
deadzilla
52fdbc3778 refactor: заменил print() на logging для системных сообщений
- bot.py: startup, shutdown, ошибки авторизации → logger.info/error/critical
- utils/pogoda.py: retry и ошибки API → logger.warning/error
- console_commands/stop.py: ошибка остановки → logger.error
- commands/help.py: удалён артефакт print("Cog loaded!")
- Интерактивное меню и пользовательский вывод console_commands/ оставлены как print()
2026-06-09 21:16:13 +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
d698380cd7 fix: исправил crash в on_command_error при текстовых командах
- ctx.command.name: добавлена проверка ctx.command на None
- ctx.interaction: добавлен hasattr() — атрибута нет у commands.Context
  (текстовые команды !prefix), что вызывало AttributeError
2026-06-09 18:19:18 +05:00
deadzilla
978340f0dd docs: добавил ISSUES.md — задачи и баг-трекер проекта 2026-06-09 18:09:54 +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
5a3fcb06c4 feat: добавить консольную команду help для вывода списка команд 2026-06-02 22:51:53 +05:00
deadzilla
aec4cb5c18 feat: добавить команду help !hp для вывода списка всех команд 2026-06-02 22:45:22 +05:00
deadzilla
55b3a5604e docs: добавить правило о разделении документации между AGENTS.md и README.md 2026-06-02 22:28:51 +05:00
deadzilla
1000f8ea0b chore: добавить coverage файлы в .gitignore 2026-06-02 22:20:45 +05:00
deadzilla
a9decd848a refactor: переработка AGENTS.md — системный промпт + базовые правила работы 2026-06-02 22:18:20 +05:00
deadzilla
030c6ed74b Исправлена команда !nw, обновлены README и убран ISSUES.md 2026-06-01 23:09:44 +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
e2c4ecdf5d refactor: переименовать команду !news на !nw
Изменения согласно требованиям AGENTS.md (отсутствие восклицательных знаков):
• commands/news.py — переименование команды с 'news' на 'nw'
  * name=nw вместо name=news
  * async def news() → async def nw()
  * Обновление docstring классов

• AGENTS.md — обновление документationen
  *  →  в таблице команд
  * RSS-ленты Habr (!news, !morning) → (!nw, !morning)

Примечание:
- Изменение прозрачно для пользователей (команда работает так же)
- Тесты не требуют переименования (проверяют код логики, а не имена команд)
- Все тесты проходят успешно
2026-06-01 16:35:08 +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
1a7f2d75b8 Добавить MORNING_CHANNEL_ID для утреннего дайджеста 2026-05-31 23:42:03 +05:00
deadzilla
0d605eea5a Переименовать команду погоды: pogoda -> pg, удалить docker-audit.md 2026-05-31 23:13:23 +05:00
deadzilla
6e31a7e6ff fix: Docker container exit on startup
- bot.py: добавить проверку sys.stdin.isatty() для консольного ввода
  - В Docker stdin не является терминалом, input() падал с EOFError
  - Консольный режим теперь запускается только в интерактивном терминале
- Dockerfile: добавить console_commands/, убрать копирование .env,
  использовать переменные docker-compose
2026-05-31 20:23:23 +05:00
deadzilla
7bfb96c31d Улучшения Docker: обновить до Python 3.14, оптимизировать COPY, добавить healthcheck и ARG для версии Python 2026-05-31 18:01:50 +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
d12579b73c fix: исправить импорт discord.ext.commands в morning_runner.py
- Заменить 'from discord import commands' на 'from discord.ext import commands'
- Исправлена ошибка ImportError, из-за которой не запускались тесты
- Обновлена документация AGENTS.md
2026-05-31 12:28:29 +05:00
deadzilla
05722c05ec fix: добавить импорт commands в morning_runner 2026-05-29 23:05:59 +05:00
deadzilla
054422b764 feat: добавить Docker-файлы для деплоя бота 2026-05-29 22:29:32 +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
b912312271 Обновить README: добавить morning, utils, тесты, зависимости 2026-05-29 17:34:54 +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
deadzilla
6ae8442b57 Убрать эмодзи из console_commands/cat.py и почистить ISSUES.md 2026-05-29 09:26:20 +05:00
deadzilla
680a3c822a docs: обновить AGENTS.md и очистить ISSUES.md с новым TODO-списком 2026-05-26 21:48:19 +05:00
deadzilla
7bc5bae413 Добавить второй блок новостей в !news, !morning и console morning 2026-05-26 21:25:14 +05:00
deadzilla
cc6ed5c183 Добавить команду !morning (погода + новости) и console команду morning 2026-05-26 19:47:56 +05:00
deadzilla
bc8b664d7d refactor: вынести fetch_cat в utils, добавить повторный вывод списка команд 2026-05-26 18:56:11 +05:00
deadzilla
25a8e77fb0 fix: использовать requests.Session для переиспользования соединений (ISSUE #8) 2026-05-26 18:17:17 +05:00
deadzilla
4656495417 fix: улучшить on_command_error — логирование деталей и нейтральное сообщение пользователю 2026-05-26 18:08:46 +05:00
deadzilla
55a07e2a3c fix: вынести импорт datetime на уровень модуля (ISSUE #4) 2026-05-26 17:55:28 +05:00
deadzilla
7bfbfa8075 docs: добавить правила согласования коммитов и русского языка сообщений в AGENTS.md 2026-05-26 14:03:04 +05:00
deadzilla
4a40f705d4 fix: resolve issue #3 (deduplication) and fix coroutine handling
- 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
2026-05-26 13:58:35 +05:00
deadzilla
e1a0f6d2b6 refactor: вынести логику погоды в utils/pogoda.py (проблема 3)
- Создать utils/pogoda.py с общими функциями:
  - fetch_weather, fetch_open_meteo, wmo_to_russian, translate_weather, pressure_to_mmhg
- Обновить commands/pogoda.py: убрать дубликаты, импортировать из utils
- Обновить console_commands/pogoda.py: убрать дубликаты, импортировать из utils
- Сделать console_commands/pogoda.py async (требует fetch_weather)
- Обновить AGENTS.md и ISSUES.md (проблема 7 решена)
2026-05-26 12:32:15 +05:00
deadzilla
3dfb7a0405 chore: обновить .gitignore и удалить __pycache__ из репозитория
Добавлены паттерны:
- __pycache__/, *.py[cod], *.pyo - Python кэш
- venv/, env/, .venv/ - виртуальные окружения
- .env - переменные окружения
- *.log, *.bak, *.tmp, *.cache - временные файлы
- Thumbs.db, .DS_Store - кэш ОС
- .vscode/, .idea/ - IDE

Удалены из git:
- commands/__pycache__/__init__.cpython-314.pyc
- commands/__pycache__/pogoda.cpython-314.pyc
2026-05-26 11:54:26 +05:00
deadzilla
b0dc63234d Revert "chore: добавить Python cache и venv в .gitignore"
This reverts commit 747a7d3ab5464aabf5108ea5d6a89a692b1779ee.
2026-05-26 10:54:47 +05:00
deadzilla
747a7d3ab5 chore: добавить Python cache и venv в .gitignore 2026-05-26 10:49:11 +05:00
deadzilla
bf166735a6 fix: исправить блокировку event loop и добавить retry задержку
- Добавить экспоненциальную задержку между попытками 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 с фиксацией проблем проекта
2026-05-26 10:24:26 +05:00
deadzilla
eb53a5ba81 docs: добавить README.md 2026-05-26 09:24:32 +05:00
deadzilla
347aa6ced7 feat: добавить команду !cat и консольную команду pogoda 2026-05-26 00:25:31 +05:00
deadzilla
78ad6fb3bb feat: обновить формат новостей (заголовок/дата+ссылка), добавить блок новостей с habr.com/ru/rss/hubs/artificial_intelligence/news/ 2026-05-25 23:58:54 +05:00
deadzilla
4db31e8b56 feat: вывести список команд после загрузки бота
- Добавить bot_ready = threading.Event() для синхронизации
- Переместить bot_ready.set() после цикла загрузки команд
- Добавить bot_ready.wait() в console_input()
- Меню появляется только после 'Бот вошёл' и 'Загружен: ...'
2026-05-25 21:57:59 +05:00
deadzilla
6fe8334311 feat: добавить команду !news для AI-новостей с Habr
- Парсинг RSS через ElementTree (RSS 2.0 / Atom)
- Данные: title, dc:creator, guid isPermaLink, pubDate, category
- Формат: заголовок до 60 символов, дата дд.мм.гггг, теги
- Ссылки без https://, кликабельные
- Консольная команда: !news
2026-05-25 12:04:44 +05:00
deadzilla
6553c9140f docs: обновить AGENTS.md с описанием архитектуры, API, конвертаций и безопасности 2026-05-25 00:24:56 +05:00
deadzilla
db2ac21b41 fix: исправить дублирование кода, добавить retry и fallback для погоды
- Убран дублирующийся on_command_error и импорт CommandNotFound
- stop.py: добавлены аргументы stop_event, bot + обработка ошибок
- console_commands интегрирован в console_input()
- pogoda.py: retry (3 попытки), fallback на Open-Meteo при SSL-ошибках
- pogoda.py: безопасная обработка wind_kmh и давления
- pogoda.py: сортировка translate-словаря по длине ключа
- Добавлен _wmo_to_russian() для WMO weather code
2026-05-25 00:07:20 +05:00