21 Commits

Author SHA1 Message Date
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
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
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
5a3fcb06c4 feat: добавить консольную команду help для вывода списка команд 2026-06-02 22:51:53 +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
6ae8442b57 Убрать эмодзи из console_commands/cat.py и почистить ISSUES.md 2026-05-29 09:26:20 +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
55a07e2a3c fix: вынести импорт datetime на уровень модуля (ISSUE #4) 2026-05-26 17:55:28 +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
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
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
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
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
deadzilla
89f17d53d8 Refactor: add commands/, console_commands/, !pogoda command 2026-05-24 15:27:29 +05:00