diff options
| -rw-r--r-- | bot/cogs/moderation.py | 283 |
1 files changed, 26 insertions, 257 deletions
diff --git a/bot/cogs/moderation.py b/bot/cogs/moderation.py index f1c10620c..47ef138dc 100644 --- a/bot/cogs/moderation.py +++ b/bot/cogs/moderation.py @@ -94,33 +94,8 @@ class Moderation(Scheduler, Cog): if infraction is None: return - notified = await self.notify_infraction(user=user, infr_type="Warning", reason=reason) - - dm_result = ":incoming_envelope: " if notified else "" - action = f"{dm_result}:ok_hand: warned {user.mention}" - await ctx.send(f"{action}.") - - if notified: - dm_status = "Sent" - log_content = None - else: - dm_status = "**Failed**" - log_content = ctx.author.mention - - await self.mod_log.send_log_message( - icon_url=Icons.user_warn, - colour=Colour(Colours.soft_red), - title="Member warned", - thumbnail=user.avatar_url_as(static_format="png"), - text=textwrap.dedent(f""" - Member: {user.mention} (`{user.id}`) - Actor: {ctx.author} - DM: {dm_status} - Reason: {reason} - """), - content=log_content, - footer=f"ID {infraction['id']}" - ) + dm_result = await self.send_messages(ctx, infraction, user, "warned") + await ctx.send(f"{dm_result}:ok_hand: warned {user.mention}.") @with_role(*MODERATION_ROLES) @command() @@ -131,8 +106,6 @@ class Moderation(Scheduler, Cog): if infraction is None: return - notified = await self.notify_infraction(user=user, infr_type="Kick", reason=reason) - self.mod_log.ignore(Event.member_remove, user.id) try: @@ -141,28 +114,8 @@ class Moderation(Scheduler, Cog): except Forbidden: action_result = False - dm_result = ":incoming_envelope: " if notified else "" - action = f"{dm_result}:ok_hand: kicked {user.mention}" - await ctx.send(f"{action}.") - - dm_status = "Sent" if notified else "**Failed**" - title = "Member kicked" if action_result else "Member kicked (Failed)" - log_content = None if all((notified, action_result)) else ctx.author.mention - - await self.mod_log.send_log_message( - icon_url=Icons.sign_out, - colour=Colour(Colours.soft_red), - title=title, - thumbnail=user.avatar_url_as(static_format="png"), - text=textwrap.dedent(f""" - Member: {user.mention} (`{user.id}`) - Actor: {ctx.message.author} - DM: {dm_status} - Reason: {reason} - """), - content=log_content, - footer=f"ID {infraction['id']}" - ) + dm_result = await self.send_messages(ctx, infraction, user, "kicked", action_result) + await ctx.send(f"{dm_result}:ok_hand: kicked {user.mention}.") @with_role(*MODERATION_ROLES) @command() @@ -176,12 +129,6 @@ class Moderation(Scheduler, Cog): if infraction is None: return - notified = await self.notify_infraction( - user=user, - infr_type="Ban", - reason=reason - ) - self.mod_log.ignore(Event.member_ban, user.id) self.mod_log.ignore(Event.member_remove, user.id) @@ -191,30 +138,8 @@ class Moderation(Scheduler, Cog): except Forbidden: action_result = False - dm_result = ":incoming_envelope: " if notified else "" - action = f"{dm_result}:ok_hand: permanently banned {user.mention}" - await ctx.send(f"{action}.") - - dm_status = "Sent" if notified else "**Failed**" - log_content = None if all((notified, action_result)) else ctx.author.mention - title = "Member permanently banned" - if not action_result: - title += " (Failed)" - - await self.mod_log.send_log_message( - icon_url=Icons.user_ban, - colour=Colour(Colours.soft_red), - title=title, - thumbnail=user.avatar_url_as(static_format="png"), - text=textwrap.dedent(f""" - Member: {user.mention} (`{user.id}`) - Actor: {ctx.message.author} - DM: {dm_status} - Reason: {reason} - """), - content=log_content, - footer=f"ID {infraction['id']}" - ) + dm_result = await self.send_messages(ctx, infraction, user, "permanently banned", action_result) + await ctx.send(f"{dm_result}:ok_hand: permanently banned {user.mention}.") # endregion # region: Temporary infractions @@ -227,55 +152,21 @@ class Moderation(Scheduler, Cog): Duration strings are parsed per: http://strftime.org/ """ - expiration = duration - if await already_has_active_infraction(ctx=ctx, user=user, type="mute"): return - infraction = await post_infraction(ctx, user, type="mute", reason=reason, expires_at=expiration) + infraction = await post_infraction(ctx, user, type="mute", reason=reason, expires_at=duration) if infraction is None: return self.mod_log.ignore(Event.member_update, user.id) await user.add_roles(self._muted_role, reason=reason) - notified = await self.notify_infraction( - user=user, - infr_type="Mute", - expires_at=expiration, - reason=reason - ) - - infraction_expiration = format_infraction(infraction["expires_at"]) - self.schedule_task(ctx.bot.loop, infraction["id"], infraction) - dm_result = ":incoming_envelope: " if notified else "" - action = f"{dm_result}:ok_hand: muted {user.mention} until {infraction_expiration}" - await ctx.send(f"{action}.") - - if notified: - dm_status = "Sent" - log_content = None - else: - dm_status = "**Failed**" - log_content = ctx.author.mention - - await self.mod_log.send_log_message( - icon_url=Icons.user_mute, - colour=Colour(Colours.soft_red), - title="Member temporarily muted", - thumbnail=user.avatar_url_as(static_format="png"), - text=textwrap.dedent(f""" - Member: {user.mention} (`{user.id}`) - Actor: {ctx.message.author} - DM: {dm_status} - Reason: {reason} - Expires: {infraction_expiration} - """), - content=log_content, - footer=f"ID {infraction['id']}" - ) + dm_result = await self.send_messages(ctx, infraction, user, "temporarily muted") + expiry = format_infraction(infraction["expires_at"]) + await ctx.send(f"{dm_result}:ok_hand: muted {user.mention} until {expiry}.") @with_role(*MODERATION_ROLES) @command() @@ -286,22 +177,13 @@ class Moderation(Scheduler, Cog): Duration strings are parsed per: http://strftime.org/ """ - expiration = duration - if await already_has_active_infraction(ctx=ctx, user=user, type="ban"): return - infraction = await post_infraction(ctx, user, type="ban", reason=reason, expires_at=expiration) + infraction = await post_infraction(ctx, user, type="ban", reason=reason, expires_at=duration) if infraction is None: return - notified = await self.notify_infraction( - user=user, - infr_type="Ban", - expires_at=expiration, - reason=reason - ) - self.mod_log.ignore(Event.member_ban, user.id) self.mod_log.ignore(Event.member_remove, user.id) @@ -311,35 +193,11 @@ class Moderation(Scheduler, Cog): except Forbidden: action_result = False - infraction_expiration = format_infraction(infraction["expires_at"]) - self.schedule_task(ctx.bot.loop, infraction["id"], infraction) - dm_result = ":incoming_envelope: " if notified else "" - action = f"{dm_result}:ok_hand: banned {user.mention} until {infraction_expiration}" - await ctx.send(f"{action}.") - - dm_status = "Sent" if notified else "**Failed**" - log_content = None if all((notified, action_result)) else ctx.author.mention - title = "Member temporarily banned" - if not action_result: - title += " (Failed)" - - await self.mod_log.send_log_message( - icon_url=Icons.user_ban, - colour=Colour(Colours.soft_red), - thumbnail=user.avatar_url_as(static_format="png"), - title=title, - text=textwrap.dedent(f""" - Member: {user.mention} (`{user.id}`) - Actor: {ctx.message.author} - DM: {dm_status} - Reason: {reason} - Expires: {infraction_expiration} - """), - content=log_content, - footer=f"ID {infraction['id']}" - ) + dm_result = await self.send_messages(ctx, infraction, user, "temporarily banned", action_result) + expiry = format_infraction(infraction["expires_at"]) + await ctx.send(f"{dm_result}:ok_hand: banned {user.mention} until {expiry}.") # endregion # region: Permanent shadow infractions @@ -356,21 +214,9 @@ class Moderation(Scheduler, Cog): if infraction is None: return + await self.send_messages(ctx, infraction, user, "note added") await ctx.send(f":ok_hand: note added for {user.mention}.") - await self.mod_log.send_log_message( - icon_url=Icons.user_warn, - colour=Colour(Colours.soft_red), - title="Member note added", - thumbnail=user.avatar_url_as(static_format="png"), - text=textwrap.dedent(f""" - Member: {user.mention} (`{user.id}`) - Actor: {ctx.message.author} - Reason: {reason} - """), - footer=f"ID {infraction['id']}" - ) - @with_role(*MODERATION_ROLES) @command(hidden=True, aliases=['shadowkick', 'skick']) @respect_role_hierarchy() @@ -392,29 +238,9 @@ class Moderation(Scheduler, Cog): except Forbidden: action_result = False + await self.send_messages(ctx, infraction, user, "shadow kicked", action_result) await ctx.send(f":ok_hand: kicked {user.mention}.") - title = "Member shadow kicked" - if action_result: - log_content = None - else: - log_content = ctx.author.mention - title += " (Failed)" - - await self.mod_log.send_log_message( - icon_url=Icons.sign_out, - colour=Colour(Colours.soft_red), - title=title, - thumbnail=user.avatar_url_as(static_format="png"), - text=textwrap.dedent(f""" - Member: {user.mention} (`{user.id}`) - Actor: {ctx.message.author} - Reason: {reason} - """), - content=log_content, - footer=f"ID {infraction['id']}" - ) - @with_role(*MODERATION_ROLES) @command(hidden=True, aliases=['shadowban', 'sban']) @respect_role_hierarchy() @@ -440,29 +266,9 @@ class Moderation(Scheduler, Cog): except Forbidden: action_result = False + await self.send_messages(ctx, infraction, user, "permanently banned", action_result) await ctx.send(f":ok_hand: permanently banned {user.mention}.") - title = "Member permanently banned" - if action_result: - log_content = None - else: - log_content = ctx.author.mention - title += " (Failed)" - - await self.mod_log.send_log_message( - icon_url=Icons.user_ban, - colour=Colour(Colours.soft_red), - title=title, - thumbnail=user.avatar_url_as(static_format="png"), - text=textwrap.dedent(f""" - Member: {user.mention} (`{user.id}`) - Actor: {ctx.message.author} - Reason: {reason} - """), - content=log_content, - footer=f"ID {infraction['id']}" - ) - # endregion # region: Temporary shadow infractions @@ -478,35 +284,21 @@ class Moderation(Scheduler, Cog): This does not send the user a notification. """ - expiration = duration - if await already_has_active_infraction(ctx=ctx, user=user, type="mute"): return - infraction = await post_infraction(ctx, user, type="mute", reason=reason, expires_at=expiration, hidden=True) + infraction = await post_infraction(ctx, user, type="mute", reason=reason, expires_at=duration, hidden=True) if infraction is None: return self.mod_log.ignore(Event.member_update, user.id) await user.add_roles(self._muted_role, reason=reason) - infraction_expiration = format_infraction(infraction["expires_at"]) self.schedule_task(ctx.bot.loop, infraction["id"], infraction) - await ctx.send(f":ok_hand: muted {user.mention} until {infraction_expiration}.") - await self.mod_log.send_log_message( - icon_url=Icons.user_mute, - colour=Colour(Colours.soft_red), - title="Member temporarily muted", - thumbnail=user.avatar_url_as(static_format="png"), - text=textwrap.dedent(f""" - Member: {user.mention} (`{user.id}`) - Actor: {ctx.message.author} - Reason: {reason} - Expires: {infraction_expiration} - """), - footer=f"ID {infraction['id']}" - ) + await self.send_messages(ctx, infraction, user, "temporarily muted") + expiry = format_infraction(infraction["expires_at"]) + await ctx.send(f":ok_hand: muted {user.mention} until {expiry}.") @with_role(*MODERATION_ROLES) @command(hidden=True, aliases=["shadowtempban, stempban"]) @@ -521,12 +313,10 @@ class Moderation(Scheduler, Cog): This does not send the user a notification. """ - expiration = duration - if await already_has_active_infraction(ctx=ctx, user=user, type="ban"): return - infraction = await post_infraction(ctx, user, type="ban", reason=reason, expires_at=expiration, hidden=True) + infraction = await post_infraction(ctx, user, type="ban", reason=reason, expires_at=duration, hidden=True) if infraction is None: return @@ -539,32 +329,11 @@ class Moderation(Scheduler, Cog): except Forbidden: action_result = False - infraction_expiration = format_infraction(infraction["expires_at"]) self.schedule_task(ctx.bot.loop, infraction["id"], infraction) - await ctx.send(f":ok_hand: banned {user.mention} until {infraction_expiration}.") - title = "Member temporarily banned" - if action_result: - log_content = None - else: - log_content = ctx.author.mention - title += " (Failed)" - - # Send a log message to the mod log - await self.mod_log.send_log_message( - icon_url=Icons.user_ban, - colour=Colour(Colours.soft_red), - thumbnail=user.avatar_url_as(static_format="png"), - title=title, - text=textwrap.dedent(f""" - Member: {user.mention} (`{user.id}`) - Actor: {ctx.message.author} - Reason: {reason} - Expires: {infraction_expiration} - """), - content=log_content, - footer=f"ID {infraction['id']}" - ) + await self.send_messages(ctx, infraction, user, "temporarily banned", action_result) + expiry = format_infraction(infraction["expires_at"]) + await ctx.send(f":ok_hand: banned {user.mention} until {expiry}.") # endregion # region: Remove infractions (un- commands) @@ -1087,7 +856,7 @@ class Moderation(Scheduler, Cog): await self.mod_log.send_log_message( icon_url=icon, colour=Colour(Colours.soft_red), - title=title, + title=f"Member {title}", thumbnail=user.avatar_url_as(static_format="png"), text=textwrap.dedent(f""" Member: {user.mention} (`{user.id}`) |