guild.channels содержит все типы включая CategoryChannel.
Категории — это контейнеры для группировки, а не каналы.
Изменено:
- commands/stats.py: filter по isinstance(CategoryChannel)
- console_commands/stats.py: аналогичный фильтр
- test_commands_stats.py: тест test_stats_excludes_categories
- Итого: 234 теста
Проблема: _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
- commands/help.py: список команд генерируется автоматически из
ctx.bot.commands с описаниями из docstring
- tests/test_help_discord.py: добавлен _make_mock_command() и мок
ctx.bot.commands для тестов
- 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 (бот теперь
отправляет сообщение об ошибке вместо молчаливого возврата)
- Убран discord.Embed в пользу простого текста без timestamp ошибки
- Добавлены разделители = вокруг заголовка
- Создан tests/test_help_discord.py с 2 тестами для Discord команды
- Создан tests/test_help_console.py с 2 тестами для консольной команды
- Закрыто: AttributeError 'Message' object has no attribute 'timestamp'
Изменения согласно требованиям 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)
Примечание:
- Изменение прозрачно для пользователей (команда работает так же)
- Тесты не требуют переименования (проверяют код логики, а не имена команд)
- Все тесты проходят успешно
- 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
- Добавить экспоненциальную задержку между попытками 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 с фиксацией проблем проекта
- Replace Open-Meteo API with wttr.in (no API key needed)
- Convert wind speed from km/h to m/s
- Add weather description translation (EN → RU)
- Add "FeelsLikeC" to pogoda output
- Fix console stop command using asyncio.run_coroutine_threadsafe
- Add on_command_error handler to suppress CommandNotFound logs