diff --git a/commands/news.py b/commands/news.py index f442c51..ff673fd 100644 --- a/commands/news.py +++ b/commands/news.py @@ -1,7 +1,13 @@ import logging import discord from discord.ext import commands -from utils.news import fetch_rss, format_articles, RSS_URL_ARTICLES, RSS_URL_POSTS +from utils.news import ( + fetch_rss, + format_articles, + RSS_URL_ARTICLES, + RSS_URL_POSTS, + truncate_embed_field, +) logger = logging.getLogger(__name__) @@ -36,7 +42,7 @@ class News(commands.Cog): embed.add_field( name="Статьи", - value="\n".join(articles_text), + value=truncate_embed_field("\n".join(articles_text)), inline=False, ) @@ -53,7 +59,7 @@ class News(commands.Cog): "https://habr.com/ru/hubs/artificial_intelligence/news/top/daily/") embed.add_field( name="Новости", - value="\n".join(posts_text), + value=truncate_embed_field("\n".join(posts_text)), inline=False, ) else: diff --git a/utils/morning_runner.py b/utils/morning_runner.py index b0ff353..ae3fe4c 100644 --- a/utils/morning_runner.py +++ b/utils/morning_runner.py @@ -15,7 +15,13 @@ from utils.pogoda import ( fetch_weather, format_weather_for_embed, ) -from utils.news import fetch_rss, format_articles, RSS_URL_ARTICLES, RSS_URL_POSTS +from utils.news import ( + fetch_rss, + format_articles, + RSS_URL_ARTICLES, + RSS_URL_POSTS, + truncate_embed_text, +) from utils.cat import fetch_cat logger = logging.getLogger(__name__) @@ -106,7 +112,8 @@ async def run_morning(bot: "commands.Bot", channel: discord.TextChannel): "Проверьте доступность API и повторите попытку позже." ] - embed.description = "\n".join(description_lines) + description = "\n".join(description_lines) + embed.description = truncate_embed_text(description) await channel.send(embed=embed) logger.info("✅ Утренний дайджест отправлен в #%s", channel.name) diff --git a/utils/news.py b/utils/news.py index 75665f5..e510a6f 100644 --- a/utils/news.py +++ b/utils/news.py @@ -93,6 +93,20 @@ def truncate_title(title, max_len=60): return title +def truncate_embed_text(text: str, max_len: int = 4096) -> str: + """Обрезать текст для embed.description (лимит Discord: 4096 символов).""" + if len(text) <= max_len: + return text + return text[:max_len - 3] + "..." + + +def truncate_embed_field(text: str, max_len: int = 1024) -> str: + """Обрезать текст для embed field value (лимит Discord: 1024 символа).""" + if len(text) <= max_len: + return text + return text[:max_len - 3] + "..." + + def format_articles(articles, title, link): """Сформировать список строк для вывода статей/постов.""" lines = [f"**{title}**\n<{link}>"]