diff --git a/src/extensions/rss.py b/src/extensions/rss.py index 9ac1308..378f3bc 100644 --- a/src/extensions/rss.py +++ b/src/extensions/rss.py @@ -248,72 +248,28 @@ class FeedCog(commands.Cog): await inter.response.defer() page = 1 + pagesize = 10 try: - rssfeeds, total_results = await self.bot.functions.get_rssfeeds(inter.guild_id, page) + def formatdata(index, item): + key = f"{index}. {item.name}" + value = f"[RSS]({item.url}) · [API](http://localhost:8000/api/rssfeed/{item.uuid}/)" + return key, value + + async def getdata(page): + data, count = await self.bot.functions.get_rssfeeds(inter.guild_id, page, pagesize) + return data, count + + embed = Followup(f"Available RSS Feeds in {inter.guild.name}").info()._embed + pagination = PaginationView(inter, embed, getdata, formatdata, pagesize, 1) + await pagination.send() + except Exception as exc: await ( Followup(exc.__class__.__name__, str(exc)) .error() .send(inter) ) - else: - # description = "\n\n".join( - # f"{item.name}\n{item.url}\n{item.uuid}" - # for item in rssfeeds - # ) - - # fields = { - # f"{i+1}.": f"{item.name}\n{item.url}\n{item.uuid}" - # for i, item in enumerate(rssfeeds) - # } - - def formatdata(item): - return item.name, f"{item.url}\n{item.uuid}" - - async def getdata(page): - data, count = await self.bot.functions.get_rssfeeds(inter.guild_id, page) - return data - - embed = Followup(f"Available RSS Feeds in {inter.guild.name}").info()._embed - maxpage = PaginationView.calc_total_pages(total_results, 10) - pagination = PaginationView(inter, embed, getdata, formatdata, maxpage, 1) - await pagination.send() - - # await ( - # Followup(f"Available RSS Feeds in {inter.guild.name}") - # .info() - # .fields(**fields) - # .footer(f"Page {page}") - # .send(inter) - # ) - - # try: - # sources = await self.bot.functions.get_feeds(inter.guild_id) - # except NoResultFound: - # await ( - # Followup( - # "Feeds Not Found Error", - # "There are no available Feeds for this server.\n" - # "Add a new feed with `/feed add`." - # ) - # .error() - # .send() - # ) - # else: - # description = "\n".join([ - # f"{i}. **[{source.name}]({source.url})**" - # for i, source in enumerate(sources) - # ]) - # await ( - # Followup( - # f"Available Feeds in {inter.guild.name}", - # description - # ) - # .info() - # .send(inter) - # ) - # @feed_group.command(name="fetch") # @rename(max_="max") diff --git a/src/feed.py b/src/feed.py index bf200d9..5af67b8 100644 --- a/src/feed.py +++ b/src/feed.py @@ -299,7 +299,7 @@ class Functions: return RSSFeed.from_dict(data) - async def get_rssfeeds(self, guild_id: int, page: int) -> list[RSSFeed]: + async def get_rssfeeds(self, guild_id: int, page: int, pagesize: int) -> list[RSSFeed]: """Get a list of RSS Feeds. Args: @@ -310,7 +310,11 @@ class Functions: """ async with aiohttp.ClientSession() as session: - data, count = await API(session).get_rssfeed_list(discord_server_id=guild_id, page=page) + data, count = await API(session).get_rssfeed_list( + discord_server_id=guild_id, + page=page, + page_size=pagesize + ) return RSSFeed.from_list(data), count diff --git a/src/utils.py b/src/utils.py index add5dc5..58a2b6c 100644 --- a/src/utils.py +++ b/src/utils.py @@ -56,15 +56,29 @@ class FollowupIcons: class PaginationView(View): + """A Discord UI View that adds pagination to an embed.""" + def __init__( self, inter: Interaction, embed: Embed, getdata: Callable, - formatdata: Callable, maxpage: int, initpage: int=1 + formatdata: Callable, pagesize: int, initpage: int=1 ): + """_summary_ + + Args: + 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]. + formatdata (Callable): A formatter function that determines how the data is displayed. + pagesize (int): The size of each page. + initpage (int, optional): The inital page. Defaults to 1. + """ + self.inter = inter self.embed = embed self.getdata = getdata self.formatdata = formatdata - self.maxpage = maxpage + self.maxpage = None + self.pagesize = pagesize self.index = initpage super().__init__(timeout=100) @@ -94,6 +108,13 @@ class PaginationView(View): log.debug("total pages calculated: %s", result) return result + def calc_dataitem_index(self, dataitem_index: int): + if self.index > 1: + dataitem_index += self.pagesize * (self.index - 1) + + dataitem_index += 1 + return dataitem_index + @button(emoji="◀️", style=ButtonStyle.blurple) async def backward(self, inter: Interaction, button: Button): self.index -= 1 @@ -128,10 +149,12 @@ class PaginationView(View): async def create_paged_embed(self) -> Embed: embed = self.embed.copy() - data = await self.getdata(self.index) + data, total_results = await self.getdata(self.index) + self.maxpage = self.calc_total_pages(total_results, self.pagesize) - for item in data: - key, value = self.formatdata(item) + for i, item in enumerate(data): + i = self.calc_dataitem_index(i) + key, value = self.formatdata(i, item) embed.add_field(name=key, value=value, inline=False) if self.maxpage != 1: