Исправлена команда !nw, обновлены README и убран ISSUES.md
This commit is contained in:
parent
da84ecacdc
commit
030c6ed74b
46
ISSUES.md
46
ISSUES.md
@ -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` блок
|
|
||||||
52
README.md
52
README.md
@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
Discord-бот для Магнитогорска. Команды погоды, новостей, котиков и утреннего дайджеста.
|
Discord-бот для Магнитогорска. Команды погоды, новостей, котиков и утреннего дайджеста.
|
||||||
|
|
||||||
|
## 📖 Документация
|
||||||
|
|
||||||
|
Основной документ проекта — [`AGENTS.md`](./AGENTS.md). Содержит детальные инструкции по архитектуре, командам и работе с ботом.
|
||||||
|
|
||||||
## Установка
|
## Установка
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@ -34,8 +38,8 @@ python bot.py
|
|||||||
|
|
||||||
| Команда | Описание |
|
| Команда | Описание |
|
||||||
|---------|----------|
|
|---------|----------|
|
||||||
| `!pogoda` | Прогноз погоды для Магнитогорска |
|
| `!pg` | Прогноз погоды для Магнитогорска |
|
||||||
| `!news` | Топ-5 свежих статей по AI с Habr |
|
| `!nw` | Топ-5 свежих статей по AI с Habr |
|
||||||
| `!morning` | Погода + топ-5 статей + топ-5 новостей + котик (утренний дайджест) |
|
| `!morning` | Погода + топ-5 статей + топ-5 новостей + котик (утренний дайджест) |
|
||||||
| `!cat` | Случайный котик |
|
| `!cat` | Случайный котик |
|
||||||
| `!msg <текст>` | Повторить текст в чате |
|
| `!msg <текст>` | Повторить текст в чате |
|
||||||
@ -57,7 +61,7 @@ bot.py # Точка входа, инициализация бо
|
|||||||
commands/ # Discord команды (cogs)
|
commands/ # Discord команды (cogs)
|
||||||
__init__.py # ALL_COMMANDS — явные импорты
|
__init__.py # ALL_COMMANDS — явные импорты
|
||||||
pg.py # !pg — погода с retry + fallback
|
pg.py # !pg — погода с retry + fallback
|
||||||
news.py # !news — новости с Habr
|
news.py # !nw — новости с Habr
|
||||||
cat.py # !cat — случайный котик
|
cat.py # !cat — случайный котик
|
||||||
morning.py # !morning — утренний дайджест
|
morning.py # !morning — утренний дайджест
|
||||||
console_commands/ # Консольные команды
|
console_commands/ # Консольные команды
|
||||||
@ -68,16 +72,18 @@ console_commands/ # Консольные команды
|
|||||||
morning.py # morning — утренний дайджест в терминале
|
morning.py # morning — утренний дайджест в терминале
|
||||||
cat.py # cat — вывод URL котика
|
cat.py # cat — вывод URL котика
|
||||||
utils/ # Утилиты (API-клиенты, конвертации)
|
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()
|
news.py # fetch_rss(), format_articles(), truncate_title(), parse_date()
|
||||||
cat.py # fetch_cat()
|
cat.py # fetch_cat()
|
||||||
tests/ # pytest-тесты
|
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_cat.py # fetch_cat
|
||||||
test_fetch_rss.py # fetch_rss
|
test_fetch_rss.py # fetch_rss
|
||||||
test_fetch_weather.py # fetch_weather, fetch_open_meteo
|
test_fetch_weather.py # fetch_weather, fetch_open_meteo
|
||||||
test_format_articles.py # truncate_title, parse_date, format_articles
|
test_format_articles.py # truncate_title, parse_date, format_articles
|
||||||
test_commands_pg.py # Pg cog
|
test_commands_pg.py # Pg cog
|
||||||
|
test_bot.py # инициализация бота
|
||||||
|
test_morning_runner.py# тесты morning runner-а
|
||||||
ISSUES.md # Задачи и баг-трекер проекта
|
ISSUES.md # Задачи и баг-трекер проекта
|
||||||
pytest.ini # Конфигурация pytest
|
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_cat.py` | `fetch_cat()` | 10 |
|
||||||
| `test_fetch_rss.py` | `fetch_rss()` | 20 |
|
| `test_fetch_rss.py` | `fetch_rss()` | 20 |
|
||||||
| `test_fetch_weather.py` | `fetch_weather()`, `fetch_open_meteo()` | 20 |
|
| `test_fetch_weather.py` | `fetch_weather()`, `fetch_open_meteo()` | 20 |
|
||||||
| `test_format_articles.py` | `truncate_title()`, `parse_date()`, `format_articles()` | 24 |
|
| `test_format_articles.py` | `truncate_title()`, `parse_date()`, `format_articles()` | 24 |
|
||||||
| `test_commands_pg.py` | `Pg` cog, команда `!pg` | 13 |
|
| `test_commands_pg.py` | `Pg` cog, команда `!pg` | 13 |
|
||||||
|
| `test_bot.py` | инициализация бота | 7 |
|
||||||
|
| `test_morning_runner.py` | morning runner-а | 68 |
|
||||||
|
|
||||||
**Итого: 180 тестов.**
|
**Итого: 258 тестов.**
|
||||||
|
|
||||||
## API и внешние сервисы
|
## API и внешние сервисы
|
||||||
|
|
||||||
@ -127,7 +135,7 @@ python -m pytest tests/ -v
|
|||||||
- Ветер: км/ч → м/с (`/ 3.6`)
|
- Ветер: км/ч → м/с (`/ 3.6`)
|
||||||
- Погодные описания: английский → русский (`translate_weather()`)
|
- Погодные описания: английский → русский (`translate_weather()`)
|
||||||
|
|
||||||
### Новости (!news, !morning)
|
### Новости (!nw, !morning)
|
||||||
- **Articles**: `https://habr.com/ru/rss/hubs/artificial_intelligence/articles/top/daily/?fl=ru`
|
- **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`
|
- **News**: `https://habr.com/ru/rss/hubs/artificial_intelligence/news/top/daily/?fl=ru`
|
||||||
- Парсинг RSS 2.0 и Atom форматов
|
- Парсинг RSS 2.0 и Atom форматов
|
||||||
@ -189,3 +197,31 @@ pytest-asyncio>=0.21.0
|
|||||||
Заголовки обрезаются до 60 символов с суффиксом `...`.
|
Заголовки обрезаются до 60 символов с суффиксом `...`.
|
||||||
|
|
||||||
Ссылки отображаются без `<>` и `https://` префикса для предотвращения embed-превью в Discord.
|
Ссылки отображаются без `<>` и `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 случайного котика |
|
||||||
|
|||||||
@ -4,7 +4,7 @@ from utils.news import fetch_rss, format_articles, RSS_URL_ARTICLES, RSS_URL_POS
|
|||||||
|
|
||||||
|
|
||||||
class News(commands.Cog):
|
class News(commands.Cog):
|
||||||
"""Команда !nw — свежие статьи по AI с Habr"""
|
"""Команда !news — свежие статьи и новости по AI с Habr"""
|
||||||
|
|
||||||
@commands.command(name="nw")
|
@commands.command(name="nw")
|
||||||
async def nw(self, ctx):
|
async def nw(self, ctx):
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user