refactor: вынести дублирующую логику RSS в _format_feed_section()

Блоки обработки articles и posts в !nw были почти идентичны.
Вынесено в _format_feed_section() с параметризацией лейблов,
сообщений об ошибках и заголовков RSS-источников.

Файлы: commands/news.py
This commit is contained in:
deadzilla 2026-07-22 22:07:17 +05:00
parent ecff77ef66
commit 5e01cc6d8f
2 changed files with 42 additions and 30 deletions

View File

@ -81,7 +81,7 @@
- [ ] **Отсутствует `pyproject.toml`** — проект использует `requirements.txt` + `requirements-dev.txt` без единого файла конфигурации. Рекомендуется `pyproject.toml` с `[project]`, настройками ruff и pytest - [ ] **Отсутствует `pyproject.toml`** — проект использует `requirements.txt` + `requirements-dev.txt` без единого файла конфигурации. Рекомендуется `pyproject.toml` с `[project]`, настройками ruff и pytest
- [ ] **`commands/news.py` — дублирование кода для статей и постов** — блоки обработки `articles` и `posts` почти идентичны (проверка `None`, форматирование, fallback). Вынести в вспомогательную функцию - [x] ~~**`commands/news.py` — дублирование кода для статей и постов**~~ — вынесено в `_format_feed_section()` (`commands/news.py`)
- [x] ~~**Город захардкожен в `API_URL_WEATHER`**~~ — вынесен в `WEATHER_CITY` env-переменную, шаблон `"Погода: {city}:"` (`utils/pogoda.py`, `.env.example`) - [x] ~~**Город захардкожен в `API_URL_WEATHER`**~~ — вынесен в `WEATHER_CITY` env-переменную, шаблон `"Погода: {city}:"` (`utils/pogoda.py`, `.env.example`)

View File

@ -1,5 +1,7 @@
import asyncio import asyncio
import logging import logging
from typing import Optional
from discord.ext import commands from discord.ext import commands
from utils.news import ( from utils.news import (
fetch_rss, fetch_rss,
@ -12,6 +14,29 @@ from utils.news import (
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def _format_feed_section(
data: Optional[list[dict]],
author: str,
label_warning: str,
label_info: str,
msg_error: str,
msg_empty: str,
title: str,
link: str,
) -> str:
"""Форматировать один RSS-раздел (статьи или посты)."""
if data is None:
logger.warning(
"%s: !nw — не удалось получить %s (API вернул None)", author, label_warning
)
return msg_error
elif data:
return "\n".join(format_articles(data, title, link))
else:
logger.info("%s: !nw — %s нет в RSS", author, label_info)
return msg_empty
class News(commands.Cog): class News(commands.Cog):
"""Команда !news — свежие статьи и новости по AI с Habr""" """Команда !news — свежие статьи и новости по AI с Habr"""
@ -23,41 +48,28 @@ class News(commands.Cog):
fetch_rss(RSS_URL_POSTS), fetch_rss(RSS_URL_POSTS),
) )
parts: list[str] = [] parts: list[str] = [
_format_feed_section(
# --- Статьи ---
if articles is None:
logger.warning(
"%s: !nw — не удалось получить статьи (API вернул None)", ctx.author
)
parts.append("Не удалось получить статьи.")
elif articles:
articles_text = format_articles(
articles, articles,
str(ctx.author),
"статьи",
"статей",
"Не удалось получить статьи.",
"Статей пока нет.",
"Лучшие статьи за сутки / Искусственный интеллект / Хабr", "Лучшие статьи за сутки / Искусственный интеллект / Хабr",
"https://habr.com/ru/hubs/artificial_intelligence/articles/top/daily/", "https://habr.com/ru/hubs/artificial_intelligence/articles/top/daily/",
) ),
parts.append("\n".join(articles_text)) _format_feed_section(
else:
logger.info("%s: !nw — статей нет в RSS", ctx.author)
parts.append("Статей пока нет.")
# --- Посты ---
if posts is None:
logger.warning(
"%s: !nw — не удалось получить посты (API вернул None)", ctx.author
)
parts.append("\nНе удалось получить новости.")
elif posts:
posts_text = format_articles(
posts, posts,
str(ctx.author),
"посты",
"постов",
"Не удалось получить новости.",
"Новостей пока нет.",
"Лучшие новости за сутки / Искусственный интеллект / Хабr", "Лучшие новости за сутки / Искусственный интеллект / Хабr",
"https://habr.com/ru/hubs/artificial_intelligence/news/top/daily/", "https://habr.com/ru/hubs/artificial_intelligence/news/top/daily/",
) ),
parts.append("\n" + "\n".join(posts_text)) ]
else:
logger.info("%s: !nw — постов нет в RSS", ctx.author)
parts.append("\nНовостей пока нет.")
message = truncate_message("\n".join(parts)) message = truncate_message("\n".join(parts))
await ctx.send(message) await ctx.send(message)