pagination emoji integration 1/?

This commit is contained in:
Corban-Lee Jones 2024-02-07 01:02:42 +00:00
parent fb432631d3
commit 343767c755
2 changed files with 27 additions and 7 deletions

View File

@ -263,7 +263,7 @@ class FeedCog(commands.Cog):
return data, count return data, count
embed = Followup(f"Available RSS Feeds in {inter.guild.name}").info()._embed 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() await pagination.send()
except Exception as exc: except Exception as exc:

View File

@ -7,6 +7,7 @@ from typing import Callable
from discord import Interaction, Embed, Colour, ButtonStyle, Button from discord import Interaction, Embed, Colour, ButtonStyle, Button
from discord.ui import View, button from discord.ui import View, button
from discord.ext.commands import Bot
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -59,12 +60,13 @@ class PaginationView(View):
"""A Discord UI View that adds pagination to an embed.""" """A Discord UI View that adds pagination to an embed."""
def __init__( 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 formatdata: Callable, pagesize: int, initpage: int=1
): ):
"""_summary_ """_summary_
Args: Args:
bot (commands.Bot) The discord bot
inter (Interaction): Represents a discord command interaction. inter (Interaction): Represents a discord command interaction.
embed (Embed): The base embed to paginate. embed (Embed): The base embed to paginate.
getdata (Callable): A function that provides data, must return Tuple[List[Any], int]. 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. pagesize (int): The size of each page.
initpage (int, optional): The inital page. Defaults to 1. initpage (int, optional): The inital page. Defaults to 1.
""" """
self.bot = bot
self.inter = inter self.inter = inter
self.embed = embed self.embed = embed
self.getdata = getdata self.getdata = getdata
@ -80,6 +83,13 @@ class PaginationView(View):
self.maxpage = None self.maxpage = None
self.pagesize = pagesize self.pagesize = pagesize
self.index = initpage 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) super().__init__(timeout=100)
async def check_user_is_author(self, inter: Interaction) -> bool: async def check_user_is_author(self, inter: Interaction) -> bool:
@ -109,6 +119,13 @@ class PaginationView(View):
return result return result
def calc_dataitem_index(self, dataitem_index: int): 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: if self.index > 1:
dataitem_index += self.pagesize * (self.index - 1) dataitem_index += self.pagesize * (self.index - 1)
@ -157,16 +174,19 @@ class PaginationView(View):
key, value = self.formatdata(i, item) key, value = self.formatdata(i, item)
embed.add_field(name=key, value=value, inline=False) 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}") embed.set_footer(text=f"Page {self.index}/{self.maxpage}")
return embed return embed
def update_buttons(self): def update_buttons(self):
if self.index >= self.maxpage: if self.index >= self.maxpage:
self.children[2].emoji = "⏮️" self.children[2].emoji = self.start_emoji
else: else:
self.children[2].emoji = "⏭️" self.children[2].emoji = self.end_emoji
self.children[0].disabled = self.index == 1 self.children[0].disabled = self.index == 1
self.children[1].disabled = self.index == self.maxpage self.children[1].disabled = self.index == self.maxpage
@ -174,7 +194,7 @@ class PaginationView(View):
async def send(self): async def send(self):
embed = await self.create_paged_embed() embed = await self.create_paged_embed()
if self.maxpage == 1: if self.maxpage <= 1:
await self.inter.edit_original_response(embed=embed) await self.inter.edit_original_response(embed=embed)
return return