diff --git a/aurora/models/moderation_types.py b/aurora/models/moderation_types.py index 6f1cb05..3b29bf4 100644 --- a/aurora/models/moderation_types.py +++ b/aurora/models/moderation_types.py @@ -30,7 +30,6 @@ class Note(Type): key="note" string="note" verb="noted" - embed_desc="received a " def void(self) -> None: return None @@ -284,6 +283,39 @@ class AddRole(Type): ) return 0 + @classmethod + async def resolve_handler(cls, moderation: Moderation, reason: str) -> Tuple[bool, str]: + try: + target = await moderation.guild.fetch_member(moderation.target_id) + await target.remove_roles( + Object(moderation.role_id), reason=reason + ) + if await config.guild(moderation.guild).dm_users() is True: + try: + embed = await resolve_factory( + moderation=moderation, + reason=reason + ) + await target.send(embed=embed, file=get_icon(bot=moderation.bot)) + except HTTPException: + pass + logger.trace( + "Removed role %s from %s (%s)", + moderation.role_id, + target.name, + target.id, + ) + return True, "" + except (NotFound, Forbidden, HTTPException) as e: + logger.error( + "Failed to remove role %s from user %s (%s)\n%s", + moderation.role_id, + target.name, + target.id, + e, + ) + return False, "Failed to remove role from user." + class RemoveRole(Type): key="removerole" string="removerole" @@ -294,7 +326,7 @@ class RemoveRole(Type): return None @classmethod - async def handler(cls, ctx: commands.Context, target: Member, role: Role, silent: bool, duration: str = None, reason: str = None): + async def handler(cls, ctx: commands.Context, target: Member, role: Role, silent: bool, duration: str | None = None, reason: str = None): addrole_whitelist = await config.guild(ctx.guild).addrole_whitelist() if not addrole_whitelist: