From a61f79004ec953750f79ec79d7b41efa6224a0c5 Mon Sep 17 00:00:00 2001 From: Phxntxm Date: Fri, 10 Mar 2017 21:05:42 -0600 Subject: [PATCH] Added a detailed pages paginator --- cogs/utils/__init__.py | 2 +- cogs/utils/paginator.py | 61 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/cogs/utils/__init__.py b/cogs/utils/__init__.py index c73fd6c..4200e2b 100644 --- a/cogs/utils/__init__.py +++ b/cogs/utils/__init__.py @@ -3,4 +3,4 @@ from .checks import is_owner, custom_perms, db_check from .config import * from .utilities import * from .images import create_banner -from .paginator import Pages, CannotPaginate +from .paginator import Pages, CannotPaginate, DetailedPages diff --git a/cogs/utils/paginator.py b/cogs/utils/paginator.py index 80b93cc..dc41858 100644 --- a/cogs/utils/paginator.py +++ b/cogs/utils/paginator.py @@ -212,3 +212,64 @@ class Pages: pass # can't remove it so don't bother doing so 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