1
0
Fork 0
mirror of https://github.com/myned/modufur.git synced 2024-11-01 21:02:38 +00:00

Merge branch 'dev'

This commit is contained in:
Myned 2017-11-20 06:11:40 -05:00
commit 31fff4ebd1
6 changed files with 77 additions and 61 deletions

View file

@ -139,7 +139,6 @@ class MsG:
# Tag search
@tags.command(name='related', aliases=['relate', 'rel'], brief='e621 - Search for related tags', description='Return related tags for given tag(s)', usage='[related|relate|rel]')
@checks.del_ctx()
async def _tags_related(self, ctx, *args):
kwargs = u.get_kwargs(ctx, args)
dest, tags = kwargs['destination'], kwargs['remaining']
@ -170,7 +169,6 @@ class MsG:
# Tag aliases
@tags.command(name='aliases', aliases=['alias', 'als'], brief='e621 - Search for tag aliases', description='Return aliases for given tag(s)', usage='[aliases|alias|als]')
@checks.del_ctx()
async def _tags_aliases(self, ctx, *args):
kwargs = u.get_kwargs(ctx, args)
dest, tags = kwargs['destination'], kwargs['remaining']
@ -206,7 +204,6 @@ class MsG:
await ctx.message.add_reaction('\N{CROSS MARK}')
@get.command(name='info', aliases=['i'], brief='e621 - Get info from post', description='Return info for given post', usage='[info|i]')
@checks.del_ctx()
async def _get_info(self, ctx, *args):
try:
kwargs = u.get_kwargs(ctx, args)
@ -241,7 +238,6 @@ class MsG:
await ctx.message.add_reaction('\N{CROSS MARK}')
@get.command(name='image', aliases=['img'], brief='e621 - Get image link', description='Return image for given post', usage='[image|img]')
@checks.del_ctx()
async def _get_image(self, ctx, *args):
try:
kwargs = u.get_kwargs(ctx, args)
@ -273,7 +269,6 @@ class MsG:
await ctx.message.add_reaction('\N{CROSS MARK}')
@get.command(name='pool', aliases=['p'], brief='e621 - Get pool link', description='Return pool info for given query', usage='[pool|p]')
@checks.del_ctx()
async def _get_pool(self, ctx, *args):
def on_reaction(reaction, user):
if reaction.emoji == '\N{OCTAGONAL SIGN}' and reaction.message.id == ctx.message.id and user is ctx.author:
@ -319,7 +314,6 @@ class MsG:
# Reverse image searches a linked image using the public iqdb
@commands.command(name='reverse', aliases=['rev', 'ris'], brief='e621 Reverse image search', description='e621 | NSFW\nReverse-search an image with given URL')
@checks.del_ctx()
async def reverse(self, ctx, *args):
try:
kwargs = u.get_kwargs(ctx, args)
@ -364,7 +358,6 @@ class MsG:
await ctx.message.add_reaction('\N{CROSS MARK}')
@commands.command(name='reversify', aliases=['revify', 'risify', 'rify'])
@checks.del_ctx()
async def reversify(self, ctx, *args):
try:
kwargs = u.get_kwargs(ctx, args, limit=self.HISTORY_LIMIT / 5)
@ -649,7 +642,6 @@ class MsG:
# Creates reaction-based paginator for linked pools
@commands.command(name='poolpage', aliases=['poolp', 'pp', 'e621pp', 'e6pp', '6pp'], brief='e621 pool paginator', description='e621 | NSFW\nShow pools in a page format')
@checks.del_ctx()
async def pool_paginator(self, ctx, *args):
def on_reaction(reaction, user):
if reaction.emoji == '\N{OCTAGONAL SIGN}' and reaction.message.id == ctx.message.id and (user is ctx.author or user.permissions_in(reaction.message.channel).manage_messages):
@ -781,7 +773,6 @@ class MsG:
await ctx.author.send('`{} / {}`'.format(hearted.index(embed) + 1, len(hearted)), embed=embed)
@commands.command(name='e621page', aliases=['e621p', 'e6p', '6p'])
@checks.del_ctx()
@checks.is_nsfw()
async def e621_paginator(self, ctx, *args):
def on_reaction(reaction, user):
@ -942,7 +933,6 @@ class MsG:
# await ctx.message.add_reaction('\N{NO ENTRY}')
@commands.command(name='e926page', aliases=['e926p', 'e9p', '9p'])
@checks.del_ctx()
async def e926_paginator(self, ctx, *args):
def on_reaction(reaction, user):
if reaction.emoji == '\N{OCTAGONAL SIGN}' and reaction.message.id == ctx.message.id and (user is ctx.author or user.permissions_in(reaction.message.channel).manage_messages):
@ -1097,7 +1087,6 @@ class MsG:
# Searches for and returns images from e621.net given tags when not blacklisted
@commands.group(aliases=['e6', '6'], brief='e621 | NSFW', description='e621 | NSFW\nTag-based search for e621.net\n\nYou can only search 5 tags and 6 images at once for now.\ne6 [tags...] ([# of images])')
@checks.del_ctx()
@checks.is_nsfw()
async def e621(self, ctx, *args):
try:
@ -1147,7 +1136,6 @@ class MsG:
# Searches for and returns images from e926.net given tags when not blacklisted
@commands.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])')
@checks.del_ctx()
async def e926(self, ctx, *args):
try:
kwargs = u.get_kwargs(ctx, args, limit=3)
@ -1189,7 +1177,6 @@ class MsG:
await ctx.message.add_reaction('\N{CROSS MARK}')
@commands.group(aliases=['fave', 'fav', 'f'])
@checks.del_ctx()
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)
@ -1300,7 +1287,6 @@ class MsG:
# Umbrella command structure to manage global, channel, and user blacklists
@commands.group(aliases=['bl', 'b'], brief='Manage blacklists', description='Blacklist base command for managing blacklists\n\n`bl get [blacklist]` to show a blacklist\n`bl set [blacklist] [tags]` to replace a blacklist\n`bl clear [blacklist]` to clear a blacklist\n`bl add [blacklist] [tags]` to add tags to a blacklist\n`bl remove [blacklist] [tags]` to remove tags from a blacklist', usage='[flag] [blacklist] ([tags])')
@checks.del_ctx()
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)

View file

@ -28,10 +28,18 @@ class Administration:
self.deleting = True
self.bot.loop.create_task(self.delete())
@commands.command(name=',prunefromguild', aliases=[',pfg', ',prunefromserver', ',pfs'], 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\}')
@commands.group(aliases=['pru', 'clear', 'cl'], hidden=True)
@commands.is_owner()
@checks.del_ctx()
async def prune_all_user(self, ctx, user, when=None, reference=None):
async def prune(self, ctx):
pass
@prune.group(name='user', aliases=['u', 'member', 'm'])
async def _prune_user(self, ctx):
pass
@_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)
@commands.is_owner()
async def _prune_user_all(self, ctx, user, when=None, reference=None):
def yes(msg):
if msg.content.lower() == 'y' and msg.channel is ctx.channel and msg.author is ctx.author:
return True
@ -147,7 +155,6 @@ class Administration:
@commands.command(name='autodelete', aliases=['autodel'])
@commands.has_permissions(administrator=True)
@checks.del_ctx()
async def auto_delete(self, ctx):
try:
if ctx.channel.id not in u.tasks['auto_del']:
@ -166,9 +173,13 @@ class Administration:
await ctx.send('**Already auto-deleting in {}.** Type `stop` to stop.'.format(ctx.channel.mention), delete_after=7)
await ctx.message.add_reaction('\N{CROSS MARK}')
@commands.command(name='deletecommands', aliases=['delcmds'])
@commands.group(aliases=['setting', 'set', 's'])
@commands.has_permissions(administrator=True)
async def delete_commands(self, ctx):
async def settings(self, ctx):
pass
@settings.command(name='deletecommands', aliases=['delcmds', 'delcmd'])
async def _settings_delete_commands(self, ctx):
if ctx.guild.id not in u.settings['del_ctx']:
u.settings['del_ctx'].append(ctx.guild.id)
else:
@ -177,13 +188,12 @@ class Administration:
await ctx.send('**Delete command invocations:** `{}`'.format(ctx.guild.id in u.settings['del_ctx']))
@commands.command(name='setprefix', aliases=['setpre', 'spre'])
@commands.has_permissions(administrator=True)
async def set_prefix(self, ctx, prefix=None):
if prefix is not None:
u.settings['prefixes'][ctx.guild.id] = prefix
@settings.command(name='prefix', aliases=['pre', 'p'])
async def _settings_prefix(self, ctx, *prefixes):
if prefixes:
u.settings['prefixes'][ctx.guild.id] = prefixes
else:
with suppress(KeyError):
del u.settings['prefixes'][ctx.guild.id]
await ctx.send(f'**Prefix set to:** `{"` or `".join(prefix if ctx.guild.id in u.settings["prefixes"] else u.config["prefix"])}`')
await ctx.send(f'**Prefix set to:** `{"` or `".join(prefixes if ctx.guild.id in u.settings["prefixes"] else u.config["prefix"])}`')

View file

@ -24,7 +24,6 @@ class Bot:
# Close connection to Discord - immediate offline
@commands.command(name=',die', aliases=[',d'], brief='Kills the bot', description='BOT OWNER ONLY\nCloses the connection to Discord', hidden=True)
@commands.is_owner()
@checks.del_ctx()
async def die(self, ctx):
await ctx.message.add_reaction('\N{CRESCENT MOON}')
@ -44,7 +43,6 @@ class Bot:
@commands.command(name=',restart', aliases=[',res', ',r'], hidden=True)
@commands.is_owner()
@checks.del_ctx()
async def restart(self, ctx):
await ctx.message.add_reaction('\N{SLEEPING SYMBOL}')
@ -66,7 +64,6 @@ class Bot:
# Invite bot to bot owner's server
@commands.command(name=',invite', aliases=[',inv', ',link'], brief='Invite the bot', description='BOT OWNER ONLY\nInvite the bot to a server (Requires admin)', hidden=True)
@commands.is_owner()
@checks.del_ctx()
async def invite(self, ctx):
await ctx.message.add_reaction('\N{ENVELOPE}')
@ -74,16 +71,27 @@ class Bot:
@commands.command(name=',status', aliases=[',presence', ',game'], hidden=True)
@commands.is_owner()
@checks.del_ctx()
async def status(self, ctx, *, game=None):
if game is not None:
async def change_status(self, ctx, *, game=None):
if game:
await self.bot.change_presence(game=d.Game(name=game))
u.config['playing'] = game
u.dump(u.config, 'config.json', json=True)
await ctx.send(f'**Game changed to** `{game}`')
else:
await self.bot.change_presence(game=None)
u.config['playing'] = 'None'
u.dump(u.config, 'config.json', json=True)
await ctx.send('**Game changed to** ` `')
@commands.command(name=',username', aliases=[',user'], hidden=True)
@commands.is_owner()
async def change_username(self, ctx, *, username=None):
if username:
await self.bot.edit(username=username)
await ctx.send(f'**Username changed to** `{username}`')
else:
await ctx.send('**Invalid string**', delete_after=7)
await ctx.message.add_reaction('\N{CROSS MARK}')
class Tools:
@ -115,7 +123,6 @@ class Tools:
@commands.command(name=',console', aliases=[',con', ',c'], hidden=True)
@commands.is_owner()
@checks.del_ctx()
async def console(self, ctx):
def execute(msg):
if msg.content.lower().startswith('exec ') and msg.author is ctx.author and msg.channel is ctx.channel:
@ -189,7 +196,6 @@ class Tools:
@commands.command(name=',execute', aliases=[',exec'], hidden=True)
@commands.is_owner()
@checks.del_ctx()
async def execute(self, ctx, *, exe):
try:
with io.StringIO() as buff, redirect_stdout(buff):
@ -201,7 +207,6 @@ class Tools:
@commands.command(name=',evaluate', aliases=[',eval'], hidden=True)
@commands.is_owner()
@checks.del_ctx()
async def evaluate(self, ctx, *, evl):
try:
with io.StringIO() as buff, redirect_stdout(buff):
@ -213,7 +218,6 @@ class Tools:
@commands.group(aliases=[',db'], hidden=True)
@commands.is_owner()
@checks.del_ctx()
async def debug(self, ctx):
console = await self.generate(ctx)

View file

@ -47,19 +47,16 @@ class Utils:
# Displays latency
@commands.command(aliases=['p'], brief='Pong!', description='Returns latency from bot to Discord servers, not to user')
@checks.del_ctx()
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)
@commands.command(aliases=['pre'], brief='List bot prefixes', description='Shows all used prefixes')
@checks.del_ctx()
async def prefix(self, ctx):
await ctx.send('**Prefix:** `{}`'.format('` or `'.join(u.settings['prefixes'][ctx.guild.id] if ctx.guild.id in u.settings['prefixes'] else u.config['prefix'])))
@commands.group(name=',send', aliases=[',s'], hidden=True)
@commands.is_owner()
@checks.del_ctx()
async def send(self, ctx):
pass
@ -84,7 +81,7 @@ class Utils:
async def send_user(self, ctx, user, *, message):
await d.utils.get(self.bot.get_all_members(), id=int(user)).send(message)
@commands.command(aliases=['authenticateupload', 'authupload', 'authup', 'auth'])
@commands.command(aliases=['authenticateupload', 'authupload', 'authup', 'auth'], hidden=True)
async def authenticate_upload(self, ctx):
global youtube
flow = flow_from_clientsecrets('client_secrets.json', scope='https://www.googleapis.com/auth/youtube.upload',
@ -95,7 +92,7 @@ class Utils:
youtube = build('youtube', 'v3', http=credentials.authorize(http.build_http()))
print('Service built.')
@commands.command(aliases=['up', 'u', 'vid', 'v'])
@commands.command(aliases=['up', 'u', 'vid', 'v'], hidden=True)
@commands.has_permissions(administrator=True)
async def upload(self, ctx):
global youtube

View file

@ -49,13 +49,3 @@ def is_nsfw():
return ctx.message.channel.is_nsfw()
return True
return commands.check(predicate)
def del_ctx():
async def predicate(ctx):
with suppress(AttributeError):
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):
with suppress(err.NotFound):
await ctx.message.delete()
return True
return commands.check(predicate)

View file

@ -23,19 +23,44 @@ from utils import utils as u
log.basicConfig(level=log.WARNING)
class HelpFormatter(commands.HelpFormatter):
async def format():
pass
# class HelpFormatter(commands.HelpFormatter):
#
# async def format(self):
# self._paginator = commands.Paginator()
#
# # we need a padding of ~80 or so
#
# description = self.command.description if not self.is_cog() else inspect.getdoc(self.command)
#
# if description:
# # <description> portion
# self._paginator.add_line(description, empty=True)
#
# if isinstance(self.command, commands.Command):
# # <signature portion>
# signature = self.get_command_signature()
# self._paginator.add_line(signature, empty=True)
#
# # <long doc> section
# if self.command.help:
# self._paginator.add_line(self.command.help, empty=True)
#
# # end it here if it's just a regular command
# if not self.has_subcommands():
# self._paginator.close_page()
# return self._paginator.pages
#
# max_width = self.max_name_size
def get_prefix(bot, message):
if isinstance(message.guild, d.Guild) and message.guild.id in u.settings['prefixes']:
return u.settings['prefixes'][message.guild.id]
return u.config['prefix']
return u.settings['prefixes'].get(message.guild.id, u.config['prefix'])
bot = commands.Bot(command_prefix=get_prefix, formatter=commands.HelpFormatter(show_check_failure=True), description='Modumind - A booru bot with a side of management\n\nS for single command\nG for group command', help_attrs={'aliases': ['h']}, pm_help=None)
help_formatter = HelpFormatter(show_check_failure=True)
bot = commands.Bot(command_prefix=get_prefix, formatter=help_formatter, description='Experimental miscellaneous bot')
@bot.command(help='help', brief='brief', description='description', usage='usage')
async def test(ctx):
pass
# Send and print ready message to #testing and console after logon
@ -109,7 +134,12 @@ async def on_command_error(ctx, error):
@bot.event
async def on_command_completion(ctx):
await ctx.message.add_reaction('\N{WHITE HEAVY CHECK MARK}')
with suppress(err.NotFound):
with suppress(AttributeError):
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}')
if ctx.command.name != 'lastcommand':
u.last_commands[ctx.author.id] = ctx
@ -141,7 +171,6 @@ def after(voice, error):
# suggested = u.setdefault('cogs/suggested.pkl', {'last_update': 'None', 'tags': {}, 'total': 0})
@bot.command(name=',test', hidden=True)
@commands.is_owner()
@checks.del_ctx()
async def test(ctx):
post = await u.fetch('https://e621.net/post/show.json?id=1145042', json=True)