From 9cee90149380d1934db1e0ffd59ae7bf6038c766 Mon Sep 17 00:00:00 2001 From: aikaterna <20862007+aikaterna@users.noreply.github.com> Date: Wed, 4 Nov 2020 12:54:37 -0800 Subject: [PATCH] [RSS] Add feed character limit --- rss/rss.py | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/rss/rss.py b/rss/rss.py index 158d0d8..e9724d8 100644 --- a/rss/rss.py +++ b/rss/rss.py @@ -25,7 +25,7 @@ from .tag_type import INTERNAL_TAGS, VALID_IMAGES, TagType log = logging.getLogger("red.aikaterna.rss") -__version__ = "1.2.1" +__version__ = "1.3.0" class RSS(commands.Cog): @@ -678,6 +678,46 @@ class RSS(commands.Cog): rss_feed = feeds[channel.id]["feeds"][feed_name] await self.get_current_feed(channel, feed_name, rss_feed, force=True) + @rss.command(name="limit") + async def _rss_limit(self, ctx, feed_name: str, channel: Optional[discord.TextChannel] = None, character_limit: int = None): + """ + Set a character limit for feed posts. Use 0 for unlimited. + + RSS posts are naturally split at around 2000 characters to fit within the Discord character limit per message. + If you only want the first embed or first message in a post feed to show, use 2000 or less characters for this setting. + + Note that this setting applies the character limit to the entire post, for all template values on the feed together. + For example, if the template is `$title\\n$content\\n$link`, and title + content + link is longer than the limit, the link will not show. + """ + extra_msg = "" + + if character_limit is None: + await ctx.send_help() + return + + if character_limit < 0: + await ctx.send("Character limit cannot be less than zero.") + return + + if character_limit > 20000: + character_limit = 0 + + if 0 < character_limit < 20: + extra_msg = "Character limit has a 20 character minimum.\n" + character_limit = 20 + + channel = channel or ctx.channel + rss_feed = await self.config.channel(channel).feeds.get_raw(feed_name, default=None) + if not rss_feed: + await ctx.send("That feed name doesn't exist in this channel.") + return + + async with self.config.channel(channel).feeds() as feed_data: + feed_data[feed_name]["limit"] = character_limit + + characters = f"approximately {character_limit}" if character_limit > 0 else "an unlimited amount of" + await ctx.send(f"{extra_msg}Character limit for {bold(feed_name)} is now {characters} characters.") + @rss.command(name="list") async def _rss_list(self, ctx, channel: discord.TextChannel = None): """List saved feeds for this channel or a specific channel.""" @@ -803,10 +843,16 @@ class RSS(commands.Cog): for tag in allowed_tags: tag_msg += f"\n\t{await self._title_case(tag)}" + character_limit = rss_feed.get("limit", 0) + if character_limit == 0: + length_msg = "[ ] Feed length is unlimited." + else: + length_msg = f"[X] Feed length is capped at {character_limit} characters." + embed_settings = f"{embed_toggle}\n{embed_color}\n{embed_image}\n{embed_thumbnail}" rss_template = rss_feed["template"].replace("\n", "\\n").replace("\t", "\\t") - msg = f"Template for {bold(feed_name)}:\n\n`{rss_template}`\n\n{box(embed_settings, lang='ini')}\n{box(tag_msg, lang='ini')}" + msg = f"Template for {bold(feed_name)}:\n\n`{rss_template}`\n\n{box(embed_settings, lang='ini')}\n{box(tag_msg, lang='ini')}\n{box(length_msg, lang='ini')}" for page in pagify(msg, delims=["\n"], page_length=1800): await ctx.send(page) @@ -1024,6 +1070,11 @@ class RSS(commands.Cog): red_embed_settings = await self.bot.embed_requested(channel, None) embed_permissions = channel.permissions_for(channel.guild.me).embed_links + rss_limit = rss_feed.get("limit", 0) + if rss_limit > 0: + # rss_limit needs + 8 characters for pagify counting codeblock characters + message = list(pagify(message, delims=["\n", " "], priority=True, page_length=(rss_limit + 8)))[0] + if embed_toggle and red_embed_settings and embed_permissions: await self._get_current_feed_embed(channel, rss_feed, feedparser_plus_obj, message) else: