From 373e95b9af6e1a249dabed02d4919f2b5218cb10 Mon Sep 17 00:00:00 2001 From: Zevaryx Date: Sat, 30 Apr 2022 19:41:29 -0600 Subject: [PATCH] Fix various setting and role-related bugs --- jarvis/cogs/rolegiver.py | 7 +++++++ jarvis/cogs/settings.py | 17 +++++++++++++---- jarvis/cogs/verify.py | 22 +++++++++++++++++----- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/jarvis/cogs/rolegiver.py b/jarvis/cogs/rolegiver.py index d934de8..ec08eb8 100644 --- a/jarvis/cogs/rolegiver.py +++ b/jarvis/cogs/rolegiver.py @@ -41,6 +41,13 @@ class RolegiverCog(Scale): await ctx.send("Cannot add `@everyone` to rolegiver", ephemeral=True) return + if role.bot_managed or not role.is_assignable: + await ctx.send( + "Cannot assign this role, try lowering it below my role or using a different role", + ephemeral=True, + ) + return + setting = await Rolegiver.find_one(q(guild=ctx.guild.id)) if setting and role.id in setting.roles: await ctx.send("Role already in rolegiver", ephemeral=True) diff --git a/jarvis/cogs/settings.py b/jarvis/cogs/settings.py index d5e5086..39627fe 100644 --- a/jarvis/cogs/settings.py +++ b/jarvis/cogs/settings.py @@ -105,6 +105,12 @@ class SettingsCog(Scale): if role.id == ctx.guild.id: await ctx.send("Cannot set verified to `@everyone`", ephemeral=True) return + if role.bot_managed or not role.is_assignable: + await ctx.send( + "Cannot assign this role, try lowering it below my role or using a different role", + ephemeral=True, + ) + return await ctx.defer() await self.update_settings("verified", role.id, ctx.guild.id) await ctx.send(f"Settings applied. New verified role is `{role.name}`") @@ -118,6 +124,12 @@ class SettingsCog(Scale): if role.id == ctx.guild.id: await ctx.send("Cannot set unverified to `@everyone`", ephemeral=True) return + if role.bot_managed or not role.is_assignable: + await ctx.send( + "Cannot assign this role, try lowering it below my role or using a different role", + ephemeral=True, + ) + return await ctx.defer() await self.update_settings("unverified", role.id, ctx.guild.id) await ctx.send(f"Settings applied. New unverified role is `{role.name}`") @@ -169,14 +181,11 @@ class SettingsCog(Scale): await ctx.send("Setting `massmention` unset") @unset.subcommand(sub_cmd_name="verified", sub_cmd_description="Unset verified role") - @slash_option( - name="role", description="Verified role", opt_type=OptionTypes.ROLE, required=True - ) @check(admin_or_permissions(Permissions.MANAGE_GUILD)) async def _unset_verified(self, ctx: InteractionContext) -> None: await ctx.defer() await self.delete_settings("verified", ctx.guild.id) - await ctx.send("Setting `massmention` unset") + await ctx.send("Setting `verified` unset") @unset.subcommand(sub_cmd_name="unverified", sub_cmd_description="Unset unverified role") @check(admin_or_permissions(Permissions.MANAGE_GUILD)) diff --git a/jarvis/cogs/verify.py b/jarvis/cogs/verify.py index 602f691..d7dda8e 100644 --- a/jarvis/cogs/verify.py +++ b/jarvis/cogs/verify.py @@ -45,7 +45,13 @@ class VerifyCog(Scale): if not role: message = await ctx.send("This guild has not enabled verification", ephemeral=True) return - if await ctx.guild.fetch_role(role.value) in ctx.author.roles: + verified_role = await ctx.guild.fetch_role(role.value) + if not verified_role: + await ctx.send("This guild has not enabled verification", ephemeral=True) + await role.delete() + return + + if verified_role in ctx.author.roles: await ctx.send("You are already verified.", ephemeral=True) return components = create_layout() @@ -69,12 +75,18 @@ class VerifyCog(Scale): for component in row.components: component.disabled = True setting = await Setting.find_one(q(guild=ctx.guild.id, setting="verified")) - role = await ctx.guild.fetch_role(setting.value) - await ctx.author.add_role(role, reason="Verification passed") + try: + role = await ctx.guild.fetch_role(setting.value) + await ctx.author.add_role(role, reason="Verification passed") + except AttributeError: + self.logger.warn("Verified role deleted before verification finished") setting = await Setting.find_one(q(guild=ctx.guild.id, setting="unverified")) if setting: - role = await ctx.guild.fetch_role(setting.value) - await ctx.author.remove_role(role, reason="Verification passed") + try: + role = await ctx.guild.fetch_role(setting.value) + await ctx.author.remove_role(role, reason="Verification passed") + except AttributeError: + self.logger.warn("Unverified role deleted before verification finished") await response.context.edit_origin( content=f"Welcome, {ctx.author.mention}. Please enjoy your stay.",