1
0
Fork 0
mirror of https://github.com/myned/modufur.git synced 2024-12-24 22:27:28 +00:00

Merge branch 'dev'

This commit is contained in:
Dylan Dizon 2018-11-26 20:03:03 -05:00
commit 877ee5fd33
6 changed files with 99 additions and 86 deletions

View file

@ -215,7 +215,7 @@ class MsG:
# #
# except exc.Exists: # except exc.Exists:
# await ctx.send('**Already auto-posting in {}.** Type `stop` to stop.'.format(ctx.channel.mention)) # await ctx.send('**Already auto-posting in {}.** Type `stop` to stop.'.format(ctx.channel.mention))
# await ctx.message.add_reaction('\N{CROSS MARK}') # await u.add_reaction(ctx.message, '\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)\}') @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)\}')
async def tags(self, ctx): async def tags(self, ctx):
@ -245,7 +245,7 @@ class MsG:
c += 1 c += 1
if not c: if not c:
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
# Tag aliases # Tag aliases
@tags.command(name='aliases', aliases=['alias', 'als', 'a'], brief='(tags) Search for tag aliases', description='Return aliases for given tag(s)\n\nExample:\n\{p\}tag alias wolf') @tags.command(name='aliases', aliases=['alias', 'als', 'a'], brief='(tags) Search for tag aliases', description='Return aliases for given tag(s)\n\nExample:\n\{p\}tag alias wolf')
@ -271,13 +271,13 @@ class MsG:
c += 1 c += 1
if not c: if not c:
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
@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\}') @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): async def get(self, ctx):
if not ctx.invoked_subcommand: if not ctx.invoked_subcommand:
await ctx.send('**Use a flag to get items.**\n*Type* `{}help get` *for more info.*'.format(ctx.prefix)) 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}') await u.add_reaction(ctx.message, '\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') @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')
async def _get_info(self, ctx, *args): async def _get_info(self, ctx, *args):
@ -305,7 +305,7 @@ class MsG:
except exc.MissingArgument: except exc.MissingArgument:
await ctx.send('\N{CROSS MARK} **Invalid url**') await ctx.send('\N{CROSS MARK} **Invalid url**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\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') @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')
async def _get_image(self, ctx, *args): async def _get_image(self, ctx, *args):
@ -328,11 +328,11 @@ class MsG:
# await ctx.send(f'**No aliases found for:** `{tag}`') # await ctx.send(f'**No aliases found for:** `{tag}`')
if not c: if not c:
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.MissingArgument: except exc.MissingArgument:
await ctx.send('\N{CROSS MARK} **Invalid url or file**') await ctx.send('\N{CROSS MARK} **Invalid url or file**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\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') @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')
async def _get_pool(self, ctx, *args): async def _get_pool(self, ctx, *args):
@ -358,7 +358,7 @@ class MsG:
pools.append(pool['name']) pools.append(pool['name'])
match = await ctx.send('**Multiple pools found for `{}`.** Type the number of the correct match\n```\n{}```'.format(' '.join(query), '\n'.join(['{} {}'.format(c, elem) for c, elem in enumerate(pools, 1)]))) match = await ctx.send('**Multiple pools found for `{}`.** Type the number of the correct match\n```\n{}```'.format(' '.join(query), '\n'.join(['{} {}'.format(c, elem) for c, elem in enumerate(pools, 1)])))
await ctx.message.add_reaction('\N{OCTAGONAL SIGN}') await u.add_reaction(ctx.message, '\N{OCTAGONAL SIGN}')
done, pending = await asyncio.wait([self.bot.wait_for('reaction_add', check=on_reaction, timeout=60), done, pending = await asyncio.wait([self.bot.wait_for('reaction_add', check=on_reaction, timeout=60),
self.bot.wait_for('reaction_remove', check=on_reaction, timeout=60), self.bot.wait_for('message', check=on_message, timeout=60)], return_when=asyncio.FIRST_COMPLETED) self.bot.wait_for('reaction_remove', check=on_reaction, timeout=60), self.bot.wait_for('message', check=on_message, timeout=60)], return_when=asyncio.FIRST_COMPLETED)
for future in done: for future in done:
@ -417,20 +417,20 @@ class MsG:
await ctx.send('**No probable match for:** `{}`'.format(e)) await ctx.send('**No probable match for:** `{}`'.format(e))
if not c: if not c:
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
elif remove: elif remove:
with suppress(err.NotFound): with suppress(err.NotFound):
await ctx.message.delete() await ctx.message.delete()
except exc.MissingArgument: except exc.MissingArgument:
await ctx.send('\N{CROSS MARK} **Invalid url or file.** Be sure the link directs to an image file') await ctx.send('\N{CROSS MARK} **Invalid url or file.** Be sure the link directs to an image file')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.SizeError as e: except exc.SizeError as e:
await ctx.send(f'`{e}` **too large.** Maximum is 8 MB') await ctx.send(f'`{e}` **too large.** Maximum is 8 MB')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except err.HTTPException: except err.HTTPException:
await ctx.send('\N{CROSS MARK} **The image database returned an unexpected result.** It may be offline') await ctx.send('\N{CROSS MARK} **The image database returned an unexpected result.** It may be offline')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
@cmds.command(name='reversify', aliases=['revify', 'risify', 'rify']) @cmds.command(name='reversify', aliases=['revify', 'risify', 'rify'])
@cmds.cooldown(1, 5, cmds.BucketType.member) @cmds.cooldown(1, 5, cmds.BucketType.member)
@ -500,17 +500,17 @@ class MsG:
n += 1 n += 1
if c <= 0: if c <= 0:
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.NotFound: except exc.NotFound:
await dest.send('**No matches found**') await dest.send('**No matches found**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.BoundsError as e: except exc.BoundsError as e:
await dest.send('`{}` **invalid limit.** Query limited to 30'.format(e)) await dest.send('`{}` **invalid limit.** Query limited to 30'.format(e))
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except err.HTTPException: except err.HTTPException:
await dest.send('\N{CROSS MARK} **The image database returned an unexpected result.** It may be offline') await dest.send('\N{CROSS MARK} **The image database returned an unexpected result.** It may be offline')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
async def _reversify(self): async def _reversify(self):
while self.reversifying: while self.reversifying:
@ -596,7 +596,7 @@ class MsG:
await ctx.send('**Auto-reversifying all images in** {}'.format(ctx.channel.mention)) await ctx.send('**Auto-reversifying all images in** {}'.format(ctx.channel.mention))
else: else:
await ctx.send('**Already auto-reversifying in {}.** Type `stop r(eversifying)` to stop.'.format(ctx.channel.mention)) 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}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
async def _get_pool(self, ctx, *, booru='e621', query=[]): async def _get_pool(self, ctx, *, booru='e621', query=[]):
def on_reaction(reaction, user): def on_reaction(reaction, user):
@ -618,7 +618,7 @@ class MsG:
pools.append(pool['name']) pools.append(pool['name'])
match = await ctx.send('**Multiple pools found for `{}`.** Type the number of the correct match.\n```\n{}```'.format(' '.join(query), '\n'.join(['{} {}'.format(c, elem) for c, elem in enumerate(pools, 1)]))) match = await ctx.send('**Multiple pools found for `{}`.** Type the number of the correct match.\n```\n{}```'.format(' '.join(query), '\n'.join(['{} {}'.format(c, elem) for c, elem in enumerate(pools, 1)])))
await ctx.message.add_reaction('\N{OCTAGONAL SIGN}') await u.add_reaction(ctx.message, '\N{OCTAGONAL SIGN}')
done, pending = await asyncio.wait([self.bot.wait_for('reaction_add', check=on_reaction, timeout=60), done, pending = await asyncio.wait([self.bot.wait_for('reaction_add', check=on_reaction, timeout=60),
self.bot.wait_for('reaction_remove', check=on_reaction, timeout=60), self.bot.wait_for('message', check=on_message, timeout=60)], return_when=asyncio.FIRST_COMPLETED) self.bot.wait_for('reaction_remove', check=on_reaction, timeout=60), self.bot.wait_for('message', check=on_message, timeout=60)], return_when=asyncio.FIRST_COMPLETED)
for future in done: for future in done:
@ -651,7 +651,7 @@ class MsG:
return pool, posts return pool, posts
except exc.Abort as e: except exc.Abort as e:
await e.message.edit(content='\N{NO ENTRY SIGN}') await e.message.delete()
raise exc.Continue raise exc.Continue
# Messy code that checks image limit and tags in blacklists # Messy code that checks image limit and tags in blacklists
@ -774,7 +774,7 @@ class MsG:
for emoji in ('\N{HEAVY BLACK HEART}', '\N{LEFTWARDS BLACK ARROW}', '\N{NUMBER SIGN}\N{COMBINING ENCLOSING KEYCAP}', '\N{BLACK RIGHTWARDS ARROW}'): for emoji in ('\N{HEAVY BLACK HEART}', '\N{LEFTWARDS BLACK ARROW}', '\N{NUMBER SIGN}\N{COMBINING ENCLOSING KEYCAP}', '\N{BLACK RIGHTWARDS ARROW}'):
await paginator.add_reaction(emoji) await paginator.add_reaction(emoji)
await ctx.message.add_reaction('\N{OCTAGONAL SIGN}') await u.add_reaction(ctx.message, '\N{OCTAGONAL SIGN}')
await asyncio.sleep(1) await asyncio.sleep(1)
while not self.bot.is_closed(): while not self.bot.is_closed():
@ -852,16 +852,16 @@ class MsG:
await ctx.send('\N{HOURGLASS}') await ctx.send('\N{HOURGLASS}')
except exc.NotFound: except exc.NotFound:
await ctx.send('**Pool not found**') await ctx.send('**Pool not found**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.Timeout: except exc.Timeout:
await ctx.send('**Request timed out**') await ctx.send('**Request timed out**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.Continue: except exc.Continue:
pass pass
finally: finally:
if hearted: if hearted:
await ctx.message.add_reaction('\N{HOURGLASS WITH FLOWING SAND}') await u.add_reaction(ctx.message, '\N{HOURGLASS WITH FLOWING SAND}')
n = 1 n = 1
for embed in hearted.values(): for embed in hearted.values():
@ -915,7 +915,7 @@ class MsG:
for emoji in ('\N{HEAVY BLACK HEART}', '\N{LEFTWARDS BLACK ARROW}', '\N{NUMBER SIGN}\N{COMBINING ENCLOSING KEYCAP}', '\N{BLACK RIGHTWARDS ARROW}'): for emoji in ('\N{HEAVY BLACK HEART}', '\N{LEFTWARDS BLACK ARROW}', '\N{NUMBER SIGN}\N{COMBINING ENCLOSING KEYCAP}', '\N{BLACK RIGHTWARDS ARROW}'):
await paginator.add_reaction(emoji) await paginator.add_reaction(emoji)
await ctx.message.add_reaction('\N{OCTAGONAL SIGN}') await u.add_reaction(ctx.message, '\N{OCTAGONAL SIGN}')
await asyncio.sleep(1) await asyncio.sleep(1)
while not self.bot.is_closed(): while not self.bot.is_closed():
@ -1005,23 +1005,23 @@ class MsG:
await ctx.send('\N{HOURGLASS}') await ctx.send('\N{HOURGLASS}')
except exc.NotFound as e: except exc.NotFound as e:
await ctx.send('`{}` **not found**'.format(e)) await ctx.send('`{}` **not found**'.format(e))
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.TagBlacklisted as e: except exc.TagBlacklisted as e:
await ctx.send('\N{NO ENTRY SIGN} `{}` **blacklisted**'.format(e)) await ctx.send('\N{NO ENTRY SIGN} `{}` **blacklisted**'.format(e))
await ctx.message.add_reaction('\N{NO ENTRY SIGN}') await u.add_reaction(ctx.message, '\N{NO ENTRY SIGN}')
except exc.TagBoundsError as e: except exc.TagBoundsError as e:
await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e)) await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e))
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.FavoritesNotFound: except exc.FavoritesNotFound:
await ctx.send('**You have no favorite tags**') await ctx.send('**You have no favorite tags**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.Timeout: except exc.Timeout:
await ctx.send('**Request timed out**') await ctx.send('**Request timed out**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
finally: finally:
if hearted: if hearted:
await ctx.message.add_reaction('\N{HOURGLASS WITH FLOWING SAND}') await u.add_reaction(ctx.message, '\N{HOURGLASS WITH FLOWING SAND}')
n = 1 n = 1
for embed in hearted.values(): for embed in hearted.values():
@ -1032,7 +1032,7 @@ class MsG:
# async def e621_paginator_error(self, ctx, error): # async def e621_paginator_error(self, ctx, error):
# if isinstance(error, exc.NSFW): # if isinstance(error, exc.NSFW):
# await ctx.send('\N{NO ENTRY} {} **is not an NSFW channel**'.format(ctx.channel.mention)) # await ctx.send('\N{NO ENTRY} {} **is not an NSFW channel**'.format(ctx.channel.mention))
# await ctx.message.add_reaction('\N{NO ENTRY}') # await u.add_reaction(ctx.message, '\N{NO ENTRY}')
@cmds.command(name='e926page', aliases=['e926p', 'e9p', '9p']) @cmds.command(name='e926page', aliases=['e926p', 'e9p', '9p'])
@cmds.cooldown(1, 5, cmds.BucketType.member) @cmds.cooldown(1, 5, cmds.BucketType.member)
@ -1080,7 +1080,7 @@ class MsG:
for emoji in ('\N{HEAVY BLACK HEART}', '\N{LEFTWARDS BLACK ARROW}', '\N{NUMBER SIGN}\N{COMBINING ENCLOSING KEYCAP}', '\N{BLACK RIGHTWARDS ARROW}'): for emoji in ('\N{HEAVY BLACK HEART}', '\N{LEFTWARDS BLACK ARROW}', '\N{NUMBER SIGN}\N{COMBINING ENCLOSING KEYCAP}', '\N{BLACK RIGHTWARDS ARROW}'):
await paginator.add_reaction(emoji) await paginator.add_reaction(emoji)
await ctx.message.add_reaction('\N{OCTAGONAL SIGN}') await u.add_reaction(ctx.message, '\N{OCTAGONAL SIGN}')
await asyncio.sleep(1) await asyncio.sleep(1)
while not self.bot.is_closed(): while not self.bot.is_closed():
@ -1168,23 +1168,23 @@ class MsG:
await ctx.send('\N{HOURGLASS}') await ctx.send('\N{HOURGLASS}')
except exc.NotFound as e: except exc.NotFound as e:
await ctx.send('`{}` **not found**'.format(e)) await ctx.send('`{}` **not found**'.format(e))
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.TagBlacklisted as e: except exc.TagBlacklisted as e:
await ctx.send('\N{NO ENTRY SIGN} `{}` **blacklisted**'.format(e)) await ctx.send('\N{NO ENTRY SIGN} `{}` **blacklisted**'.format(e))
await ctx.message.add_reaction('\N{NO ENTRY SIGN}') await u.add_reaction(ctx.message, '\N{NO ENTRY SIGN}')
except exc.TagBoundsError as e: except exc.TagBoundsError as e:
await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e)) await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e))
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.FavoritesNotFound: except exc.FavoritesNotFound:
await ctx.send('**You have no favorite tags**') await ctx.send('**You have no favorite tags**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.Timeout: except exc.Timeout:
await ctx.send('**Request timed out**') await ctx.send('**Request timed out**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
finally: finally:
if hearted: if hearted:
await ctx.message.add_reaction('\N{HOURGLASS WITH FLOWING SAND}') await u.add_reaction(ctx.message, '\N{HOURGLASS WITH FLOWING SAND}')
n = 1 n = 1
for embed in hearted.values(): for embed in hearted.values():
@ -1221,28 +1221,28 @@ class MsG:
except exc.TagBlacklisted as e: except exc.TagBlacklisted as e:
await ctx.send('`{}` **blacklisted**'.format(e)) await ctx.send('`{}` **blacklisted**'.format(e))
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.BoundsError as e: except exc.BoundsError as e:
await ctx.send('`{}` **out of bounds.** Images limited to 3.'.format(e)) await ctx.send('`{}` **out of bounds.** Images limited to 3.'.format(e))
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.TagBoundsError as e: except exc.TagBoundsError as e:
await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e)) await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e))
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.NotFound as e: except exc.NotFound as e:
await ctx.send('`{}` **not found**'.format(e)) await ctx.send('`{}` **not found**'.format(e))
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.FavoritesNotFound: except exc.FavoritesNotFound:
await ctx.send('**You have no favorite tags**') await ctx.send('**You have no favorite tags**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.Timeout: except exc.Timeout:
await ctx.send('**Request timed out**') await ctx.send('**Request timed out**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
# @e621.error # @e621.error
# async def e621_error(self, ctx, error): # async def e621_error(self, ctx, error):
# if isinstance(error, exc.NSFW): # if isinstance(error, exc.NSFW):
# await ctx.send('\N{NO ENTRY} {} **is not an NSFW channel**'.format(ctx.channel.mention)) # await ctx.send('\N{NO ENTRY} {} **is not an NSFW channel**'.format(ctx.channel.mention))
# await ctx.message.add_reaction('\N{NO ENTRY}') # await u.add_reaction(ctx.message, '\N{NO ENTRY}')
# Searches for and returns images from e926.net given tags when not blacklisted # Searches for and returns images from e926.net given tags when not blacklisted
@cmds.command(aliases=['e9', '9'], brief='e926 | SFW', description='e926 | SFW\nTag-based search for e926.net\n\nYou can only search 5 tags and 6 images at once for now.\ne9 [tags...] ([# of images])') @cmds.command(aliases=['e9', '9'], brief='e926 | SFW', description='e926 | SFW\nTag-based search for e926.net\n\nYou can only search 5 tags and 6 images at once for now.\ne9 [tags...] ([# of images])')
@ -1273,28 +1273,28 @@ class MsG:
except exc.TagBlacklisted as e: except exc.TagBlacklisted as e:
await ctx.send('`{}` **blacklisted**'.format(e)) await ctx.send('`{}` **blacklisted**'.format(e))
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.BoundsError as e: except exc.BoundsError as e:
await ctx.send('`{}` **out of bounds.** Images limited to 3.'.format(e)) await ctx.send('`{}` **out of bounds.** Images limited to 3.'.format(e))
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.TagBoundsError as e: except exc.TagBoundsError as e:
await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e)) await ctx.send('`{}` **out of bounds.** Tags limited to 5.'.format(e))
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.NotFound as e: except exc.NotFound as e:
await ctx.send('`{}` **not found**'.format(e)) await ctx.send('`{}` **not found**'.format(e))
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.FavoritesNotFound: except exc.FavoritesNotFound:
await ctx.send('**You have no favorite tags**') await ctx.send('**You have no favorite tags**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except exc.Timeout: except exc.Timeout:
await ctx.send('**Request timed out**') await ctx.send('**Request timed out**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
# @cmds.group(aliases=['fave', 'fav', 'f']) # @cmds.group(aliases=['fave', 'fav', 'f'])
# async def favorite(self, ctx): # async def favorite(self, ctx):
# if not ctx.invoked_subcommand: # if not ctx.invoked_subcommand:
# await ctx.send('**Use a flag to manage favorites.**\n*Type* `{}help fav` *for more info.*'.format(ctx.prefix)) # 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}') # await u.add_reaction(ctx.message, '\N{CROSS MARK}')
# #
# @favorite.error # @favorite.error
# async def favorite_error(self, ctx, error): # async def favorite_error(self, ctx, error):
@ -1337,10 +1337,10 @@ class MsG:
# #
# except exc.BoundsError: # except exc.BoundsError:
# await ctx.send('**Favorites list currently limited to:** `5`') # await ctx.send('**Favorites list currently limited to:** `5`')
# await ctx.message.add_reaction('\N{CROSS MARK}') # await u.add_reaction(ctx.message, '\N{CROSS MARK}')
# except exc.TagBlacklisted as e: # except exc.TagBlacklisted as e:
# await ctx.send('\N{NO ENTRY SIGN} `{}` **blacklisted**') # await ctx.send('\N{NO ENTRY SIGN} `{}` **blacklisted**')
# await ctx.message.add_reaction('\N{NO ENTRY SIGN}') # await u.add_reaction(ctx.message, '\N{NO ENTRY SIGN}')
# #
# @_add_favorite.command(name='posts', aliases=['p']) # @_add_favorite.command(name='posts', aliases=['p'])
# async def __add_favorite_posts(self, ctx, *posts): # async def __add_favorite_posts(self, ctx, *posts):
@ -1370,10 +1370,10 @@ class MsG:
# #
# except KeyError: # except KeyError:
# await ctx.send('**You do not have any favorites**') # await ctx.send('**You do not have any favorites**')
# await ctx.message.add_reaction('\N{CROSS MARK}') # await u.add_reaction(ctx.message, '\N{CROSS MARK}')
# except exc.TagError as e: # except exc.TagError as e:
# await ctx.send('`{}` **not in favorites**'.format(e)) # await ctx.send('`{}` **not in favorites**'.format(e))
# await ctx.message.add_reaction('\N{CROSS MARK}') # await u.add_reaction(ctx.message, '\N{CROSS MARK}')
# #
# @_remove_favorite.command(name='posts', aliases=['p']) # @_remove_favorite.command(name='posts', aliases=['p'])
# async def __remove_favorite_posts(self, ctx): # async def __remove_favorite_posts(self, ctx):
@ -1405,7 +1405,7 @@ class MsG:
await ctx.send( await ctx.send(
'**Use a flag to manage blacklists.**\n' '**Use a flag to manage blacklists.**\n'
f'*Type* `{ctx.prefix}help bl` *for more info.*') f'*Type* `{ctx.prefix}help bl` *for more info.*')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
elif not ctx.args: elif not ctx.args:
await ctx.send('\N{CROSS MARK} **Missing arguments**') await ctx.send('\N{CROSS MARK} **Missing arguments**')
@ -1418,7 +1418,7 @@ class MsG:
async def get_blacklist(self, ctx): async def get_blacklist(self, ctx):
if not ctx.invoked_subcommand: if not ctx.invoked_subcommand:
await ctx.send('\N{CROSS MARK} **Invalid blacklist**') await ctx.send('\N{CROSS MARK} **Invalid blacklist**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
@get_blacklist.command( @get_blacklist.command(
name='global', name='global',
@ -1484,7 +1484,7 @@ class MsG:
async def add_tags(self, ctx): async def add_tags(self, ctx):
if not ctx.invoked_subcommand: if not ctx.invoked_subcommand:
await ctx.send('\N{CROSS MARK} **Invalid blacklist**') await ctx.send('\N{CROSS MARK} **Invalid blacklist**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
async def _add(self, tags, lst, alias=False): async def _add(self, tags, lst, alias=False):
if not alias: if not alias:
@ -1587,7 +1587,7 @@ class MsG:
async def remove_tags(self, ctx): async def remove_tags(self, ctx):
if not ctx.invoked_subcommand: if not ctx.invoked_subcommand:
await ctx.send('\N{CROSS MARK} **Invalid blacklist**') await ctx.send('\N{CROSS MARK} **Invalid blacklist**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
def _remove(self, remove, lst): def _remove(self, remove, lst):
removed = set() removed = set()
@ -1685,7 +1685,7 @@ class MsG:
async def clear_blacklist(self, ctx): async def clear_blacklist(self, ctx):
if not ctx.invoked_subcommand: if not ctx.invoked_subcommand:
await ctx.send('\N{CROSS MARK} **Invalid blacklist**') await ctx.send('\N{CROSS MARK} **Invalid blacklist**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
@clear_blacklist.command( @clear_blacklist.command(
name='global', name='global',

View file

@ -83,10 +83,10 @@ class Administration:
except exc.Abort: except exc.Abort:
await ctx.send('**Deletion aborted**') await ctx.send('**Deletion aborted**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except TimeoutError: except TimeoutError:
await ctx.send('**Deletion timed out**') await ctx.send('**Deletion timed out**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\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) @_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)
@cmds.is_owner() @cmds.is_owner()
@ -132,10 +132,10 @@ class Administration:
except exc.Abort: except exc.Abort:
await ctx.send('**Deletion aborted**') await ctx.send('**Deletion aborted**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except TimeoutError: except TimeoutError:
await ctx.send('**Deletion timed out**') await ctx.send('**Deletion timed out**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
@cmds.group(aliases=['task', 'tsk']) @cmds.group(aliases=['task', 'tsk'])
async def tasks(self): async def tasks(self):
@ -195,7 +195,7 @@ class Administration:
except exc.Exists: except exc.Exists:
await ctx.send('**Already auto-deleting in {}.** Type `stop d(eleting)` to stop.'.format(ctx.channel.mention)) 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}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
@cmds.group(aliases=['setting', 'set', 's']) @cmds.group(aliases=['setting', 'set', 's'])
@cmds.has_permissions(administrator=True) @cmds.has_permissions(administrator=True)

View file

@ -25,7 +25,7 @@ class Bot:
@cmds.command(name=',die', aliases=[',d'], brief='Kills the bot', description='BOT OWNER ONLY\nCloses the connection to Discord', hidden=True) @cmds.command(name=',die', aliases=[',d'], brief='Kills the bot', description='BOT OWNER ONLY\nCloses the connection to Discord', hidden=True)
@cmds.is_owner() @cmds.is_owner()
async def die(self, ctx): async def die(self, ctx):
await ctx.message.add_reaction('\N{CRESCENT MOON}') await u.add_reaction(ctx.message, '\N{CRESCENT MOON}')
await self.bot.get_channel(u.config['info_channel']).send('**Shutting down** \N{CRESCENT MOON} . . .') await self.bot.get_channel(u.config['info_channel']).send('**Shutting down** \N{CRESCENT MOON} . . .')
@ -43,7 +43,7 @@ class Bot:
@cmds.command(name=',restart', aliases=[',res', ',r'], hidden=True) @cmds.command(name=',restart', aliases=[',res', ',r'], hidden=True)
@cmds.is_owner() @cmds.is_owner()
async def restart(self, ctx): async def restart(self, ctx):
await ctx.message.add_reaction('\N{SLEEPING SYMBOL}') await u.add_reaction(ctx.message, '\N{SLEEPING SYMBOL}')
print('\n^ ^ ^ ^ ^ ^ ^ ^ ^ ^\nR E S T A R T I N G\n^ ^ ^ ^ ^ ^ ^ ^ ^ ^\n') print('\n^ ^ ^ ^ ^ ^ ^ ^ ^ ^\nR E S T A R T I N G\n^ ^ ^ ^ ^ ^ ^ ^ ^ ^\n')
await self.bot.get_channel(u.config['info_channel']).send('**Restarting** \N{SLEEPING SYMBOL} . . .') await self.bot.get_channel(u.config['info_channel']).send('**Restarting** \N{SLEEPING SYMBOL} . . .')
@ -63,7 +63,7 @@ class Bot:
@cmds.command(name=',invite', aliases=[',inv', ',link'], brief='Invite the bot', description='BOT OWNER ONLY\nInvite the bot to a server (Requires admin)', hidden=True) @cmds.command(name=',invite', aliases=[',inv', ',link'], brief='Invite the bot', description='BOT OWNER ONLY\nInvite the bot to a server (Requires admin)', hidden=True)
@cmds.is_owner() @cmds.is_owner()
async def invite(self, ctx): async def invite(self, ctx):
await ctx.message.add_reaction('\N{ENVELOPE}') await u.add_reaction(ctx.message, '\N{ENVELOPE}')
await ctx.send('https://discordapp.com/oauth2/authorize?&client_id={}&scope=bot&permissions={}'.format(u.config['client_id'], u.config['permissions'])) await ctx.send('https://discordapp.com/oauth2/authorize?&client_id={}&scope=bot&permissions={}'.format(u.config['client_id'], u.config['permissions']))
@ -125,7 +125,7 @@ class Bot:
await ctx.send(f'**Username changed to** `{username}`') await ctx.send(f'**Username changed to** `{username}`')
else: else:
await ctx.send('**Invalid string**') await ctx.send('**Invalid string**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
class Tools: class Tools:
@ -179,7 +179,7 @@ class Tools:
console = await self.generate(ctx) console = await self.generate(ctx)
exception = await self.generate_err(ctx) exception = await self.generate_err(ctx)
await ctx.message.add_reaction('\N{OCTAGONAL SIGN}') await u.add_reaction(ctx.message, '\N{OCTAGONAL SIGN}')
while not self.bot.is_closed(): while not self.bot.is_closed():
try: try:

View file

@ -38,12 +38,12 @@ class Utils:
except KeyError: except KeyError:
await ctx.send('**No last command**') await ctx.send('**No last command**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
# Displays latency # Displays latency
@cmds.command(aliases=['p'], brief='Pong!', description='Returns latency from bot to Discord servers, not to user') @cmds.command(aliases=['p'], brief='Pong!', description='Returns latency from bot to Discord servers, not to user')
async def ping(self, ctx): async def ping(self, ctx):
await ctx.message.add_reaction('\N{TABLE TENNIS PADDLE AND BALL}') await u.add_reaction(ctx.message, '\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`') 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') @cmds.command(aliases=['pre', 'prefixes'], brief='List bot prefixes', description='Shows all used prefixes')
@ -66,11 +66,11 @@ class Utils:
except AttributeError: except AttributeError:
await ctx.send('**Invalid channel**') await ctx.send('**Invalid channel**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
except AttributeError: except AttributeError:
await ctx.send('**Invalid guild**') await ctx.send('**Invalid guild**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
@send.command(name='user', aliases=['u', 'member', 'm']) @send.command(name='user', aliases=['u', 'member', 'm'])
async def send_user(self, ctx, user, *, message): async def send_user(self, ctx, user, *, message):

View file

@ -160,26 +160,28 @@ async def on_error(error, *args, **kwargs):
@bot.event @bot.event
async def on_command_error(ctx, error): async def on_command_error(ctx, error):
with suppress(err.NotFound): with suppress(err.NotFound):
if isinstance(error, errext.CommandOnCooldown): if isinstance(error, err.NotFound):
await ctx.message.add_reaction('\N{HOURGLASS}')
await asyncio.sleep(error.retry_after)
await ctx.message.add_reaction('\N{WHITE HEAVY CHECK MARK}')
elif isinstance(error, err.NotFound):
print('NOT FOUND') print('NOT FOUND')
elif isinstance(error, err.Forbidden): elif isinstance(error, err.Forbidden):
pass pass
elif isinstance(error, errext.CommandInvokeError):
print('INVOCATION ERROR')
elif isinstance(error, errext.CommandOnCooldown):
await u.add_reaction(ctx.message, '\N{HOURGLASS}')
await asyncio.sleep(error.retry_after)
await u.add_reaction(ctx.message, '\N{WHITE HEAVY CHECK MARK}')
elif isinstance(error, errext.MissingRequiredArgument): elif isinstance(error, errext.MissingRequiredArgument):
await ctx.send('**Missing required argument**') await ctx.send('**Missing required argument**')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
elif isinstance(error, errext.BadArgument): elif isinstance(error, errext.BadArgument):
await ctx.send(f'**Invalid argument.** {error}') await ctx.send(f'**Invalid argument.** {error}')
await ctx.message.add_reaction('\N{CROSS MARK}') await u.add_reaction(ctx.message, '\N{CROSS MARK}')
elif isinstance(error, errext.CheckFailure): elif isinstance(error, errext.CheckFailure):
await ctx.send('**Insufficient permissions**') await ctx.send('**Insufficient permissions**')
await ctx.message.add_reaction('\N{NO ENTRY}') await u.add_reaction(ctx.message, '\N{NO ENTRY}')
elif isinstance(error, errext.CommandNotFound): elif isinstance(error, errext.CommandNotFound):
print('INVALID COMMAND : {}'.format(error), file=sys.stderr) print('INVALID COMMAND : {}'.format(error), file=sys.stderr)
await ctx.message.add_reaction('\N{BLACK QUESTION MARK ORNAMENT}') await u.add_reaction(ctx.message, '\N{BLACK QUESTION MARK ORNAMENT}')
else: else:
print('\n! ! ! ! ! ! ! ! ! ! ! !\nC O M M A N D E R R O R : {}\n! ! ! ! ! ! ! ! ! ! ! !\n'.format( print('\n! ! ! ! ! ! ! ! ! ! ! !\nC O M M A N D E R R O R : {}\n! ! ! ! ! ! ! ! ! ! ! !\n'.format(
error), file=sys.stderr) error), file=sys.stderr)
@ -187,7 +189,7 @@ async def on_command_error(ctx, error):
await bot.get_user(u.config['owner_id']).send('**COMMAND ERROR** \N{WARNING SIGN} `{}` from {} in {}\n```\n{}```'.format(ctx.message.content, ctx.author.mention, ctx.channel.mention if isinstance(ctx.channel, d.channel.TextChannel) else 'DMs', error)) await bot.get_user(u.config['owner_id']).send('**COMMAND ERROR** \N{WARNING SIGN} `{}` from {} in {}\n```\n{}```'.format(ctx.message.content, ctx.author.mention, ctx.channel.mention if isinstance(ctx.channel, d.channel.TextChannel) else 'DMs', error))
await bot.get_channel(u.config['info_channel']).send('**COMMAND ERROR** \N{WARNING SIGN} `{}` from {} in {}\n```\n{}```'.format(ctx.message.content, ctx.author.name, ctx.channel.mention if isinstance(ctx.channel, d.channel.TextChannel) else 'DMs', error)) await bot.get_channel(u.config['info_channel']).send('**COMMAND ERROR** \N{WARNING SIGN} `{}` from {} in {}\n```\n{}```'.format(ctx.message.content, ctx.author.name, ctx.channel.mention if isinstance(ctx.channel, d.channel.TextChannel) else 'DMs', error))
await exc.send_error(ctx, error) await exc.send_error(ctx, error)
await ctx.message.add_reaction('\N{WARNING SIGN}') await u.add_reaction(ctx.message, '\N{WARNING SIGN}')
# u.notify('C O M M A N D E R R O R') # u.notify('C O M M A N D E R R O R')
# @bot.event # @bot.event
@ -203,7 +205,7 @@ async def on_command_completion(ctx):
await ctx.message.delete() await ctx.message.delete()
# with suppress(err.Forbidden): # with suppress(err.Forbidden):
# await ctx.message.add_reaction('\N{WHITE HEAVY CHECK MARK}') # await u.add_reaction(ctx.message, '\N{WHITE HEAVY CHECK MARK}')
for command in ('lastcommand', ',restart', ',die'): for command in ('lastcommand', ',restart', ',die'):
if ctx.command.name == command: if ctx.command.name == command:

View file

@ -10,6 +10,7 @@ from pprint import pprint
import aiohttp import aiohttp
import discord as d import discord as d
from discord import errors as err
from misc import exceptions as exc from misc import exceptions as exc
@ -176,3 +177,13 @@ def ci(pos, n):
phat = float(pos) / n phat = float(pos) / n
return (phat + z*z/(2*n) - z * math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n) return (phat + z*z/(2*n) - z * math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n)
async def add_reaction(message, reaction, error=err.NotFound):
sent = False
with suppress(error):
await message.add_reaction(reaction)
sent = True
return sent