diff --git a/cogs/mod.py b/cogs/mod.py index 3413b3b..79a5bcc 100644 --- a/cogs/mod.py +++ b/cogs/mod.py @@ -108,6 +108,55 @@ class Mod: except discord.HTTPException: await ctx.send("Sorry, I failed to ban that user!") + @commands.command() + @commands.guild_only() + @utils.custom_perms(manage_guild=True) + async def ignore(self, ctx, member_or_channel): + """This command can be used to have Bonfire ignore certain members/channels + + EXAMPLE: !ignore #general + RESULT: Bonfire will ignore commands sent in the general channel""" + key = str(ctx.message.guild.id) + + converter = commands.converter.MemberConverter() + converter.prepare(ctx, member_or_channel) + member = None + channel = None + try: + member = converter.convert() + except commands.converter.BadArgument: + converter = commands.converter.TextChannelConverter() + converter.prepare(ctx, member_or_channel) + try: + channel = converter.convert() + except commands.converter.BadArgument: + await ctx.send("{} does not appear to be a member or channel!".format(member_or_channel)) + return + + settings = await utils.get_content('server_settings', key) + ignored = settings.get('ignored', {'members': [], 'channels': []}) + if member: + if str(member.id) in ignored['members']: + await ctx.send("I am already ignoring {}!".format(member.display_name)) + return + elif member.guild_permissions >= ctx.message.author.guild_permissions: + await ctx.send("You cannot make me ignore someone at equal or higher rank than you!") + return + else: + ignored['members'].append(str(member.id)) + fmt = "Ignoring {}".format(member.display_name) + elif channel: + if str(channel.id) in ignored['channels']: + await ctx.send("I am already ignoring {}!".format(channel.mention)) + return + else: + ignored['channels'].append(str(channel.id)) + fmt = "Ignoring {}".format(channel.mention) + + update = {'ignored': ignored} + await utils.update_content('server_settings', update, key) + await ctx.send(fmt) + @commands.command(aliases=['alerts']) @commands.guild_only() @utils.custom_perms(kick_members=True) diff --git a/cogs/utils/checks.py b/cogs/utils/checks.py index 58d0c2a..1507695 100644 --- a/cogs/utils/checks.py +++ b/cogs/utils/checks.py @@ -65,6 +65,14 @@ async def db_check(): def is_owner(ctx): return ctx.message.author.id in config.owner_ids +def should_ignore(ctx): + try: + server_settings = config.cache.get('server_settings').values + ignored = [x for x in server_settings if x['server_id'] == str( + ctx.message.guild.id)][0]['ignored'] + return str(ctx.message.author.id) in ignored['members'] or str(ctx.message.channel.id) in ignored['channels'] + except (TypeError, IndexError, KeyError): + return False def custom_perms(**perms): def predicate(ctx): @@ -72,6 +80,10 @@ def custom_perms(**perms): if type(ctx.message.channel) is discord.DMChannel: return True + # Now check if this channel/member should be ignored + if should_ignore(ctx): + return False + # Get the member permissions so that we can compare member_perms = ctx.message.author.permissions_in(ctx.message.channel) # Next, set the default permissions if one is not used, based on what was passed