diff --git a/src/extensions/rss.py b/src/extensions/rss.py index 0ce51a8..030c87a 100644 --- a/src/extensions/rss.py +++ b/src/extensions/rss.py @@ -263,7 +263,7 @@ class FeedCog(commands.Cog): return data, count embed = Followup(f"Available RSS Feeds in {inter.guild.name}").info()._embed - pagination = PaginationView(inter, embed, getdata, formatdata, pagesize, 1) + pagination = PaginationView(self.bot, inter, embed, getdata, formatdata, pagesize, 1) await pagination.send() except Exception as exc: diff --git a/src/utils.py b/src/utils.py index 58a2b6c..b0b5169 100644 --- a/src/utils.py +++ b/src/utils.py @@ -7,6 +7,7 @@ from typing import Callable from discord import Interaction, Embed, Colour, ButtonStyle, Button from discord.ui import View, button +from discord.ext.commands import Bot log = logging.getLogger(__name__) @@ -59,12 +60,13 @@ class PaginationView(View): """A Discord UI View that adds pagination to an embed.""" def __init__( - self, inter: Interaction, embed: Embed, getdata: Callable, + self, bot: Bot, inter: Interaction, embed: Embed, getdata: Callable, formatdata: Callable, pagesize: int, initpage: int=1 ): """_summary_ Args: + bot (commands.Bot) The discord bot inter (Interaction): Represents a discord command interaction. embed (Embed): The base embed to paginate. getdata (Callable): A function that provides data, must return Tuple[List[Any], int]. @@ -72,7 +74,8 @@ class PaginationView(View): pagesize (int): The size of each page. initpage (int, optional): The inital page. Defaults to 1. """ - + + self.bot = bot self.inter = inter self.embed = embed self.getdata = getdata @@ -80,6 +83,13 @@ class PaginationView(View): self.maxpage = None self.pagesize = pagesize self.index = initpage + + # emoji reference + next_emoji = bot.get_emoji(1204542366602502265) + prev_emoji = bot.get_emoji(1204542365432422470) + self.start_emoji = bot.get_emoji(1204542364073463818) + self.end_emoji = bot.get_emoji(1204542367752003624) + super().__init__(timeout=100) async def check_user_is_author(self, inter: Interaction) -> bool: @@ -109,6 +119,13 @@ class PaginationView(View): return result def calc_dataitem_index(self, dataitem_index: int): + """Calculates a given index to be relative to the sum of all pages items + + Example: dataitem_index = 6 + pagesize = 10 + if page == 1 then return 6 + else return 6 + 10 * (page - 1)""" + if self.index > 1: dataitem_index += self.pagesize * (self.index - 1) @@ -157,16 +174,19 @@ class PaginationView(View): key, value = self.formatdata(i, item) embed.add_field(name=key, value=value, inline=False) - if self.maxpage != 1: + if not total_results: + embed.description = "There are no results" + + if self.maxpage > 1: embed.set_footer(text=f"Page {self.index}/{self.maxpage}") return embed def update_buttons(self): if self.index >= self.maxpage: - self.children[2].emoji = "⏮️" + self.children[2].emoji = self.start_emoji else: - self.children[2].emoji = "⏭️" + self.children[2].emoji = self.end_emoji self.children[0].disabled = self.index == 1 self.children[1].disabled = self.index == self.maxpage @@ -174,7 +194,7 @@ class PaginationView(View): async def send(self): embed = await self.create_paged_embed() - if self.maxpage == 1: + if self.maxpage <= 1: await self.inter.edit_original_response(embed=embed) return