From 8c4da80d6ceafb5d4af4d94d4baaffc5d450df1b Mon Sep 17 00:00:00 2001 From: Dylan Dizon Date: Tue, 6 Nov 2018 02:55:08 -0500 Subject: [PATCH 01/12] Remove all delete_after timers, will refactor later --- src/cogs/booru.py | 142 ++++++++++++++++++++--------------------- src/cogs/management.py | 14 ++-- src/cogs/owner.py | 4 +- src/cogs/tools.py | 10 +-- src/run.py | 6 +- 5 files changed, 88 insertions(+), 88 deletions(-) diff --git a/src/cogs/booru.py b/src/cogs/booru.py index e36b3d2..a90019f 100644 --- a/src/cogs/booru.py +++ b/src/cogs/booru.py @@ -181,7 +181,7 @@ class MsG: u.tasks['auto_hrt'].remove(channel.id) u.dump(u.tasks, 'cogs/tasks.pkl') print('STOPPED : auto-hearting in #{}'.format(channel.name)) - await channel.send('**Stopped queueing messages for hearting in** {}'.format(channel.mention), delete_after=5) + await channel.send('**Stopped queueing messages for hearting in** {}'.format(channel.mention)) @cmds.command(name='autoheart', aliases=['autohrt']) @cmds.has_permissions(administrator=True) @@ -192,7 +192,7 @@ class MsG: u.dump(u.tasks, 'cogs/tasks.pkl') self.bot.loop.create_task(self.queue_for_hearts(channel=ctx.channel)) print('STARTED : auto-hearting in #{}'.format(ctx.channel.name)) - await ctx.send('**Auto-hearting all messages in {}**'.format(ctx.channel.mention), delete_after=5) + await ctx.send('**Auto-hearting all messages in {}**'.format(ctx.channel.mention)) else: raise exc.Exists @@ -212,12 +212,12 @@ class MsG: # self.posting = True # # print('STARTED : auto-posting in #{}'.format(ctx.channel.name)) - # await ctx.send('**Auto-posting all images in {}**'.format(ctx.channel.mention), delete_after=5) + # await ctx.send('**Auto-posting all images in {}**'.format(ctx.channel.mention)) # else: # raise exc.Exists # # except exc.Exists: - # await ctx.send('**Already auto-posting in {}.** Type `stop` to stop.'.format(ctx.channel.mention), delete_after=7) + # await ctx.send('**Already auto-posting in {}.** Type `stop` to stop.'.format(ctx.channel.mention)) # await ctx.message.add_reaction('\N{CROSS MARK}') @cmds.group(aliases=['tag', 't'], brief='(G) Get info on tags', description='Group command for obtaining info on tags\n\nUsage:\n\{p\}tag \{flag\} \{tag(s)\}') @@ -242,7 +242,7 @@ class MsG: if related: await dest.send('`{}` **related tags:**\n```\n{}```'.format(tag, formatter.tostring(related))) else: - await ctx.send(f'**No related tags found for:** `{tag}`', delete_after=7) + await ctx.send(f'**No related tags found for:** `{tag}`') related.clear() c += 1 @@ -268,7 +268,7 @@ class MsG: if aliases: await dest.send('`{}` **aliases:**\n```\n{}```'.format(tag, formatter.tostring(aliases))) else: - await ctx.send(f'**No aliases found for:** `{tag}`', delete_after=7) + await ctx.send(f'**No aliases found for:** `{tag}`') aliases.clear() c += 1 @@ -279,7 +279,7 @@ class MsG: @cmds.group(aliases=['g'], brief='(G) Get e621 elements', description='Group command for obtaining various elements like post info\n\nUsage:\n\{p\}get \{flag\} \{args\}') async def get(self, ctx): if not ctx.invoked_subcommand: - await ctx.send('**Use a flag to get items.**\n*Type* `{}help get` *for more info.*'.format(ctx.prefix), delete_after=7) + await ctx.send('**Use a flag to get items.**\n*Type* `{}help get` *for more info.*'.format(ctx.prefix)) await ctx.message.add_reaction('\N{CROSS MARK}') @get.command(name='info', aliases=['i'], brief='(get) Get info from post', description='Return info for given post URL or ID\n\nExample:\n\{p\}get info 1145042') @@ -307,7 +307,7 @@ class MsG: icon_url=self._get_score(post['score'])) except exc.MissingArgument: - await ctx.send('**Invalid url**', delete_after=7) + await ctx.send('**Invalid url**') await ctx.message.add_reaction('\N{CROSS MARK}') @get.command(name='image', aliases=['img'], brief='(get) Get direct image from post', description='Return direct image URL for given post\n\nExample:\n\{p\}get image 1145042') @@ -328,13 +328,13 @@ class MsG: c += 1 # except - # await ctx.send(f'**No aliases found for:** `{tag}`', delete_after=7) + # await ctx.send(f'**No aliases found for:** `{tag}`') if not c: await ctx.message.add_reaction('\N{CROSS MARK}') except exc.MissingArgument: - await ctx.send('**Invalid url or file**', delete_after=7) + await ctx.send('**Invalid url or file**') await ctx.message.add_reaction('\N{CROSS MARK}') @get.command(name='pool', aliases=['p'], brief='(get) Get pool from query', description='Return pool info for given query\n\nExample:\n\{p\}get pool 1145042') @@ -381,7 +381,7 @@ class MsG: await ctx.send(f'**{tempool["name"]}**\nhttps://e621.net/pool/show/{tempool["id"]}') except exc.Abort as e: - await e.message.edit(content='\N{NO ENTRY SIGN}', delete_after=7) + await e.message.edit(content='\N{NO ENTRY SIGN}') # Reverse image searches a linked image using the public iqdb @cmds.command(name='reverse', aliases=['rev', 'ris'], brief='Reverse image search from e621', description='NSFW\nReverse-search an image with given URL') @@ -416,7 +416,7 @@ class MsG: c += 1 except exc.MatchError as e: - await ctx.send('**No probable match for:** `{}`'.format(e), delete_after=7) + await ctx.send('**No probable match for:** `{}`'.format(e)) if remove: with suppress(err.NotFound): @@ -426,10 +426,10 @@ class MsG: await ctx.message.add_reaction('\N{CROSS MARK}') except exc.MissingArgument: - await ctx.send('**Invalid url or file.** Be sure the link directs to an image file', delete_after=7) + await ctx.send('**Invalid url or file.** Be sure the link directs to an image file') await ctx.message.add_reaction('\N{CROSS MARK}') except exc.SizeError as e: - await ctx.send(f'`{e}` **too large.** Maximum is 8 MB', delete_after=7) + await ctx.send(f'`{e}` **too large.** Maximum is 8 MB') await ctx.message.add_reaction('\N{CROSS MARK}') except Exception: await ctx.send('**The image database is offline.** Please try again later') @@ -489,11 +489,11 @@ class MsG: await message.delete() except exc.MatchError as e: - await ctx.send('`{} / {}` **No probable match for:** `{}`'.format(n, len(links), e), delete_after=7) + await ctx.send('`{} / {}` **No probable match for:** `{}`'.format(n, len(links), e)) await message.add_reaction('\N{CROSS MARK}') c -= 1 except exc.SizeError as e: - await ctx.send(f'`{e}` **too large.** Maximum is 8 MB', delete_after=7) + await ctx.send(f'`{e}` **too large.** Maximum is 8 MB') await message.add_reaction('\N{CROSS MARK}') c -= 1 @@ -504,10 +504,10 @@ class MsG: await ctx.message.add_reaction('\N{CROSS MARK}') except exc.NotFound: - await ctx.send('**No matches found**', delete_after=7) + await ctx.send('**No matches found**') await ctx.message.add_reaction('\N{CROSS MARK}') except exc.BoundsError as e: - await ctx.send('`{}` **invalid limit.** Query limited to 30'.format(e), delete_after=7) + await ctx.send('`{}` **invalid limit.** Query limited to 30'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') except Exception: await ctx.send('**The image database is offline.** Please try again later') @@ -548,13 +548,13 @@ class MsG: await message.delete() except exc.MatchError as e: - await message.channel.send('**No probable match for:** `{}`'.format(e), delete_after=7) + await message.channel.send('**No probable match for:** `{}`'.format(e)) await message.add_reaction('\N{CROSS MARK}') except exc.SizeError as e: - await message.channel.send(f'`{e}` **too large.** Maximum is 8 MB', delete_after=7) + await message.channel.send(f'`{e}` **too large.** Maximum is 8 MB') await message.add_reaction('\N{CROSS MARK}') except Exception: - await message.channel.send(f'**An unknown error occurred.**', delete_after=7) + await message.channel.send(f'**An unknown error occurred.**') await message.add_reaction('\N{WARNING SIGN}') print('STOPPED : reversifying') @@ -579,7 +579,7 @@ class MsG: if not u.tasks['auto_rev']: self.reversifying = False print('STOPPED : reversifying #{}'.format(channel.name)) - await channel.send('**Stopped queueing messages for reversification in** {}'.format(channel.mention), delete_after=5) + await channel.send('**Stopped queueing messages for reversification in** {}'.format(channel.mention)) @cmds.command(name='autoreversify', aliases=['autorev']) @cmds.has_permissions(manage_channels=True) @@ -594,9 +594,9 @@ class MsG: self.reversifying = True print('STARTED : auto-reversifying in #{}'.format(ctx.channel.name)) - await ctx.send('**Auto-reversifying all images in** {}'.format(ctx.channel.mention), delete_after=5) + await ctx.send('**Auto-reversifying all images in** {}'.format(ctx.channel.mention)) else: - await ctx.send('**Already auto-reversifying in {}.** Type `stop r(eversifying)` to stop.'.format(ctx.channel.mention), delete_after=7) + await ctx.send('**Already auto-reversifying in {}.** Type `stop r(eversifying)` to stop.'.format(ctx.channel.mention)) await ctx.message.add_reaction('\N{CROSS MARK}') async def _get_pool(self, ctx, *, destination, booru='e621', query=[]): @@ -843,7 +843,7 @@ class MsG: except UnboundLocalError: await dest.send('\N{HOURGLASS}') except exc.NotFound: - await ctx.send('**Pool not found**', delete_after=7) + await ctx.send('**Pool not found**') await ctx.message.add_reaction('\N{CROSS MARK}') except exc.Timeout: await ctx.send('**Request timed out**') @@ -995,16 +995,16 @@ class MsG: except UnboundLocalError: await dest.send('\N{HOURGLASS}') except exc.NotFound as e: - await ctx.send('`{}` **not found**'.format(e), delete_after=7) + await ctx.send('`{}` **not found**'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') except exc.TagBlacklisted as e: - await ctx.send('\N{NO ENTRY SIGN} `{}` **blacklisted**'.format(e), delete_after=7) + await ctx.send('\N{NO ENTRY SIGN} `{}` **blacklisted**'.format(e)) await ctx.message.add_reaction('\N{NO ENTRY SIGN}') except exc.TagBoundsError as e: - await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e), delete_after=7) + await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') except exc.FavoritesNotFound: - await ctx.send('**You have no favorite tags**', delete_after=7) + await ctx.send('**You have no favorite tags**') await ctx.message.add_reaction('\N{CROSS MARK}') except exc.Timeout: await ctx.send('**Request timed out**') @@ -1022,7 +1022,7 @@ class MsG: # @e621_paginator.error # async def e621_paginator_error(self, ctx, error): # if isinstance(error, exc.NSFW): - # await ctx.send('\N{NO ENTRY} {} **is not an NSFW channel**'.format(ctx.channel.mention), delete_after=7) + # await ctx.send('\N{NO ENTRY} {} **is not an NSFW channel**'.format(ctx.channel.mention)) # await ctx.message.add_reaction('\N{NO ENTRY}') @cmds.command(name='e926page', aliases=['e926p', 'e9p', '9p']) @@ -1157,16 +1157,16 @@ class MsG: except UnboundLocalError: await dest.send('\N{HOURGLASS}') except exc.NotFound as e: - await ctx.send('`{}` **not found**'.format(e), delete_after=7) + await ctx.send('`{}` **not found**'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') except exc.TagBlacklisted as e: - await ctx.send('\N{NO ENTRY SIGN} `{}` **blacklisted**'.format(e), delete_after=7) + await ctx.send('\N{NO ENTRY SIGN} `{}` **blacklisted**'.format(e)) await ctx.message.add_reaction('\N{NO ENTRY SIGN}') except exc.TagBoundsError as e: - await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e), delete_after=7) + await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') except exc.FavoritesNotFound: - await ctx.send('**You have no favorite tags**', delete_after=7) + await ctx.send('**You have no favorite tags**') await ctx.message.add_reaction('\N{CROSS MARK}') except exc.Timeout: await ctx.send('**Request timed out**') @@ -1209,19 +1209,19 @@ class MsG: self.bot.loop.create_task(self.queue_for_hearts(message=message, send=embed)) except exc.TagBlacklisted as e: - await ctx.send('`{}` **blacklisted**'.format(e), delete_after=7) + await ctx.send('`{}` **blacklisted**'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') except exc.BoundsError as e: - await ctx.send('`{}` **out of bounds.** Images limited to 3.'.format(e), delete_after=7) + await ctx.send('`{}` **out of bounds.** Images limited to 3.'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') except exc.TagBoundsError as e: - await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e), delete_after=7) + await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') except exc.NotFound as e: - await ctx.send('`{}` **not found**'.format(e), delete_after=7) + await ctx.send('`{}` **not found**'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') except exc.FavoritesNotFound: - await ctx.send('**You have no favorite tags**', delete_after=7) + await ctx.send('**You have no favorite tags**') await ctx.message.add_reaction('\N{CROSS MARK}') except exc.Timeout: await ctx.send('**Request timed out**') @@ -1230,7 +1230,7 @@ class MsG: # @e621.error # async def e621_error(self, ctx, error): # if isinstance(error, exc.NSFW): - # await ctx.send('\N{NO ENTRY} {} **is not an NSFW channel**'.format(ctx.channel.mention), delete_after=7) + # await ctx.send('\N{NO ENTRY} {} **is not an NSFW channel**'.format(ctx.channel.mention)) # await ctx.message.add_reaction('\N{NO ENTRY}') # Searches for and returns images from e926.net given tags when not blacklisted @@ -1260,19 +1260,19 @@ class MsG: self.bot.loop.create_task(self.queue_for_hearts(message=message, send=embed)) except exc.TagBlacklisted as e: - await ctx.send('`{}` **blacklisted**'.format(e), delete_after=7) + await ctx.send('`{}` **blacklisted**'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') except exc.BoundsError as e: - await ctx.send('`{}` **out of bounds.** Images limited to 3.'.format(e), delete_after=7) + await ctx.send('`{}` **out of bounds.** Images limited to 3.'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') except exc.TagBoundsError as e: - await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e), delete_after=7) + await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') except exc.NotFound as e: - await ctx.send('`{}` **not found**'.format(e), delete_after=7) + await ctx.send('`{}` **not found**'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') except exc.FavoritesNotFound: - await ctx.send('**You have no favorite tags**', delete_after=7) + await ctx.send('**You have no favorite tags**') await ctx.message.add_reaction('\N{CROSS MARK}') except exc.Timeout: await ctx.send('**Request timed out**') @@ -1281,7 +1281,7 @@ class MsG: @cmds.group(aliases=['fave', 'fav', 'f']) async def favorite(self, ctx): if not ctx.invoked_subcommand: - await ctx.send('**Use a flag to manage favorites.**\n*Type* `{}help fav` *for more info.*'.format(ctx.prefix), delete_after=7) + await ctx.send('**Use a flag to manage favorites.**\n*Type* `{}help fav` *for more info.*'.format(ctx.prefix)) await ctx.message.add_reaction('\N{CROSS MARK}') @favorite.error @@ -1296,7 +1296,7 @@ class MsG: async def __get_favorite_tags(self, ctx, *args): dest = u.get_kwargs(ctx, args)['destination'] - await dest.send('\N{WHITE MEDIUM STAR} {}**\'s favorite tags:**\n```\n{}```'.format(ctx.author.mention, formatter.tostring(self.favorites.get(ctx.author.id, {}).get('tags', set()))), delete_after=7) + await dest.send('\N{WHITE MEDIUM STAR} {}**\'s favorite tags:**\n```\n{}```'.format(ctx.author.mention, formatter.tostring(self.favorites.get(ctx.author.id, {}).get('tags', set())))) @_get_favorite.command(name='posts', aliases=['p']) async def __get_favorite_posts(self, ctx): @@ -1323,13 +1323,13 @@ class MsG: 'tags', set()).update(tags) u.dump(self.favorites, 'cogs/favorites.pkl') - await dest.send('{} **added to their favorites:**\n```\n{}```'.format(ctx.author.mention, formatter.tostring(tags)), delete_after=5) + await dest.send('{} **added to their favorites:**\n```\n{}```'.format(ctx.author.mention, formatter.tostring(tags))) except exc.BoundsError: - await ctx.send('**Favorites list currently limited to:** `5`', delete_after=7) + await ctx.send('**Favorites list currently limited to:** `5`') await ctx.message.add_reaction('\N{CROSS MARK}') except exc.TagBlacklisted as e: - await ctx.send('\N{NO ENTRY SIGN} `{}` **blacklisted**', delete_after=7) + await ctx.send('\N{NO ENTRY SIGN} `{}` **blacklisted**') await ctx.message.add_reaction('\N{NO ENTRY SIGN}') @_add_favorite.command(name='posts', aliases=['p']) @@ -1356,13 +1356,13 @@ class MsG: u.dump(self.favorites, 'cogs/favorites.pkl') - await dest.send('{} **removed from their favorites:**\n```\n{}```'.format(ctx.author.mention, formatter.tostring(tags)), delete_after=5) + await dest.send('{} **removed from their favorites:**\n```\n{}```'.format(ctx.author.mention, formatter.tostring(tags))) except KeyError: - await ctx.send('**You do not have any favorites**', delete_after=7) + await ctx.send('**You do not have any favorites**') await ctx.message.add_reaction('\N{CROSS MARK}') except exc.TagError as e: - await ctx.send('`{}` **not in favorites**'.format(e), delete_after=7) + await ctx.send('`{}` **not in favorites**'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') @_remove_favorite.command(name='posts', aliases=['p']) @@ -1381,7 +1381,7 @@ class MsG: del self.favorites[ctx.author.id] u.dump(self.favorites, 'cogs/favorites.pkl') - await dest.send('{}**\'s favorites cleared**'.format(ctx.author.mention), delete_after=5) + await dest.send('{}**\'s favorites cleared**'.format(ctx.author.mention)) @_clear_favorite.command(name='posts', aliases=['p']) async def __clear_favorite_posts(self, ctx): @@ -1391,18 +1391,18 @@ class MsG: @cmds.group(aliases=['bl', 'b'], brief='(G) Manage blacklists', description='Manage channel or personal blacklists\n\nUsage:\n{p}bl get {blacklist} to show a blacklist\n{p}bl clear {blacklist} to clear a blacklist\n{p}bl add {blacklist} {tags...} to add tag(s) to a blacklist\n{p}bl remove {blacklist} {tags...} to remove tags from a blacklist') async def blacklist(self, ctx): if not ctx.invoked_subcommand: - await ctx.send('**Use a flag to manage blacklists.**\n*Type* `{}help bl` *for more info.*'.format(ctx.prefix), delete_after=7) + await ctx.send('**Use a flag to manage blacklists.**\n*Type* `{}help bl` *for more info.*'.format(ctx.prefix)) await ctx.message.add_reaction('\N{CROSS MARK}') # @blacklist.error # async def blacklist_error(self, ctx, error): # if isinstance(error, KeyError): - # return await ctx.send('**Blacklist does not exist**', delete_after=7) + # return await ctx.send('**Blacklist does not exist**') @blacklist.group(name='get', aliases=['g'], brief='(G) Get a blacklist\n\nUsage:\n\{p\}bl get \{blacklist\}') async def _get_blacklist(self, ctx): if not ctx.invoked_subcommand: - await ctx.send('**Invalid blacklist**', delete_after=7) + await ctx.send('**Invalid blacklist**') await ctx.message.add_reaction('\N{CROSS MARK}') @_get_blacklist.command(name='global', aliases=['gl', 'g'], brief='Get current global blacklist', description='Get current global blacklist\n\nThis applies to all booru commands, in accordance with Discord\'s ToS agreement\n\nExample:\n\{p\}bl get global') @@ -1424,7 +1424,7 @@ class MsG: async def __get_user_blacklist(self, ctx, *args): dest = u.get_kwargs(ctx, args)['destination'] - await dest.send('\N{NO ENTRY SIGN} {}**\'s blacklist:**\n```\n{}```'.format(ctx.author.mention, formatter.tostring(self.blacklists['user_blacklist'].get(ctx.author.id, set()))), delete_after=7) + await dest.send('\N{NO ENTRY SIGN} {}**\'s blacklist:**\n```\n{}```'.format(ctx.author.mention, formatter.tostring(self.blacklists['user_blacklist'].get(ctx.author.id, set())))) @_get_blacklist.command(name='here', aliases=['h'], brief='Get current global and channel blacklists', description='Get current global and channel blacklists in a single message\n\nExample:\{p\}bl get here') async def __get_here_blacklists(self, ctx, *args): @@ -1461,7 +1461,7 @@ class MsG: @blacklist.group(name='add', aliases=['a'], brief='(G) Add tag(s) to a blacklist\n\nUsage:\n\{p\}bl add \{blacklist\} \{tags...\}') async def _add_tags(self, ctx): if not ctx.invoked_subcommand: - await ctx.send('**Invalid blacklist**', delete_after=7) + await ctx.send('**Invalid blacklist**') await ctx.message.add_reaction('\N{CROSS MARK}') @_add_tags.command(name='global', aliases=['gl', 'g']) @@ -1483,7 +1483,7 @@ class MsG: u.dump(self.blacklists, 'cogs/blacklists.pkl') u.dump(self.aliases, 'cogs/aliases.pkl') - await dest.send('**Added to global blacklist:**\n```\n{}```'.format(formatter.tostring(tags)), delete_after=5) + await dest.send('**Added to global blacklist:**\n```\n{}```'.format(formatter.tostring(tags))) @_add_tags.command(name='channel', aliases=['ch', 'c'], brief='@manage_channel@ Add tag(s) to the current channel blacklist (requires manage_channel)', description='Add tag(s) to the current channel blacklist ') @cmds.has_permissions(manage_channels=True) @@ -1534,7 +1534,7 @@ class MsG: @blacklist.group(name='remove', aliases=['rm', 'r']) async def _remove_tags(self, ctx): if not ctx.invoked_subcommand: - await ctx.send('**Invalid blacklist**', delete_after=7) + await ctx.send('**Invalid blacklist**') await ctx.message.add_reaction('\N{CROSS MARK}') @_remove_tags.command(name='global', aliases=['gl', 'g']) @@ -1553,10 +1553,10 @@ class MsG: u.dump(self.blacklists, 'cogs/blacklists.pkl') - await dest.send('**Removed from global blacklist:**\n```\n{}```'.format(formatter.tostring(tags)), delete_after=5) + await dest.send('**Removed from global blacklist:**\n```\n{}```'.format(formatter.tostring(tags))) except exc.TagError as e: - await ctx.send('`{}` **not in blacklist**'.format(e), delete_after=7) + await ctx.send('`{}` **not in blacklist**'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') @_remove_tags.command(name='channel', aliases=['ch', 'c']) @@ -1579,10 +1579,10 @@ class MsG: u.dump(self.blacklists, 'cogs/blacklists.pkl') - await dest.send('**Removed from** {} **blacklist:**\n```\n{}```'.format(ctx.channel.mention, formatter.tostring(tags), delete_after=5)) + await dest.send('**Removed from** {} **blacklist:**\n```\n{}```'.format(ctx.channel.mention, formatter.tostring(tags))) except exc.TagError as e: - await ctx.send('`{}` **not in blacklist**'.format(e), delete_after=7) + await ctx.send('`{}` **not in blacklist**'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') @_remove_tags.command(name='me', aliases=['m']) @@ -1601,16 +1601,16 @@ class MsG: u.dump(self.blacklists, 'cogs/blacklists.pkl') - await dest.send('{} **removed from their blacklist:**\n```\n{}```'.format(ctx.author.mention, formatter.tostring(tags)), delete_after=5) + await dest.send('{} **removed from their blacklist:**\n```\n{}```'.format(ctx.author.mention, formatter.tostring(tags))) except exc.TagError as e: - await ctx.send('`{}` **not in blacklist**'.format(e), delete_after=7) + await ctx.send('`{}` **not in blacklist**'.format(e)) await ctx.message.add_reaction('\N{CROSS MARK}') @blacklist.group(name='clear', aliases=['cl', 'c']) async def _clear_blacklist(self, ctx): if not ctx.invoked_subcommand: - await ctx.send('**Invalid blacklist**', delete_after=7) + await ctx.send('**Invalid blacklist**') await ctx.message.add_reaction('\N{CROSS MARK}') @_clear_blacklist.command(name='global', aliases=['gl', 'g']) @@ -1621,7 +1621,7 @@ class MsG: self.blacklists['global_blacklist'].clear() u.dump(self.blacklists, 'cogs/blacklists.pkl') - await dest.send('**Global blacklist cleared**', delete_after=5) + await dest.send('**Global blacklist cleared**') @_clear_blacklist.command(name='channel', aliases=['ch', 'c']) @cmds.has_permissions(manage_channels=True) @@ -1635,7 +1635,7 @@ class MsG: del self.blacklists['guild_blacklist'][guild.id][ctx.channel.id] u.dump(self.blacklists, 'cogs/blacklists.pkl') - await dest.send('{} **blacklist cleared**'.format(ctx.channel.mention), delete_after=5) + await dest.send('{} **blacklist cleared**'.format(ctx.channel.mention)) @_clear_blacklist.command(name='me', aliases=['m']) async def __clear_user_blacklist(self, ctx, *args): @@ -1645,4 +1645,4 @@ class MsG: del self.blacklists['user_blacklist'][ctx.author.id] u.dump(self.blacklists, 'cogs/blacklists.pkl') - await dest.send('{}**\'s blacklist cleared**'.format(ctx.author.mention), delete_after=5) + await dest.send('{}**\'s blacklist cleared**'.format(ctx.author.mention)) diff --git a/src/cogs/management.py b/src/cogs/management.py index bc775b5..b020193 100644 --- a/src/cogs/management.py +++ b/src/cogs/management.py @@ -82,10 +82,10 @@ class Administration: await ctx.send(f'\N{WHITE HEAVY CHECK MARK} **Finished deleting** `{c}` **of** {user.mention}**\'s messages**') except exc.Abort: - await ctx.send('**Deletion aborted**', delete_after=7) + await ctx.send('**Deletion aborted**') await ctx.message.add_reaction('\N{CROSS MARK}') except TimeoutError: - await ctx.send('**Deletion timed out**', delete_after=7) + await ctx.send('**Deletion timed out**') await ctx.message.add_reaction('\N{CROSS MARK}') @_prune_user.command(name='all', aliases=['a'], brief='Prune a user\'s messages from the guild', description='about flag centers on message 50 of 101 messages\n\npfg \{user id\} [before|after|about] [\{message id\}]\n\nExample:\npfg \{user id\} before \{message id\}', hidden=True) @@ -131,10 +131,10 @@ class Administration: await ctx.send(f'\N{WHITE HEAVY CHECK MARK} **Finished deleting** `{c}` **of** {user.mention}**\'s messages**') except exc.Abort: - await ctx.send('**Deletion aborted**', delete_after=7) + await ctx.send('**Deletion aborted**') await ctx.message.add_reaction('\N{CROSS MARK}') except TimeoutError: - await ctx.send('**Deletion timed out**', delete_after=7) + await ctx.send('**Deletion timed out**') await ctx.message.add_reaction('\N{CROSS MARK}') @cmds.group(aliases=['task', 'tsk']) @@ -175,7 +175,7 @@ class Administration: if not u.tasks['auto_del']: self.deleting = False print('STOPPED : deleting #{}'.format(channel.name)) - await channel.send('**Stopped queueing messages for deletion in** {}'.format(channel.mention), delete_after=5) + await channel.send('**Stopped queueing messages for deletion in** {}'.format(channel.mention)) @cmds.command(name='autodelete', aliases=['autodel']) @cmds.has_permissions(administrator=True) @@ -189,12 +189,12 @@ class Administration: self.bot.loop.create_task(self.delete()) self.deleting = True print('STARTED : auto-deleting in #{}'.format(ctx.channel.name)) - await ctx.send('**Auto-deleting all messages in {}**'.format(ctx.channel.mention), delete_after=5) + await ctx.send('**Auto-deleting all messages in {}**'.format(ctx.channel.mention)) else: raise exc.Exists except exc.Exists: - await ctx.send('**Already auto-deleting in {}.** Type `stop d(eleting)` to stop.'.format(ctx.channel.mention), delete_after=7) + await ctx.send('**Already auto-deleting in {}.** Type `stop d(eleting)` to stop.'.format(ctx.channel.mention)) await ctx.message.add_reaction('\N{CROSS MARK}') @cmds.group(aliases=['setting', 'set', 's']) diff --git a/src/cogs/owner.py b/src/cogs/owner.py index a385fb8..9821725 100644 --- a/src/cogs/owner.py +++ b/src/cogs/owner.py @@ -65,7 +65,7 @@ class Bot: async def invite(self, ctx): await ctx.message.add_reaction('\N{ENVELOPE}') - await ctx.send('https://discordapp.com/oauth2/authorize?&client_id={}&scope=bot&permissions={}'.format(u.config['client_id'], u.config['permissions']), delete_after=5) + await ctx.send('https://discordapp.com/oauth2/authorize?&client_id={}&scope=bot&permissions={}'.format(u.config['client_id'], u.config['permissions'])) @cmds.command(name=',guilds', aliases=[',glds', ',servers', ',svrs']) @cmds.is_owner() @@ -99,7 +99,7 @@ class Bot: await self.bot.user.edit(username=username) await ctx.send(f'**Username changed to** `{username}`') else: - await ctx.send('**Invalid string**', delete_after=7) + await ctx.send('**Invalid string**') await ctx.message.add_reaction('\N{CROSS MARK}') diff --git a/src/cogs/tools.py b/src/cogs/tools.py index 2aedbe1..df2c64c 100644 --- a/src/cogs/tools.py +++ b/src/cogs/tools.py @@ -32,19 +32,19 @@ class Utils: context = u.last_commands[ctx.author.id] if arg == 'show' or arg == 'sh' or arg == 's': - await ctx.send(f'`{context.prefix}{context.invoked_with} {" ".join(context.args[2:])}`', delete_after=7) + await ctx.send(f'`{context.prefix}{context.invoked_with} {" ".join(context.args[2:])}`') else: await ctx.invoke(context.command, *context.args[2:], **context.kwargs) except KeyError: - await ctx.send('**No last command**', delete_after=7) + await ctx.send('**No last command**') await ctx.message.add_reaction('\N{CROSS MARK}') # Displays latency @cmds.command(aliases=['p'], brief='Pong!', description='Returns latency from bot to Discord servers, not to user') async def ping(self, ctx): await ctx.message.add_reaction('\N{TABLE TENNIS PADDLE AND BALL}') - await ctx.send(ctx.author.mention + ' \N{TABLE TENNIS PADDLE AND BALL} `' + str(round(self.bot.latency * 1000)) + 'ms`', delete_after=5) + await ctx.send(ctx.author.mention + ' \N{TABLE TENNIS PADDLE AND BALL} `' + str(round(self.bot.latency * 1000)) + 'ms`') @cmds.command(aliases=['pre', 'prefixes'], brief='List bot prefixes', description='Shows all used prefixes') async def prefix(self, ctx): @@ -65,11 +65,11 @@ class Utils: await tempchannel.send(message) except AttributeError: - await ctx.send('**Invalid channel**', delete_after=7) + await ctx.send('**Invalid channel**') await ctx.message.add_reaction('\N{CROSS MARK}') except AttributeError: - await ctx.send('**Invalid guild**', delete_after=7) + await ctx.send('**Invalid guild**') await ctx.message.add_reaction('\N{CROSS MARK}') @send.command(name='user', aliases=['u', 'member', 'm']) diff --git a/src/run.py b/src/run.py index 6eddc3d..f020b14 100644 --- a/src/run.py +++ b/src/run.py @@ -162,13 +162,13 @@ async def on_command_error(ctx, error): if isinstance(error, err.NotFound): print('NOT FOUND') elif isinstance(error, errext.MissingRequiredArgument): - await ctx.send('**Missing required argument**', delete_after=7) + await ctx.send('**Missing required argument**') await ctx.message.add_reaction('\N{CROSS MARK}') elif isinstance(error, errext.BadArgument): - await ctx.send(f'**Invalid argument.** {error}', delete_after=7) + await ctx.send(f'**Invalid argument.** {error}') await ctx.message.add_reaction('\N{CROSS MARK}') elif isinstance(error, errext.CheckFailure): - await ctx.send('**Insufficient permissions**', delete_after=7) + await ctx.send('**Insufficient permissions**') await ctx.message.add_reaction('\N{NO ENTRY}') elif isinstance(error, errext.CommandNotFound): print('INVALID COMMAND : {}'.format(error), file=sys.stderr) From 15efdb52414b6c7562437c79dcc11241d7f9353f Mon Sep 17 00:00:00 2001 From: Dylan Dizon Date: Tue, 6 Nov 2018 02:57:59 -0500 Subject: [PATCH 02/12] WIP migration to remove alias dict from blacklisting logic in favor of adding all to a single context-aware blacklist, prompting the user to verify and remove unwanted aliases --- src/cogs/booru.py | 143 ++++++++++++++++++++++++++++++----------- src/misc/exceptions.py | 3 + 2 files changed, 108 insertions(+), 38 deletions(-) diff --git a/src/cogs/booru.py b/src/cogs/booru.py index a90019f..6bc8517 100644 --- a/src/cogs/booru.py +++ b/src/cogs/booru.py @@ -664,7 +664,7 @@ class MsG: # Creates temp blacklist based on context for bl in (self.blacklists['global_blacklist'], self.blacklists['guild_blacklist'].get(guild.id, {}).get(ctx.channel.id, set()), self.blacklists['user_blacklist'].get(ctx.author.id, set())): for tag in bl: - blacklist.update([tag] + list(self.aliases[tag])) + blacklist.add(tag) # Checks for, assigns, and removes first order in tags if possible order = [tag for tag in tags if 'order:' in tag] if order: @@ -1405,6 +1405,19 @@ class MsG: await ctx.send('**Invalid blacklist**') await ctx.message.add_reaction('\N{CROSS MARK}') + @_get_blacklist.command(name='alias', aliases=['aliases']) + async def __get_blacklist_aliases(self, ctx, *args): + guild = ctx.guild if isinstance( + ctx.guild, d.Guild) else ctx.channel + + blacklist = set() + # Creates temp blacklist based on context + for bl in (self.blacklists['global_blacklist'], self.blacklists['guild_blacklist'].get(guild.id, {}).get(ctx.channel.id, set()), self.blacklists['user_blacklist'].get(ctx.author.id, set())): + for tag in bl: + blacklist.update([tag] + list(self.aliases[tag])) + + await ctx.send(f'**Contextual blacklist aliases:**\n```\n{formatter.tostring(blacklist)}```') + @_get_blacklist.command(name='global', aliases=['gl', 'g'], brief='Get current global blacklist', description='Get current global blacklist\n\nThis applies to all booru commands, in accordance with Discord\'s ToS agreement\n\nExample:\n\{p\}bl get global') async def __get_global_blacklist(self, ctx, *args): dest = u.get_kwargs(ctx, args)['destination'] @@ -1464,27 +1477,89 @@ class MsG: await ctx.send('**Invalid blacklist**') await ctx.message.add_reaction('\N{CROSS MARK}') + async def _aliases(self, ctx, tags, blacklist): + def on_reaction(reaction, user): + if user is ctx.author and reaction.message.channel is ctx.message.channel: + if reaction.emoji == '\N{HEAVY MINUS SIGN}': + raise exc.Remove + if reaction.emoji == '\N{THUMBS DOWN SIGN}': + raise exc.Continue + elif reaction.emoji == '\N{THUMBS UP SIGN}': + return True + else: + return False + + def on_message(msg): + if msg.author is ctx.message.author and msg.channel is ctx.message.channel: + if msg.content == '0': + raise exc.Abort + return True + return False + + aliases = set() + + try: + for tag in tags: + aliases.add(tag) + alias_request = await u.fetch('https://e621.net/tag_alias/index.json', params={'aliased_to': tag, 'approved': 'true'}, json=True) + if alias_request: + for dic in alias_request: + aliases.add(dic['name']) + + message = await ctx.send(f'**Also add aliases?**```\n{formatter.tostring(aliases)}```') + await message.add_reaction('\N{THUMBS DOWN SIGN}') + await message.add_reaction('\N{HEAVY MINUS SIGN}') + await message.add_reaction('\N{THUMBS UP SIGN}') + + try: + await self.bot.wait_for('reaction_add', check=on_reaction, timeout=7 * 60) + + except exc.Remove: + await message.edit(content=f'**Also add aliases?**```\n{formatter.tostring(aliases)}```\nType the tag(s) to remove or `0` to abort:') + await message.remove_reaction('\N{HEAVY MINUS SIGN}', self.bot.user) + await message.remove_reaction('\N{HEAVY MINUS SIGN}', ctx.author) + response = await self.bot.wait_for('message', check=on_message, timeout=7 * 60) + + for tag in response.content.split(' '): + if tag in aliases: + aliases.remove(tag) + + await message.edit(content=f'**Also add aliases?**```\n{formatter.tostring(aliases)}```\nConfirm or deny changes') + await self.bot.wait_for('reaction_add', check=on_reaction, timeout=7 * 60) + + blacklist.update(aliases) + + await message.delete() + + return aliases + + except exc.Continue: + await message.delete() + + return tags + except exc.Abort: + await message.delete() + + raise exc.Abort + @_add_tags.command(name='global', aliases=['gl', 'g']) @cmds.is_owner() async def __add_global_tags(self, ctx, *args): kwargs = u.get_kwargs(ctx, args) dest, tags = kwargs['destination'], kwargs['remaining'] - await dest.trigger_typing() + try: + await dest.trigger_typing() - self.blacklists['global_blacklist'].update(tags) - for tag in tags: - alias_request = await u.fetch('https://e621.net/tag_alias/index.json', params={'aliased_to': tag, 'approved': 'true'}, json=True) - if alias_request: - for dic in alias_request: - self.aliases.setdefault(tag, set()).add(dic['name']) - else: - self.aliases.setdefault(tag, set()) - u.dump(self.blacklists, 'cogs/blacklists.pkl') - u.dump(self.aliases, 'cogs/aliases.pkl') + tags = await self._aliases(dest, tags, self.blacklists['global_blacklist']) + + u.dump(self.blacklists, 'cogs/blacklists.pkl') await dest.send('**Added to global blacklist:**\n```\n{}```'.format(formatter.tostring(tags))) + except exc.Abort: + await dest.send('**Aborted**') + @_add_tags.command(name='channel', aliases=['ch', 'c'], brief='@manage_channel@ Add tag(s) to the current channel blacklist (requires manage_channel)', description='Add tag(s) to the current channel blacklist ') @cmds.has_permissions(manage_channels=True) async def __add_channel_tags(self, ctx, *args): @@ -1494,42 +1569,34 @@ class MsG: guild = ctx.guild if isinstance( ctx.guild, d.Guild) else ctx.channel - await dest.trigger_typing() + try: + await dest.trigger_typing() - self.blacklists['guild_blacklist'].setdefault( - guild.id, {}).setdefault(ctx.channel.id, set()).update(tags) - for tag in tags: - alias_request = await u.fetch('https://e621.net/tag_alias/index.json', params={'aliased_to': tag, 'approved': 'true'}, json=True) - if alias_request: - for dic in alias_request: - self.aliases.setdefault(tag, set()).add(dic['name']) - else: - self.aliases.setdefault(tag, set()) - u.dump(self.blacklists, 'cogs/blacklists.pkl') - u.dump(self.aliases, 'cogs/aliases.pkl') + tags = await self._aliases(dest, tags, self.blacklists['guild_blacklist'].setdefault(guild.id, {}).setdefault(ctx.channel.id, set())) - await dest.send('**Added to** {} **blacklist:**\n```\n{}```'.format(ctx.channel.mention, formatter.tostring(tags)), delete_after=5) + u.dump(self.blacklists, 'cogs/blacklists.pkl') + + await dest.send('**Added to** {} **blacklist:**\n```\n{}```'.format(ctx.channel.mention, formatter.tostring(tags))) + + except exc.Abort: + await dest.send('**Aborted**') @_add_tags.command(name='me', aliases=['m']) async def __add_user_tags(self, ctx, *args): kwargs = u.get_kwargs(ctx, args) dest, tags = kwargs['destination'], kwargs['remaining'] - await dest.trigger_typing() + try: + await dest.trigger_typing() - self.blacklists['user_blacklist'].setdefault( - ctx.author.id, set()).update(tags) - for tag in tags: - alias_request = await u.fetch('https://e621.net/tag_alias/index.json', params={'aliased_to': tag, 'approved': 'true'}, json=True) - if alias_request: - for dic in alias_request: - self.aliases.setdefault(tag, set()).add(dic['name']) - else: - self.aliases.setdefault(tag, set()) - u.dump(self.blacklists, 'cogs/blacklists.pkl') - u.dump(self.aliases, 'cogs/aliases.pkl') + tags = await self._aliases(dest, tags, self.blacklists['user_blacklist'].setdefault(ctx.author.id, set())) - await dest.send('{} **added to their blacklist:**\n```\n{}```'.format(ctx.author.mention, formatter.tostring(tags)), delete_after=5) + u.dump(self.blacklists, 'cogs/blacklists.pkl') + + await dest.send('{} **added to their blacklist:**\n```\n{}```'.format(ctx.author.mention, formatter.tostring(tags))) + + except exc.Abort: + await dest.send('**Aborted**') @blacklist.group(name='remove', aliases=['rm', 'r']) async def _remove_tags(self, ctx): diff --git a/src/misc/exceptions.py b/src/misc/exceptions.py index 965ebe9..ac58f01 100644 --- a/src/misc/exceptions.py +++ b/src/misc/exceptions.py @@ -10,6 +10,9 @@ async def send_error(ctx, error): # class NSFW(errext.CheckFailure): # pass +class Remove(Exception): + pass + class SizeError(Exception): pass From 5e4cc8174ed2aa89475110b59a4abbdf454315c0 Mon Sep 17 00:00:00 2001 From: Dylan Dizon Date: Tue, 6 Nov 2018 12:35:37 -0500 Subject: [PATCH 03/12] Update Pipfile hashes --- Pipfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 99d8081..47b65e2 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -67,10 +67,10 @@ }, "cachetools": { "hashes": [ - "sha256:90f1d559512fc073483fe573ef5ceb39bf6ad3d39edc98dc55178a2b2b176fa3", - "sha256:d1c398969c478d336f767ba02040fa22617333293fb0b8968e79b16028dfee35" + "sha256:0a258d82933a1dd18cb540aca4ac5d5690731e24d1239a08577b814998f49785", + "sha256:4621965b0d9d4c82a79a29edbad19946f5e7702df4afae7d1ed2df951559a8cc" ], - "version": "==2.1.0" + "version": "==3.0.0" }, "certifi": { "hashes": [ From 1a014d442580b2b8263394e1d5709ae49a46060d Mon Sep 17 00:00:00 2001 From: Dylan Dizon Date: Tue, 6 Nov 2018 13:23:17 -0500 Subject: [PATCH 04/12] Fix ctx.message deletion logic --- src/cogs/booru.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/cogs/booru.py b/src/cogs/booru.py index 6bc8517..edd7bbc 100644 --- a/src/cogs/booru.py +++ b/src/cogs/booru.py @@ -418,12 +418,11 @@ class MsG: except exc.MatchError as e: await ctx.send('**No probable match for:** `{}`'.format(e)) - if remove: - with suppress(err.NotFound): - await ctx.message.delete() - if not c: await ctx.message.add_reaction('\N{CROSS MARK}') + else: + with suppress(err.NotFound): + await ctx.message.delete() except exc.MissingArgument: await ctx.send('**Invalid url or file.** Be sure the link directs to an image file') From 456c795f756d0ab166fe0c4d03e67f6783a01731 Mon Sep 17 00:00:00 2001 From: Dylan Dizon Date: Tue, 6 Nov 2018 13:23:55 -0500 Subject: [PATCH 05/12] Test exception output for reverse command --- src/cogs/booru.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cogs/booru.py b/src/cogs/booru.py index edd7bbc..094f6d4 100644 --- a/src/cogs/booru.py +++ b/src/cogs/booru.py @@ -430,9 +430,9 @@ class MsG: except exc.SizeError as e: await ctx.send(f'`{e}` **too large.** Maximum is 8 MB') await ctx.message.add_reaction('\N{CROSS MARK}') - except Exception: - await ctx.send('**The image database is offline.** Please try again later') - await ctx.message.add_reaction('\N{CROSS MARK}') + # except Exception: + # await ctx.send('**The image database is offline.** Please try again later') + # await ctx.message.add_reaction('\N{CROSS MARK}') @cmds.command(name='reversify', aliases=['revify', 'risify', 'rify']) async def reversify(self, ctx, *args): From d512a6e879ab3c9017d2351d7061ad7cd23fa7bd Mon Sep 17 00:00:00 2001 From: Dylan Dizon Date: Tue, 6 Nov 2018 13:24:31 -0500 Subject: [PATCH 06/12] Fix exception reference in on_error event --- src/run.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/run.py b/src/run.py index f020b14..af9d20c 100644 --- a/src/run.py +++ b/src/run.py @@ -136,7 +136,7 @@ async def on_message(message): @bot.event async def on_error(error, *args, **kwargs): - print('\n! ! ! ! !\nE R R O R : {}\n! ! ! ! !\n'.format(error), file=sys.stderr) + print('\n! ! ! ! !\nE R R O R : {}\n! ! ! ! !\n'.format(sys.exc_info()[1].text), file=sys.stderr) tb.print_exc() await bot.get_user(u.config['owner_id']).send('**ERROR** \N{WARNING SIGN}\n```\n{}```'.format(error)) await bot.get_channel(u.config['info_channel']).send('**ERROR** \N{WARNING SIGN}\n```\n{}```'.format(error)) @@ -235,8 +235,8 @@ async def test(ctx): if post['tags']: temptags = post['tags'].split(' ') cis = [] - for tag in suggested: - pass + # for tag in suggested: + # pass for tag in temptags: tags.append(f'[{tag}](https://e621.net/post?tags={tag})') # tags = ' '.join(tags) From a9c4a2ecee21d333d1535029be33ac2dfd8003bf Mon Sep 17 00:00:00 2001 From: Dylan Dizon Date: Tue, 6 Nov 2018 13:33:22 -0500 Subject: [PATCH 07/12] Add owner info to guilds command --- src/cogs/owner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cogs/owner.py b/src/cogs/owner.py index 9821725..05120bc 100644 --- a/src/cogs/owner.py +++ b/src/cogs/owner.py @@ -73,7 +73,7 @@ class Bot: paginator = cmds.Paginator() for guild in self.bot.guilds: - paginator.add_line(guild.name) + paginator.add_line(f'{guild.name} - @{guild.owner}') for page in paginator.pages: await ctx.send(f'**Guilds:**\n{page}') From 58b721906b85f0ab670fc9c28f533d7cf45ba845 Mon Sep 17 00:00:00 2001 From: Dylan Dizon Date: Tue, 6 Nov 2018 13:34:02 -0500 Subject: [PATCH 08/12] Update Pipfile to include websockets, Pipfile.lock hashes --- Pipfile | 1 + Pipfile.lock | 29 ++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Pipfile b/Pipfile index 476bb4d..12b1c3f 100644 --- a/Pipfile +++ b/Pipfile @@ -16,5 +16,6 @@ hurry = "*" lxml = "*" pyrasite = "*" requests = "*" +websockets = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index 47b65e2..0797690 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "c6b6bded7d81749dd74473eeb5b42bca29e9c2bff806aa90164523f8678ed5bf" + "sha256": "28a6c84504aba172b55cf50f8aba8eb059351bd393414e3f39e1696a2a86f526" }, "pipfile-spec": 6, "requires": {}, @@ -312,6 +312,33 @@ ], "version": "==1.24.1" }, + "websockets": { + "hashes": [ + "sha256:04b42a1b57096ffa5627d6a78ea1ff7fad3bc2c0331ffc17bc32a4024da7fea0", + "sha256:08e3c3e0535befa4f0c4443824496c03ecc25062debbcf895874f8a0b4c97c9f", + "sha256:10d89d4326045bf5e15e83e9867c85d686b612822e4d8f149cf4840aab5f46e0", + "sha256:232fac8a1978fc1dead4b1c2fa27c7756750fb393eb4ac52f6bc87ba7242b2fa", + "sha256:4bf4c8097440eff22bc78ec76fe2a865a6e658b6977a504679aaf08f02c121da", + "sha256:51642ea3a00772d1e48fb0c492f0d3ae3b6474f34d20eca005a83f8c9c06c561", + "sha256:55d86102282a636e195dad68aaaf85b81d0bef449d7e2ef2ff79ac450bb25d53", + "sha256:564d2675682bd497b59907d2205031acbf7d3fadf8c763b689b9ede20300b215", + "sha256:5d13bf5197a92149dc0badcc2b699267ff65a867029f465accfca8abab95f412", + "sha256:5eda665f6789edb9b57b57a159b9c55482cbe5b046d7db458948370554b16439", + "sha256:5edb2524d4032be4564c65dc4f9d01e79fe8fad5f966e5b552f4e5164fef0885", + "sha256:79691794288bc51e2a3b8de2bc0272ca8355d0b8503077ea57c0716e840ebaef", + "sha256:7fcc8681e9981b9b511cdee7c580d5b005f3bb86b65bde2188e04a29f1d63317", + "sha256:8e447e05ec88b1b408a4c9cde85aa6f4b04f06aa874b9f0b8e8319faf51b1fee", + "sha256:90ea6b3e7787620bb295a4ae050d2811c807d65b1486749414f78cfd6fb61489", + "sha256:9e13239952694b8b831088431d15f771beace10edfcf9ef230cefea14f18508f", + "sha256:d40f081187f7b54d7a99d8a5c782eaa4edc335a057aa54c85059272ed826dc09", + "sha256:e1df1a58ed2468c7b7ce9a2f9752a32ad08eac2bcd56318625c3647c2cd2da6f", + "sha256:e98d0cec437097f09c7834a11c69d79fe6241729b23f656cfc227e93294fc242", + "sha256:f8d59627702d2ff27cb495ca1abdea8bd8d581de425c56e93bff6517134e0a9b", + "sha256:fc30cdf2e949a2225b012a7911d1d031df3d23e99b7eda7dfc982dc4a860dae9" + ], + "index": "pypi", + "version": "==7.0" + }, "yarl": { "hashes": [ "sha256:2556b779125621b311844a072e0ed367e8409a18fa12cbd68eb1258d187820f9", From 04f4af1f0e2e13ca4b9eb724917e76489b0962e5 Mon Sep 17 00:00:00 2001 From: Dylan Dizon Date: Tue, 6 Nov 2018 15:20:31 -0500 Subject: [PATCH 09/12] Add pprint to utils.py for global use --- src/utils/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils/utils.py b/src/utils/utils.py index 88c595f..6870bbf 100644 --- a/src/utils/utils.py +++ b/src/utils/utils.py @@ -6,6 +6,7 @@ import subprocess from contextlib import suppress from fractions import gcd import math +from pprint import pprint import aiohttp import discord as d From a93cd158fa73767f15a45f0c4bb4ce51b46cb578 Mon Sep 17 00:00:00 2001 From: Dylan Dizon Date: Tue, 6 Nov 2018 15:21:31 -0500 Subject: [PATCH 10/12] Add suppressing of permissions exception for cmd_completion reactions --- src/run.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/run.py b/src/run.py index af9d20c..27bc182 100644 --- a/src/run.py +++ b/src/run.py @@ -195,7 +195,8 @@ async def on_command_completion(ctx): if ctx.guild.id in u.settings['del_ctx'] and ctx.me.permissions_in(ctx.channel).manage_messages and isinstance(ctx.message.channel, d.TextChannel): await ctx.message.delete() - await ctx.message.add_reaction('\N{WHITE HEAVY CHECK MARK}') + with suppress(err.Forbidden): + await ctx.message.add_reaction('\N{WHITE HEAVY CHECK MARK}') for command in ('lastcommand', ',restart', ',die'): if ctx.command.name == command: From 41a4fb90558119ec0294c8a4176fe1bd9e60160e Mon Sep 17 00:00:00 2001 From: Dylan Dizon Date: Tue, 6 Nov 2018 15:22:02 -0500 Subject: [PATCH 11/12] Add formatting switches for different use cases --- src/utils/formatter.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/utils/formatter.py b/src/utils/formatter.py index 87f3f74..d6fe811 100644 --- a/src/utils/formatter.py +++ b/src/utils/formatter.py @@ -1,8 +1,8 @@ -def tostring(i, *, order=None): +def tostring(i, *, order=None, newline=False): o = '' if i: for v in i: - o += v + ' ' + o += v + (' ' if newline is False else '\n') o = o[:-1] elif order: o += order @@ -20,11 +20,17 @@ def tostring_commas(i): return '' -def dict_tostring(i): +def dict_tostring(i, f=True): o = '' - if i: - for k, v in i.items(): - o += '**' + k + ':** `' + tostring(v) + '`\n' + + if f: + if i: + for k, v in i.items(): + o += '**' + k + ':** `' + tostring(v) + '`\n' + else: + if i: + for k, v in i.items(): + o += k + ': ```' + tostring(v, newline=True) + '```\n' return o From a65716f77a4bbf13dba0517f766468bd638e98db Mon Sep 17 00:00:00 2001 From: Dylan Dizon Date: Tue, 6 Nov 2018 15:22:44 -0500 Subject: [PATCH 12/12] Add permissions command to list contextual permissions --- src/cogs/owner.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/cogs/owner.py b/src/cogs/owner.py index 05120bc..af6a3c2 100644 --- a/src/cogs/owner.py +++ b/src/cogs/owner.py @@ -14,6 +14,7 @@ from discord.ext import commands as cmds from misc import exceptions as exc from misc import checks from utils import utils as u +from utils import formatter class Bot: @@ -78,6 +79,31 @@ class Bot: for page in paginator.pages: await ctx.send(f'**Guilds:**\n{page}') + @cmds.command(name=',permissions', aliases=[',permission', ',perms', ',perm']) + @cmds.is_owner() + async def permissions(self, ctx, *args: d.Member): + members = list(args) + permissions = {} + + if not members: + members.append(ctx.guild.me) + + for member in members: + permissions[member.mention] = [] + + for k, v in dict(ctx.channel.permissions_for(member)).items(): + if v: + permissions[member.mention].append(k) + + await ctx.send(f'**Permissions:**\n\n{formatter.dict_tostring(permissions, f=False)}') + + @cmds.command(name=',tasks', aliases=[',task']) + @cmds.is_owner() + async def tasks(self, ctx): + tasks = [task for task in asyncio.Task.all_tasks() if not task.done()] + + await ctx.send(f'**Tasks active:** `{int((len(tasks) - 6) / 3)}`') + @cmds.command(name=',status', aliases=[',presence', ',game'], hidden=True) @cmds.is_owner() async def change_status(self, ctx, *, game=None):