From a3e11b1e9c6827adbb3b4f68936ca34e58299f9b Mon Sep 17 00:00:00 2001 From: deadzilla Date: Fri, 29 May 2026 17:34:54 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20README:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20morning,=20utils,=20=D1=82=D0=B5=D1=81=D1=82=D1=8B,=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 66 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index f958832..21ccb33 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Discord Bot -Discord-бот для Магнитогорска. Команды погоды, новостей и развлечений. +Discord-бот для Магнитогорска. Команды погоды, новостей, котиков и утреннего дайджеста. ## Установка @@ -36,6 +36,7 @@ python bot.py |---------|----------| | `!pogoda` | Прогноз погоды для Магнитогорска | | `!news` | Топ-5 свежих статей по AI с Habr | +| `!morning` | Погода + топ-5 статей + топ-5 новостей + котик (утренний дайджест) | | `!cat` | Случайный котик | | `!msg <текст>` | Повторить текст в чате | @@ -45,7 +46,8 @@ python bot.py |-------|---------|----------| | 1 | `news` | Топ-5 статей + топ-5 новостей с Habr | | 2 | `pogoda` | Прогноз погоды для Магнитогорска | -| 3 | `cat` | Заглушка: тут должен быть котик | +| 3 | `morning` | Погода + топ-5 статей + топ-5 новостей + котик | +| 4 | `cat` | Вывести URL случайного котика | | 0 | `stop` | Остановка бота | ## Архитектура @@ -57,12 +59,27 @@ commands/ # Discord команды (cogs) pogoda.py # !pogoda — погода с retry + fallback news.py # !news — новости с Habr cat.py # !cat — случайный котик + morning.py # !morning — утренний дайджест console_commands/ # Консольные команды __init__.py # ALL_CONSOLE_COMMANDS — явные импорты stop.py # stop — остановка бота news.py # news — новости с Habr pogoda.py # pogoda — погода в терминале - cat.py # cat — заглушка котика + morning.py # morning — утренний дайджест в терминале + cat.py # cat — вывод URL котика +utils/ # Утилиты (API-клиенты, конвертации) + pogoda.py # fetch_weather(), fetch_open_meteo(), wmo_to_russian(), translate_weather(), pressure_to_mmhg() + 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_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_pogoda.py # Pogoda cog +ISSUES.md # Задачи и баг-трекер проекта +pytest.ini # Конфигурация pytest ``` ### Добавление Discord команды @@ -77,28 +94,47 @@ console_commands/ # Консольные команды 2. Добавить импорт в `console_commands/__init__.py` 3. Добавить функцию в `ALL_CONSOLE_COMMANDS` +## Запуск тестов + +```bash +python -m pytest tests/ -v +``` + +### Структура тестов + +| Файл | Что тестирует | Кол-во | +|------|---------------|--------| +| `test_pogoda.py` | `translate_weather()`, `pressure_to_mmhg()`, `wmo_to_russian()` | 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_pogoda.py` | `Pogoda` cog, команда `!pogoda` | 13 | + +**Итого: 180 тестов.** + ## API и внешние сервисы -### Погода (!pogoda) -- **Основной**: `wttr.in` (бесплатный, без ключа) +### Погода (!pogoda, !morning) +- **Основной**: `wttr.in/Magnitogorsk` (бесплатный, без ключа) - **Fallback**: `api.open-meteo.com` (бесплатный, без ключа) - Retry: 3 попытки с экспоненциальной задержкой при SSL/Connection/Timeout ошибках - Fallback срабатывает автоматически при неуспешных попытках -- WMO weather codes → русский перевод в `_wmo_to_russian()` +- WMO weather codes → русский перевод в `wmo_to_russian()` ### Конвертации - Давление: hPa → мм рт. ст. (`* 0.750062`) - Ветер: км/ч → м/с (`/ 3.6`) -- Погодные описания: английский → русский (`_translate_weather()`) +- Погодные описания: английский → русский (`translate_weather()`) -### Новости (!news) +### Новости (!news, !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 форматов - Извлечение ссылок из `` и авторов из `` - Формат вывода: заголовок → дата → ссылка -### Котики (!cat) +### Котики (!cat, !morning) - **API**: `https://api.thecatapi.com/v1/images/search` - Картинка встраивается в Discord Embed @@ -107,11 +143,11 @@ console_commands/ # Консольные команды Команда `!pogoda` возвращает: ``` -[TEMP] Температура: X°C (ощущается как Y°C) -[DESC] Описание: Z -[HUMID] Влажность: X% -[WIND] Ветер: X м/с -[PRESS] Давление: X мм рт. ст. +Температура: X°C (ощущается как Y°C) +Описание: Z +Влажность: X% +Ветер: X м/с +Давление: X мм рт. ст. ``` ## Формат дат @@ -130,6 +166,8 @@ console_commands/ # Консольные команды discord.py>=2.3.2 python-dotenv>=1.0.0 requests>=2.31.0 +pytest>=7.4.0 +pytest-asyncio>=0.21.0 ``` ## Безопасность