Added a detailed pages paginator
This commit is contained in:
parent
ca7967057d
commit
a61f79004e
|
@ -3,4 +3,4 @@ from .checks import is_owner, custom_perms, db_check
|
||||||
from .config import *
|
from .config import *
|
||||||
from .utilities import *
|
from .utilities import *
|
||||||
from .images import create_banner
|
from .images import create_banner
|
||||||
from .paginator import Pages, CannotPaginate
|
from .paginator import Pages, CannotPaginate, DetailedPages
|
||||||
|
|
|
@ -212,3 +212,64 @@ class Pages:
|
||||||
pass # can't remove it so don't bother doing so
|
pass # can't remove it so don't bother doing so
|
||||||
|
|
||||||
await self.match()
|
await self.match()
|
||||||
|
|
||||||
|
class DetailedPages(Pages):
|
||||||
|
"""A class built on the normal Paginator, except with the idea that you want one 'thing' per page
|
||||||
|
This allows the ability to have more data on a page, more fields, etc. and page through each 'thing'"""
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
kwargs['per_page'] = 1
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
def get_page(self, page):
|
||||||
|
return self.entries[page - 1]
|
||||||
|
|
||||||
|
async def show_page(self, page, *, first=False):
|
||||||
|
self.current_page = page
|
||||||
|
entries = self.get_page(page)
|
||||||
|
|
||||||
|
self.embed.set_footer(text='Page %s/%s (%s entries)' % (page, self.maximum_pages, len(self.entries)))
|
||||||
|
self.embed.clear_fields()
|
||||||
|
self.embed.description = ""
|
||||||
|
|
||||||
|
for key, value in entries.items():
|
||||||
|
if key == 'fields':
|
||||||
|
for f in value:
|
||||||
|
self.embed.add_field(name=f.get('name'), value=f.get('value'), inline=f.get('inline', True))
|
||||||
|
else:
|
||||||
|
setattr(self.embed, key, value)
|
||||||
|
|
||||||
|
if not self.paginating:
|
||||||
|
return await self.message.channel.send(embed=self.embed)
|
||||||
|
|
||||||
|
if not first:
|
||||||
|
try:
|
||||||
|
await self.message.edit(embed=self.embed)
|
||||||
|
except discord.NotFound:
|
||||||
|
self.paginating = False
|
||||||
|
return
|
||||||
|
|
||||||
|
# verify we can actually use the pagination session
|
||||||
|
if not self.permissions.add_reactions:
|
||||||
|
raise CannotPaginate('Bot does not have add reactions permission.')
|
||||||
|
|
||||||
|
if not self.permissions.read_message_history:
|
||||||
|
raise CannotPaginate('Bot does not have Read Message History permission.')
|
||||||
|
|
||||||
|
if self.embed.description:
|
||||||
|
self.embed.description += '\nConfused? React with \N{INFORMATION SOURCE} for more info.'
|
||||||
|
else:
|
||||||
|
self.embed.description = '\nConfused? React with \N{INFORMATION SOURCE} for more info.'
|
||||||
|
|
||||||
|
self.message = await self.message.channel.send(embed=self.embed)
|
||||||
|
for (reaction, _) in self.reaction_emojis:
|
||||||
|
if self.maximum_pages == 2 and reaction in ('\u23ed', '\u23ee'):
|
||||||
|
# no |<< or >>| buttons if we only have two pages
|
||||||
|
# we can't forbid it if someone ends up using it but remove
|
||||||
|
# it from the default set
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
await self.message.add_reaction(reaction)
|
||||||
|
except discord.NotFound:
|
||||||
|
# If the message isn't found, we don't care about clearing anything
|
||||||
|
return
|
||||||
|
|
Loading…
Reference in a new issue