From cb7290be009268b2e87da02da976b7ca1546995c Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Thu, 7 Jun 2018 23:06:25 -0800 Subject: [PATCH 01/14] Fixed number checker --- src/imports/utils.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/imports/utils.py b/src/imports/utils.py index 5387f4c..ace5a33 100644 --- a/src/imports/utils.py +++ b/src/imports/utils.py @@ -380,15 +380,16 @@ class Book: elif str(reaction.emoji) == self._bot.book_emojis['start']: self._current_page = 0 elif str(reaction.emoji) == self._bot.book_emojis['hash']: - m = await self._channel.send(f'Please enter a number between 1 and {self._len_pages}') + m = await self._channel.send(f'Please enter a number in range 1 to {self._len_pages}') + def num_check(message): if self._locked: return message.content.isdigit() \ - and 0 < int(message.content) < self._len_pages \ - and message.author == self._calling_message.author + and 0 < int(message.content) <= self._len_pages \ + and message.author == self._calling_message.author else: return message.content.isdigit() \ - and 0 < int(message.content) < self._len_pages + and 0 < int(message.content) <= self._len_pages try: msg = await self._bot.wait_for('message', timeout=30, check=num_check) From 222159f05912726de800f27efef3d185e857f25b Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Thu, 7 Jun 2018 23:38:44 -0800 Subject: [PATCH 02/14] Added required argument to Paginator instances --- src/exts/admin.py | 2 +- src/exts/repl.py | 4 ++-- src/imports/utils.py | 18 +++++++++++++++++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/exts/admin.py b/src/exts/admin.py index aac4ab0..545ba37 100644 --- a/src/exts/admin.py +++ b/src/exts/admin.py @@ -193,7 +193,7 @@ class Admin: @commands.command() @commands.is_owner() async def view_code(self, ctx, code_name): - pag = utils.Paginator(prefix='```py', suffix='```') + pag = utils.Paginator(self.bot, prefix='```py', suffix='```') pag.add(inspect.getsource(self.bot.get_command(code_name).callback)) for page in pag.pages(): await ctx.send(page) diff --git a/src/exts/repl.py b/src/exts/repl.py index 2ffc116..6c27faf 100644 --- a/src/exts/repl.py +++ b/src/exts/repl.py @@ -141,7 +141,7 @@ class Repl: fmt = '{}'.format(value) try: if fmt is not None: - pag = Paginator() + pag = Paginator(self.bot) pag.add(fmt) for page in pag.pages(): await response.channel.send(page) @@ -157,7 +157,7 @@ class Repl: return try: body = self.cleanup_code(body) - pag = Paginator() + pag = Paginator(self.bot) pag.add(await asyncio.wait_for(self.bot.loop.create_task(run_command(body)), 10)) for page in pag.pages(): await ctx.send(page) diff --git a/src/imports/utils.py b/src/imports/utils.py index ace5a33..58e9cf9 100644 --- a/src/imports/utils.py +++ b/src/imports/utils.py @@ -128,9 +128,16 @@ class Paginator: self._inline_char = inline_char self._embed_title = '' self._embed_description = '' + self._embed_color = None + self._embed_thumbnail = None + self._embed_url = None 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', + color: discord.Colour=None, + thumbnail: str=None, + url: str=None): if len(title) <= self._max_field_name: self._embed_title = title else: @@ -139,6 +146,9 @@ class Paginator: self._embed_description = description else: raise RuntimeError('Provided Description is too long') + self._embed_color = color + self._embed_thumbnail = thumbnail + self._embed_url = url def pages(self) -> typing.List[str]: _pages = list() @@ -244,6 +254,12 @@ class Paginator: description=self._embed_description, color=self._bot.embed_color, ) + if self._embed_thumbnail: + em.set_thumbnail(url=self._embed_thumbnail) + if self._embed_url: + em.url = self._embed_url + if self._embed_color: + em.color = self._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']) From fc655767f7acb40cfcf3c5e261a4dff578da9aed Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Thu, 7 Jun 2018 23:39:12 -0800 Subject: [PATCH 03/14] Modified git pull to use paginated embeds --- src/exts/git.py | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/exts/git.py b/src/exts/git.py index d28806e..f37b0be 100644 --- a/src/exts/git.py +++ b/src/exts/git.py @@ -1,7 +1,7 @@ import discord from discord.ext import commands import logging -from src.imports.utils import Paginator, run_command +from src.imports.utils import Paginator, run_command, Book import asyncio owner_id = 351794468870946827 @@ -29,22 +29,21 @@ class Git: @git.command() @commands.is_owner() async def pull(self, ctx): - pag = Paginator(max_line_length=60, max_lines=30, max_chars=1014) - em = discord.Embed(style='rich', - title=f'Git Pull', - color=embed_color) - em.set_thumbnail(url=f'{ctx.guild.me.avatar_url}') - result = await asyncio.wait_for(self.bot.loop.create_task(run_command('git fetch --all')), 120) + '\n' - result += await asyncio.wait_for(self.bot.loop.create_task(run_command('git reset --hard ' - 'origin/$(git ' - 'rev-parse --symbolic-full-name' - ' --abbrev-ref HEAD)')), 120) + '\n\n' - result += await asyncio.wait_for(self.bot.loop.create_task(run_command('git show --stat | ' - 'sed "s/.*@.*[.].*/ /g"')), 10) - pag.add(result) - for page in pag.pages(): - em.add_field(name='￲', value=f'{page}') - await ctx.send(embed=em) + pag = Paginator(self.bot, max_line_length=60, embed=True) + pag.set_embed_meta(title='Git Pull', + color=self.bot.embed_color, + thumbnail=f'{ctx.guild.me.avatar_url}') + pag.add('\uFFF6' + await asyncio.wait_for(self.bot.loop.create_task(run_command('git fetch --all')), 120)) + pag.add(await asyncio.wait_for(self.bot.loop.create_task(run_command('git reset --hard ' + 'origin/$(git ' + 'rev-parse --symbolic-full-name' + ' --abbrev-ref HEAD)')), 120)) + pag.add('\uFFF7\n\uFFF8') + pag.add(await asyncio.wait_for(self.bot.loop.create_task(run_command('git show --stat | ' + 'sed "s/.*@.*[.].*/ /g"')), 10)) + msg = await ctx.send('Starting Book') + book = Book(pag, (msg, ctx.channel, self.bot, ctx.message)) + await book.create_book() @git.command() @commands.is_owner() From 3d8c3b0d8843d12c909f31ea60f4f7228b999efb Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Thu, 7 Jun 2018 23:48:04 -0800 Subject: [PATCH 04/14] adjusted line length for embed --- src/exts/git.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exts/git.py b/src/exts/git.py index f37b0be..67cd576 100644 --- a/src/exts/git.py +++ b/src/exts/git.py @@ -29,7 +29,7 @@ class Git: @git.command() @commands.is_owner() async def pull(self, ctx): - pag = Paginator(self.bot, max_line_length=60, embed=True) + pag = Paginator(self.bot, max_line_length=44, embed=True) pag.set_embed_meta(title='Git Pull', color=self.bot.embed_color, thumbnail=f'{ctx.guild.me.avatar_url}') From feefff0a2bcfedc0a8c2a2c6693628397ae84611 Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Thu, 7 Jun 2018 23:52:27 -0800 Subject: [PATCH 05/14] Embed will only react to reactions on its own message --- src/imports/utils.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/imports/utils.py b/src/imports/utils.py index 58e9cf9..0699742 100644 --- a/src/imports/utils.py +++ b/src/imports/utils.py @@ -360,9 +360,10 @@ class Book: # noinspection PyShadowingNames def check(reaction, user): 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 and reaction.message == self._message else: - return str(reaction.emoji) in self._bot.book_emojis.values() + return str(reaction.emoji) in self._bot.book_emojis.values() and reaction.message == self._message await self.display_page() From b1574a96d7993faf973d8826d12481a9a0b93a0b Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Thu, 7 Jun 2018 23:56:13 -0800 Subject: [PATCH 06/14] Embed will only react to reactions on its own message --- src/imports/utils.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/imports/utils.py b/src/imports/utils.py index 0699742..6b7af81 100644 --- a/src/imports/utils.py +++ b/src/imports/utils.py @@ -361,9 +361,11 @@ class Book: def check(reaction, user): if self._locked: return str(reaction.emoji) in self._bot.book_emojis.values() \ - and user == self._calling_message.author and reaction.message == self._message + and user == self._calling_message.author \ + and reaction.message.id == self._message.id else: - return str(reaction.emoji) in self._bot.book_emojis.values() and reaction.message == self._message + return str(reaction.emoji) in self._bot.book_emojis.values() \ + and reaction.message.id == self._message.id await self.display_page() From 103f715969b460a9712792b8cad7fc22067171a5 Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Fri, 8 Jun 2018 00:06:28 -0800 Subject: [PATCH 07/14] Converted Google search to paginated embed --- src/exts/utils.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/exts/utils.py b/src/exts/utils.py index bf506bb..031d968 100644 --- a/src/exts/utils.py +++ b/src/exts/utils.py @@ -580,15 +580,17 @@ class Utils: async def google_search(self, ctx, *, search): """WIP Search Google for the given string""" res = self.bot.gcs_service.cse().list(q=search, cx=self.bot.bot_secrets['cx']).execute() - results = res['items'][:4] - em = discord.Embed() - em.title = f'Google Search' - em.description = f'Top 4 results for "{search}"' - em.colour = embed_color + results = res['items'] + pag = utils.Paginator(self.bot, max_line_length=100, embed=True) + pag.set_embed_meta(title='Google Search', description=f'Top results for "{search}"', color=self.bot.embed_color) # TODO Fix layout of Results for result in results: - em.add_field(name=f'{result["title"]}', value=f'{result["snippet"]}\n{result["link"]}') - await ctx.send(embed=em) + pag.add(f'\uFFF6{result["title"]}\n{result["link"]}') + pag.add(f'{result["snippet"]}') + pag.add('\uFFF7\n\uFFF8') + msg = await ctx.send('Starting Book') + book = utils.Book(pag, (msg, ctx.channel, self.bot, ctx.message)) + await book.create_book() @commands.command(hidden=True, name='sheets') async def google_sheets(self, ctx, member: discord.Member): From 71cf7a44a7b1c9b5b218a6c42be04a8e83167ff0 Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Fri, 8 Jun 2018 00:13:33 -0800 Subject: [PATCH 08/14] Converted Google search to paginated embed --- src/exts/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exts/utils.py b/src/exts/utils.py index 031d968..3d4f874 100644 --- a/src/exts/utils.py +++ b/src/exts/utils.py @@ -585,7 +585,7 @@ class Utils: pag.set_embed_meta(title='Google Search', description=f'Top results for "{search}"', color=self.bot.embed_color) # TODO Fix layout of Results for result in results: - pag.add(f'\uFFF6{result["title"]}\n{result["link"]}') + pag.add(f'\uFFF6{result["title"]}|{result["link"]}') pag.add(f'{result["snippet"]}') pag.add('\uFFF7\n\uFFF8') msg = await ctx.send('Starting Book') From f174b0cbfa9e64ade4b705dd9e54753e03d8eebd Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Fri, 8 Jun 2018 00:17:36 -0800 Subject: [PATCH 09/14] Converted Google search to paginated embed --- src/exts/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exts/utils.py b/src/exts/utils.py index 3d4f874..13989d3 100644 --- a/src/exts/utils.py +++ b/src/exts/utils.py @@ -585,7 +585,7 @@ class Utils: pag.set_embed_meta(title='Google Search', description=f'Top results for "{search}"', color=self.bot.embed_color) # TODO Fix layout of Results for result in results: - pag.add(f'\uFFF6{result["title"]}|{result["link"]}') + pag.add(f'\uFFF6{result["title"]} | {result["link"]}', keep_intact=True) pag.add(f'{result["snippet"]}') pag.add('\uFFF7\n\uFFF8') msg = await ctx.send('Starting Book') From 1c022ad2142a4a52df97fb81c8407c0a23861b64 Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Fri, 8 Jun 2018 00:21:24 -0800 Subject: [PATCH 10/14] Don't append empty field --- src/imports/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/imports/utils.py b/src/imports/utils.py index 6b7af81..1d8f5c0 100644 --- a/src/imports/utils.py +++ b/src/imports/utils.py @@ -201,7 +201,8 @@ class Paginator: def close_field(next_name: str=None): nonlocal _field_name, _field_value, _fields _field_value += self._suffix - _fields.append({'name': _field_name, 'value': _field_value, 'inline': _inline}) + if _field_value != self._prefix + self._suffix: + _fields.append({'name': _field_name, 'value': _field_value, 'inline': _inline}) if next_name: open_field(next_name) From 7d901f55f90cbb515536b38de9e11724508a7af4 Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Fri, 8 Jun 2018 00:23:14 -0800 Subject: [PATCH 11/14] Move link to next line in result title --- src/exts/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exts/utils.py b/src/exts/utils.py index 13989d3..a201220 100644 --- a/src/exts/utils.py +++ b/src/exts/utils.py @@ -585,7 +585,7 @@ class Utils: pag.set_embed_meta(title='Google Search', description=f'Top results for "{search}"', color=self.bot.embed_color) # TODO Fix layout of Results for result in results: - pag.add(f'\uFFF6{result["title"]} | {result["link"]}', keep_intact=True) + pag.add(f'\uFFF6{result["title"]}\n{result["link"]}', keep_intact=True) pag.add(f'{result["snippet"]}') pag.add('\uFFF7\n\uFFF8') msg = await ctx.send('Starting Book') From 51ac2ba4746bbbb6b0f52bc401674142d7d84b08 Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Fri, 8 Jun 2018 00:24:07 -0800 Subject: [PATCH 12/14] Don't append empty page --- src/imports/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/imports/utils.py b/src/imports/utils.py index 1d8f5c0..cca6910 100644 --- a/src/imports/utils.py +++ b/src/imports/utils.py @@ -173,7 +173,8 @@ class Paginator: _page += self._suffix _pages.append(_page) else: - _pages.append(_fields) + if _fields: + _pages.append(_fields) open_page() open_page() From f7fab22d81a8a76ee85247d8a4eaccbcbbfdf81c Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Fri, 8 Jun 2018 00:45:08 -0800 Subject: [PATCH 13/14] TODO done --- src/exts/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/exts/utils.py b/src/exts/utils.py index a201220..7ce5c9a 100644 --- a/src/exts/utils.py +++ b/src/exts/utils.py @@ -583,7 +583,6 @@ class Utils: results = res['items'] pag = utils.Paginator(self.bot, max_line_length=100, embed=True) pag.set_embed_meta(title='Google Search', description=f'Top results for "{search}"', color=self.bot.embed_color) - # TODO Fix layout of Results for result in results: pag.add(f'\uFFF6{result["title"]}\n{result["link"]}', keep_intact=True) pag.add(f'{result["snippet"]}') From 4cd62e1e05c062d0d95721548dfd9d7bd632e972 Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Fri, 8 Jun 2018 00:56:23 -0800 Subject: [PATCH 14/14] Fixed db_concon --- src/imports/checks.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/imports/checks.py b/src/imports/checks.py index 8e45bec..292b917 100644 --- a/src/imports/checks.py +++ b/src/imports/checks.py @@ -6,8 +6,8 @@ owner_id = 351794468870946827 async def check_admin_role(bot, ctx, member): - admin_roles = json.loads(await bot.db_concon.fetchval(f"select admin_roles from guild_config where guild_id = $1", - ctx.guild.id)) + admin_roles = json.loads(await bot.db_con.fetchval(f"select admin_roles from guild_config where guild_id = $1", + ctx.guild.id)) for role in admin_roles: if discord.utils.get(ctx.guild.roles, id=admin_roles[role]) in member.roles: return True @@ -15,8 +15,8 @@ async def check_admin_role(bot, ctx, member): async def check_rcon_role(bot, ctx, member): - rcon_admin_roles = json.loads(await bot.db_concon.fetchval("select rcon_admin_roles from guild_config " - "where guild_id = $1", ctx.guild.id)) + rcon_admin_roles = json.loads(await bot.db_con.fetchval("select rcon_admin_roles from guild_config " + "where guild_id = $1", ctx.guild.id)) for role in rcon_admin_roles: if discord.utils.get(ctx.guild.roles, id=rcon_admin_roles[role]) in member.roles: return True @@ -24,8 +24,8 @@ async def check_rcon_role(bot, ctx, member): async def is_admin(bot, ctx): - admin_roles = json.loads(await bot.db_concon.fetchval("select admin_roles from guild_config where guild_id = $1", - ctx.guild.id)) + admin_roles = json.loads(await bot.db_con.fetchval("select admin_roles from guild_config where guild_id = $1", + ctx.guild.id)) for role in admin_roles: if discord.utils.get(ctx.guild.roles, id=admin_roles[role]) in ctx.message.author.roles: return True @@ -39,8 +39,8 @@ async def is_guild_owner(ctx): async def is_rcon_admin(bot, ctx): - rcon_admin_roles = json.loads(await bot.db_concon.fetchval("select rcon_admin_roles from guild_config " - "where guild_id = $1", ctx.guild.id)) + rcon_admin_roles = json.loads(await bot.db_con.fetchval("select rcon_admin_roles from guild_config " + "where guild_id = $1", ctx.guild.id)) for role in rcon_admin_roles: if discord.utils.get(ctx.guild.roles, id=rcon_admin_roles[role]) in ctx.message.author.roles: return True