From 030c6ed74bb8c0bc90ea927e609576eb99fe671d Mon Sep 17 00:00:00 2001 From: deadzilla Date: Mon, 1 Jun 2026 23:09:44 +0500 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0?= =?UTF-8?q?=20!nw,=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20README=20=D0=B8=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=20ISS?= =?UTF-8?q?UES.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ISSUES.md | 46 ------------------------------------------ README.md | 52 ++++++++++++++++++++++++++++++++++++++++-------- commands/news.py | 2 +- 3 files changed, 45 insertions(+), 55 deletions(-) delete mode 100644 ISSUES.md diff --git a/ISSUES.md b/ISSUES.md deleted file mode 100644 index 0f14ce7..0000000 --- a/ISSUES.md +++ /dev/null @@ -1,46 +0,0 @@ -# Tasks — список задач проекта - -> Состояние на: 2026-05-26 - ---- - -## 🔴 Критические - -### 1. Убрать эмодзи из `console_commands/cat.py` -- [x] Заменить `print("🐱 тут должен быть котик")` на `print("Заглушка: тут должен быть котик")` - ---- - -## 🟡 Средние - -### 2. Убрать пустой embed в `!morning` при всех ошибках -- [ ] `commands/morning.py`: добавить fallback-сообщение в `description_lines`, если все API вернули `None` -- [ ] Проверить, что `embed.description` никогда не пустой - -### 3. Убрать дублирование парсинга погоды -- [ ] `console_commands/pogoda.py`: вынести форматирование результата в `utils/pogoda.py` как `format_weather_data()` -- [ ] `console_commands/morning.py`: использовать `format_weather_data()` вместо inline-парсинга -- [ ] `commands/morning.py`: использовать `format_weather_data()` вместо inline-парсинга - -### 6. Вынести `self.api_url` в константу класса -- [ ] `commands/pogoda.py`: заменить `self.api_url = ...` на `API_URL = "..."` на уровне класса -- [ ] `commands/morning.py`: аналогично -- [ ] `console_commands/pogoda.py`: вынести URL в `utils/pogoda.py` как константу - ---- - -## 🟢 Малые улучшения - -### 4. Вынести `api_url` в константу -- [ ] `commands/pogoda.py`: заменить `self.api_url = ...` на `API_URL = "..."` на уровне класса -- [ ] `commands/morning.py`: аналогично -- [ ] `console_commands/pogoda.py`: вынести URL в `utils/pogoda.py` как константу - -### 5. Добавить `__all__` в `__init__.py` -- [ ] `commands/__init__.py`: `__all__ = ["ALL_COMMANDS"]` -- [ ] `console_commands/__init__.py`: `__all__ = ["ALL_CONSOLE_COMMANDS"]` -- [ ] `utils/__init__.py`: добавить `__all__` с основными функциями - -### 6. Добавить `raise_exception=True` в `bot.run()` -- [ ] `bot.py`: добавить `raise_exception=True` для видимого падения при ошибках токена/сети -- [ ] Добавить логирование в `KeyboardInterrupt` блок diff --git a/README.md b/README.md index 4d4741c..2c39310 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,10 @@ Discord-бот для Магнитогорска. Команды погоды, новостей, котиков и утреннего дайджеста. +## 📖 Документация + +Основной документ проекта — [`AGENTS.md`](./AGENTS.md). Содержит детальные инструкции по архитектуре, командам и работе с ботом. + ## Установка ```bash @@ -34,8 +38,8 @@ python bot.py | Команда | Описание | |---------|----------| -| `!pogoda` | Прогноз погоды для Магнитогорска | -| `!news` | Топ-5 свежих статей по AI с Habr | +| `!pg` | Прогноз погоды для Магнитогорска | +| `!nw` | Топ-5 свежих статей по AI с Habr | | `!morning` | Погода + топ-5 статей + топ-5 новостей + котик (утренний дайджест) | | `!cat` | Случайный котик | | `!msg <текст>` | Повторить текст в чате | @@ -57,7 +61,7 @@ bot.py # Точка входа, инициализация бо commands/ # Discord команды (cogs) __init__.py # ALL_COMMANDS — явные импорты pg.py # !pg — погода с retry + fallback - news.py # !news — новости с Habr + news.py # !nw — новости с Habr cat.py # !cat — случайный котик morning.py # !morning — утренний дайджест console_commands/ # Консольные команды @@ -68,16 +72,18 @@ console_commands/ # Консольные команды morning.py # morning — утренний дайджест в терминале cat.py # cat — вывод URL котика utils/ # Утилиты (API-клиенты, конвертации) - pogoda.py # fetch_weather(), fetch_open_meteo(), wmo_to_russian(), translate_weather(), pressure_to_mmhg() + pogoda.py # fetch_weather(), fetch_open_meteo(), wmo_to_russian(), translate_weather(), pressure_to_mmhg(), format_weather_data_for_console() news.py # fetch_rss(), format_articles(), truncate_title(), parse_date() cat.py # fetch_cat() tests/ # pytest-тесты - test_pogoda.py # translate_weather, pressure_to_mmhg, wmo_to_russian + test_pogoda.py # translate_weather, pressure_to_mmhg, wmo_to_russian, format_weather_data_for_console test_fetch_cat.py # fetch_cat test_fetch_rss.py # fetch_rss test_fetch_weather.py # fetch_weather, fetch_open_meteo test_format_articles.py # truncate_title, parse_date, format_articles test_commands_pg.py # Pg cog + test_bot.py # инициализация бота + test_morning_runner.py# тесты morning runner-а ISSUES.md # Задачи и баг-трекер проекта pytest.ini # Конфигурация pytest ``` @@ -104,14 +110,16 @@ python -m pytest tests/ -v | Файл | Что тестирует | Кол-во | |------|---------------|--------| -| `test_pogoda.py` | `translate_weather()`, `pressure_to_mmhg()`, `wmo_to_russian()` | 93 | +| `test_pogoda.py` | `translate_weather()`, `pressure_to_mmhg()`, `wmo_to_russian()`, `format_weather_data_for_console()` | 93 | | `test_fetch_cat.py` | `fetch_cat()` | 10 | | `test_fetch_rss.py` | `fetch_rss()` | 20 | | `test_fetch_weather.py` | `fetch_weather()`, `fetch_open_meteo()` | 20 | | `test_format_articles.py` | `truncate_title()`, `parse_date()`, `format_articles()` | 24 | | `test_commands_pg.py` | `Pg` cog, команда `!pg` | 13 | +| `test_bot.py` | инициализация бота | 7 | +| `test_morning_runner.py` | morning runner-а | 68 | -**Итого: 180 тестов.** +**Итого: 258 тестов.** ## API и внешние сервисы @@ -127,7 +135,7 @@ python -m pytest tests/ -v - Ветер: км/ч → м/с (`/ 3.6`) - Погодные описания: английский → русский (`translate_weather()`) -### Новости (!news, !morning) +### Новости (!nw, !morning) - **Articles**: `https://habr.com/ru/rss/hubs/artificial_intelligence/articles/top/daily/?fl=ru` - **News**: `https://habr.com/ru/rss/hubs/artificial_intelligence/news/top/daily/?fl=ru` - Парсинг RSS 2.0 и Atom форматов @@ -189,3 +197,31 @@ pytest-asyncio>=0.21.0 Заголовки обрезаются до 60 символов с суффиксом `...`. Ссылки отображаются без `<>` и `https://` префикса для предотвращения embed-превью в Discord. + +## Основные функции утилит + +### utils/pogoda.py + +| Функция | Описание | +|---------|----------| +| `fetch_weather()` | Основная функция получения погоды с wttr.in | +| `fetch_open_meteo()` | Fallback при ошибках основного API | +| `wmo_to_russian()` | Перевод WMO кодов погоды в русское описание | +| `translate_weather()` | Перевод погодных описаний на русский язык | +| `pressure_to_mmhg()` | Конвертация давления из hPa в мм рт. ст. | +| `format_weather_data_for_console()` | Форматирование данных погоды для вывода в консоль | + +### utils/news.py + +| Функция | Описание | +|---------|----------| +| `fetch_rss()` | Получение RSS ленты (статьи или новости) | +| `parse_date()` | Парсинг даты из RSS | +| `truncate_title()` | Обрезка заголовка до заданной длины | +| `format_articles()` | Форматирование списка статей для вывода | + +### utils/cat.py + +| Функция | Описание | +|---------|----------| +| `fetch_cat()` | Получение URL случайного котика | diff --git a/commands/news.py b/commands/news.py index e6c3b97..f7d4e35 100644 --- a/commands/news.py +++ b/commands/news.py @@ -4,7 +4,7 @@ from utils.news import fetch_rss, format_articles, RSS_URL_ARTICLES, RSS_URL_POS class News(commands.Cog): - """Команда !nw — свежие статьи по AI с Habr""" + """Команда !news — свежие статьи и новости по AI с Habr""" @commands.command(name="nw") async def nw(self, ctx):