Improved pagination view
Removed double API call added pagesize to API call added calc_dataitem_index method for properly calculating the index of each data item, given the current page.
This commit is contained in:
parent
f2e10e6584
commit
8c35f42a0e
@ -248,72 +248,28 @@ class FeedCog(commands.Cog):
|
|||||||
await inter.response.defer()
|
await inter.response.defer()
|
||||||
|
|
||||||
page = 1
|
page = 1
|
||||||
|
pagesize = 10
|
||||||
|
|
||||||
try:
|
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:
|
except Exception as exc:
|
||||||
await (
|
await (
|
||||||
Followup(exc.__class__.__name__, str(exc))
|
Followup(exc.__class__.__name__, str(exc))
|
||||||
.error()
|
.error()
|
||||||
.send(inter)
|
.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")
|
# @feed_group.command(name="fetch")
|
||||||
# @rename(max_="max")
|
# @rename(max_="max")
|
||||||
|
@ -299,7 +299,7 @@ class Functions:
|
|||||||
|
|
||||||
return RSSFeed.from_dict(data)
|
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.
|
"""Get a list of RSS Feeds.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -310,7 +310,11 @@ class Functions:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
async with aiohttp.ClientSession() as session:
|
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
|
return RSSFeed.from_list(data), count
|
||||||
|
|
||||||
|
33
src/utils.py
33
src/utils.py
@ -56,15 +56,29 @@ class FollowupIcons:
|
|||||||
|
|
||||||
|
|
||||||
class PaginationView(View):
|
class PaginationView(View):
|
||||||
|
"""A Discord UI View that adds pagination to an embed."""
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, inter: Interaction, embed: Embed, getdata: Callable,
|
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.inter = inter
|
||||||
self.embed = embed
|
self.embed = embed
|
||||||
self.getdata = getdata
|
self.getdata = getdata
|
||||||
self.formatdata = formatdata
|
self.formatdata = formatdata
|
||||||
self.maxpage = maxpage
|
self.maxpage = None
|
||||||
|
self.pagesize = pagesize
|
||||||
self.index = initpage
|
self.index = initpage
|
||||||
super().__init__(timeout=100)
|
super().__init__(timeout=100)
|
||||||
|
|
||||||
@ -94,6 +108,13 @@ class PaginationView(View):
|
|||||||
log.debug("total pages calculated: %s", result)
|
log.debug("total pages calculated: %s", result)
|
||||||
return 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)
|
@button(emoji="◀️", style=ButtonStyle.blurple)
|
||||||
async def backward(self, inter: Interaction, button: Button):
|
async def backward(self, inter: Interaction, button: Button):
|
||||||
self.index -= 1
|
self.index -= 1
|
||||||
@ -128,10 +149,12 @@ class PaginationView(View):
|
|||||||
|
|
||||||
async def create_paged_embed(self) -> Embed:
|
async def create_paged_embed(self) -> Embed:
|
||||||
embed = self.embed.copy()
|
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:
|
for i, item in enumerate(data):
|
||||||
key, value = self.formatdata(item)
|
i = self.calc_dataitem_index(i)
|
||||||
|
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 self.maxpage != 1:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user