|
|
|
@ -93,7 +93,9 @@ async def run_command(args):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Paginator:
|
|
|
|
class Paginator:
|
|
|
|
def __init__(self, *,
|
|
|
|
def __init__(self,
|
|
|
|
|
|
|
|
bot: discord.ext.commands.Bot,
|
|
|
|
|
|
|
|
*,
|
|
|
|
max_chars: int=1970,
|
|
|
|
max_chars: int=1970,
|
|
|
|
max_lines: int=20,
|
|
|
|
max_lines: int=20,
|
|
|
|
prefix: str='```md',
|
|
|
|
prefix: str='```md',
|
|
|
|
@ -124,6 +126,7 @@ class Paginator:
|
|
|
|
self._field_name_char = field_name_char
|
|
|
|
self._field_name_char = field_name_char
|
|
|
|
self._embed_title = ''
|
|
|
|
self._embed_title = ''
|
|
|
|
self._embed_description = ''
|
|
|
|
self._embed_description = ''
|
|
|
|
|
|
|
|
self._bot = bot
|
|
|
|
|
|
|
|
|
|
|
|
def set_embed_meta(self, title: str='\uFFF0', description: str='\uFFF0'):
|
|
|
|
def set_embed_meta(self, title: str='\uFFF0', description: str='\uFFF0'):
|
|
|
|
if len(title) <= self._max_field_name:
|
|
|
|
if len(title) <= self._max_field_name:
|
|
|
|
@ -136,7 +139,7 @@ class Paginator:
|
|
|
|
raise RuntimeError('Provided Description is too long')
|
|
|
|
raise RuntimeError('Provided Description is too long')
|
|
|
|
|
|
|
|
|
|
|
|
def pages(self) -> typing.List[str]:
|
|
|
|
def pages(self) -> typing.List[str]:
|
|
|
|
pages = list()
|
|
|
|
_pages = list()
|
|
|
|
_fields = list()
|
|
|
|
_fields = list()
|
|
|
|
_page = ''
|
|
|
|
_page = ''
|
|
|
|
_lines = 0
|
|
|
|
_lines = 0
|
|
|
|
@ -151,7 +154,7 @@ class Paginator:
|
|
|
|
def close_page():
|
|
|
|
def close_page():
|
|
|
|
nonlocal _page, _lines
|
|
|
|
nonlocal _page, _lines
|
|
|
|
_page += self._suffix
|
|
|
|
_page += self._suffix
|
|
|
|
pages.append(_page)
|
|
|
|
_pages.append(_page)
|
|
|
|
open_page()
|
|
|
|
open_page()
|
|
|
|
|
|
|
|
|
|
|
|
open_page()
|
|
|
|
open_page()
|
|
|
|
@ -172,33 +175,60 @@ class Paginator:
|
|
|
|
_page += '\n' + part
|
|
|
|
_page += '\n' + part
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
def open_field(name: str):
|
|
|
|
def open_field(name: str):
|
|
|
|
|
|
|
|
nonlocal _field_value, _field_name
|
|
|
|
_field_name = name
|
|
|
|
_field_name = name
|
|
|
|
_field_value = '\uFFF0'
|
|
|
|
_field_value = self._prefix
|
|
|
|
|
|
|
|
|
|
|
|
def close_field():
|
|
|
|
def close_field(next_name: str=None):
|
|
|
|
pass
|
|
|
|
nonlocal _field_name, _field_value, _fields
|
|
|
|
|
|
|
|
_field_value += self._suffix
|
|
|
|
|
|
|
|
_fields.append({'name': _field_name, 'value': _field_value})
|
|
|
|
|
|
|
|
if next_name:
|
|
|
|
|
|
|
|
open_field(next_name)
|
|
|
|
|
|
|
|
|
|
|
|
for part in [str(p) for p in self._parts]:
|
|
|
|
for part in [str(p) for p in self._parts]:
|
|
|
|
if part == self._page_break:
|
|
|
|
if part == self._page_break:
|
|
|
|
close_page()
|
|
|
|
close_page()
|
|
|
|
elif part == self._field_break:
|
|
|
|
elif part == self._field_break:
|
|
|
|
|
|
|
|
if len(_fields) + 1 < 25:
|
|
|
|
|
|
|
|
close_field(next_name='\uFFF0')
|
|
|
|
|
|
|
|
else:
|
|
|
|
close_field()
|
|
|
|
close_field()
|
|
|
|
|
|
|
|
close_page()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if part.startswith(self._field_name_char):
|
|
|
|
|
|
|
|
if _field_value:
|
|
|
|
|
|
|
|
close_field(part.replace(self._field_name_char, ''))
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
_field_name = part.replace(self._field_name_char, '')
|
|
|
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_field_value += '\n' + part
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
close_field()
|
|
|
|
|
|
|
|
|
|
|
|
close_page()
|
|
|
|
close_page()
|
|
|
|
self._pages = pages
|
|
|
|
self._pages = _pages
|
|
|
|
return pages
|
|
|
|
return _pages
|
|
|
|
|
|
|
|
|
|
|
|
def process_pages(self) -> typing.List[str]:
|
|
|
|
def process_pages(self) -> typing.List[str]:
|
|
|
|
_pages = self._pages or self.pages()
|
|
|
|
_pages = self._pages or self.pages()
|
|
|
|
_len_pages = len(_pages)
|
|
|
|
_len_pages = len(_pages)
|
|
|
|
_len_page_str = len(f'{_len_pages}/{_len_pages}')
|
|
|
|
_len_page_str = len(f'{_len_pages}/{_len_pages}')
|
|
|
|
|
|
|
|
if not self._embed:
|
|
|
|
for i, page in enumerate(_pages):
|
|
|
|
for i, page in enumerate(_pages):
|
|
|
|
if len(page) + _len_page_str <= 2000:
|
|
|
|
if len(page) + _len_page_str <= 2000:
|
|
|
|
_pages[i] = f'{i + 1}/{_len_pages}\n{page}'
|
|
|
|
_pages[i] = f'{i + 1}/{_len_pages}\n{page}'
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
for i, page in enumerate(_pages):
|
|
|
|
|
|
|
|
em = discord.Embed(title=self._embed_title,
|
|
|
|
|
|
|
|
description=self._embed_description,
|
|
|
|
|
|
|
|
color=self._bot.embed_color,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
em.set_footer(text=f'{i + 1}/{_len_pages}')
|
|
|
|
|
|
|
|
for field in page:
|
|
|
|
|
|
|
|
em.add_field(name=field['name'], value=field['value'], inline=field['inline'])
|
|
|
|
|
|
|
|
_pages[i] = em
|
|
|
|
return _pages
|
|
|
|
return _pages
|
|
|
|
|
|
|
|
|
|
|
|
def __len__(self):
|
|
|
|
def __len__(self):
|
|
|
|
@ -293,6 +323,7 @@ class Book:
|
|
|
|
async def create_book(self) -> None:
|
|
|
|
async def create_book(self) -> None:
|
|
|
|
# noinspection PyUnresolvedReferences
|
|
|
|
# noinspection PyUnresolvedReferences
|
|
|
|
async def reaction_checker():
|
|
|
|
async def reaction_checker():
|
|
|
|
|
|
|
|
# noinspection PyShadowingNames
|
|
|
|
def check(reaction, user):
|
|
|
|
def check(reaction, user):
|
|
|
|
if self._locked:
|
|
|
|
if self._locked:
|
|
|
|
return str(reaction.emoji) in self._bot.book_emojis.values() and user == self._calling_message.author
|
|
|
|
return str(reaction.emoji) in self._bot.book_emojis.values() and user == self._calling_message.author
|
|
|
|
|