From cb6c51766719ad825f21dc7b713d6e6f2ddd99e6 Mon Sep 17 00:00:00 2001 From: Zevaryx Date: Mon, 3 Oct 2022 20:04:30 -0600 Subject: [PATCH] Move to static embeds in own package --- jarvis/client.py | 14 ++- jarvis/cogs/admin/ban.py | 66 ++++------- jarvis/cogs/admin/kick.py | 32 +----- jarvis/cogs/admin/mute.py | 35 ++---- jarvis/cogs/admin/warning.py | 4 +- jarvis/cogs/reddit.py | 13 ++- jarvis/cogs/remindme.py | 12 +- jarvis/cogs/rolegiver.py | 6 - jarvis/embeds/admin.py | 208 +++++++++++++++++++++++++++++++++++ jarvis/utils/embeds.py | 26 ----- 10 files changed, 266 insertions(+), 150 deletions(-) create mode 100644 jarvis/embeds/admin.py delete mode 100644 jarvis/utils/embeds.py diff --git a/jarvis/client.py b/jarvis/client.py index cc4b9c3..b7a46cf 100644 --- a/jarvis/client.py +++ b/jarvis/client.py @@ -46,9 +46,9 @@ from nafftrack.client import StatsClient from pastypy import AsyncPaste as Paste from jarvis import const +from jarvis.embeds.admin import warning_embed from jarvis.tracking import jarvis_info, malicious_tracker, warnings_tracker from jarvis.utils import build_embed -from jarvis.utils.embeds import warning_embed if TYPE_CHECKING: from aioredis import Redis @@ -513,7 +513,7 @@ class Jarvis(StatsClient): guild_id=message.guild.id, guild_name=message.guild.name ) tracker.inc() - embed = warning_embed(message.author, "Sent an invite link") + embed = warning_embed(message.author, "Sent an invite link", admin=self.user) try: await message.channel.send(embeds=embed) except Exception: @@ -552,7 +552,7 @@ class Jarvis(StatsClient): guild_id=message.guild.id, guild_name=message.guild.name ) tracker.inc() - embed = warning_embed(message.author, "Mass Mention") + embed = warning_embed(message.author, "Mass Mention", admin=self.user) try: await message.channel.send(embeds=embed) except Exception: @@ -620,7 +620,9 @@ class Jarvis(StatsClient): guild_id=message.guild.id, guild_name=message.guild.name ) tracker.inc() - embed = warning_embed(message.author, "Pinged a blocked role/user with a blocked role") + embed = warning_embed( + message.author, "Pinged a blocked role/user with a blocked role", admin=self.user + ) try: await message.channel.send(embeds=embed) except Exception: @@ -647,7 +649,7 @@ class Jarvis(StatsClient): guild_id=message.guild.id, guild_name=message.guild.name ) tracker.inc() - embed = warning_embed(message.author, "Phishing URL") + embed = warning_embed(message.author, "Phishing URL", admin=self.user) try: await message.channel.send(embeds=embed) except Exception: @@ -693,7 +695,7 @@ class Jarvis(StatsClient): ) tracker.inc() reasons = ", ".join(item["not_safe_reasons"]) - embed = warning_embed(message.author, reasons) + embed = warning_embed(message.author, reasons, admin=self.user) try: await message.channel.send(embeds=embed) except Exception: diff --git a/jarvis/cogs/admin/ban.py b/jarvis/cogs/admin/ban.py index 9d71422..4ea06d5 100644 --- a/jarvis/cogs/admin/ban.py +++ b/jarvis/cogs/admin/ban.py @@ -18,6 +18,7 @@ from naff.models.naff.application_commands import ( from naff.models.naff.command import check from jarvis.branding import get_command_color +from jarvis.embeds.admin import ban_embed, unban_embed from jarvis.utils import build_embed from jarvis.utils.cogs import ModcaseCog from jarvis.utils.permissions import admin_or_permissions @@ -33,7 +34,6 @@ class BanCog(ModcaseCog): user: User, duration: int, active: bool, - fields: list, mtype: str, ) -> None: """Apply a Discord ban.""" @@ -51,20 +51,15 @@ class BanCog(ModcaseCog): ) await b.commit() - embed = build_embed( - title="User Banned", - description=f"Reason: {reason}", - fields=fields, - color=get_command_color("ban"), + embed = ban_embed( + user=user, + admin=ctx.author, + reason=reason, + guild=ctx.guild, + duration=duration, + type=mtype, ) - embed.set_author( - name=user.display_name, - icon_url=user.avatar.url, - ) - embed.set_thumbnail(url=user.avatar.url) - embed.set_footer(text=f"{user.username}#{user.discriminator} | {user.id}") - await ctx.send(embeds=embed) async def discord_apply_unban(self, ctx: InteractionContext, user: User, reason: str) -> None: @@ -80,18 +75,8 @@ class BanCog(ModcaseCog): ) await u.commit() - embed = build_embed( - title="User Unbanned", - description=f"<@{user.id}> was unbanned", - fields=[EmbedField(name="Reason", value=reason)], - color=get_command_color("unban"), - ) - embed.set_author( - name=user.username, - icon_url=user.avatar.url, - ) - embed.set_thumbnail(url=user.avatar.url) - embed.set_footer(text=f"{user.username}#{user.discriminator} | {user.id}") + embed = unban_embed(user=user, admin=ctx.author, reason=reason) + await ctx.send(embeds=embed) @slash_command(name="ban", description="Ban a user") @@ -152,45 +137,36 @@ class BanCog(ModcaseCog): if mtype == "temp": user_message += f"\nDuration: {duration} hours" - fields = [EmbedField(name="Type", value=mtype)] - - if mtype == "temp": - fields.append(EmbedField(name="Duration", value=f"{duration} hour(s)")) - - user_embed = build_embed( - title=f"You have been banned from {ctx.guild.name}", - description=f"Reason: {reason}", - fields=fields, - color=get_command_color("ban"), + user_embed = ban_embed( + user=user, + admin=ctx.author, + reason=reason, + type=mtype, + guild=ctx.guild, + duration=duration, + dm=True, ) - user_embed.set_author( - name=ctx.author.username + "#" + ctx.author.discriminator, - icon_url=ctx.author.avatar, - ) - user_embed.set_thumbnail(url=ctx.guild.icon.url) - try: await user.send(embed=user_embed) except Exception: - send_failed = True + self.logger.warn(f"Failed to send ban embed to {user.id}") try: await ctx.guild.ban(user, reason=reason) except Exception as e: await ctx.send(f"Failed to ban user:\n```\n{e}\n```", ephemeral=True) return - send_failed = False + if mtype == "soft": await ctx.guild.unban(user, reason="Ban was softban") - fields.append(EmbedField(name="DM Sent?", value=str(not send_failed))) if btype != "temp": duration = None active = True if btype == "soft": active = False - await self.discord_apply_ban(ctx, reason, user, duration, active, fields, mtype) + await self.discord_apply_ban(ctx, reason, user, duration, active, mtype) @slash_command(name="unban", description="Unban a user") @slash_option( diff --git a/jarvis/cogs/admin/kick.py b/jarvis/cogs/admin/kick.py index 1c53304..7dfe089 100644 --- a/jarvis/cogs/admin/kick.py +++ b/jarvis/cogs/admin/kick.py @@ -1,7 +1,6 @@ """JARVIS KickCog.""" from jarvis_core.db.models import Kick from naff import InteractionContext, Permissions -from naff.models.discord.embed import EmbedField from naff.models.discord.user import User from naff.models.naff.application_commands import ( OptionTypes, @@ -10,8 +9,7 @@ from naff.models.naff.application_commands import ( ) from naff.models.naff.command import check -from jarvis.branding import get_command_color -from jarvis.utils import build_embed +from jarvis.embeds.admin import kick_embed from jarvis.utils.cogs import ModcaseCog from jarvis.utils.permissions import admin_or_permissions @@ -39,41 +37,19 @@ class KickCog(ModcaseCog): await ctx.send("User must be in guild", ephemeral=True) return - guild_name = ctx.guild.name - embed = build_embed( - title=f"You have been kicked from {guild_name}", - description=f"Reason: {reason}", - fields=[], - color=get_command_color("kick"), - ) + embed = kick_embed(user=user, admin=ctx.author, reason=reason, guild=ctx.guild, dm=True) - embed.set_author( - name=ctx.author.username + "#" + ctx.author.discriminator, - icon_url=ctx.author.display_avatar.url, - ) - embed.set_thumbnail(url=ctx.guild.icon.url) - - send_failed = False try: await user.send(embeds=embed) except Exception: - send_failed = True + self.logger.warn(f"Failed to send kick message to {user.id}") try: await ctx.guild.kick(user, reason=reason) except Exception as e: await ctx.send(f"Failed to kick user:\n```\n{e}\n```", ephemeral=True) return - fields = [EmbedField(name="DM Sent?", value=str(not send_failed))] - embed = build_embed( - title="User Kicked", - description=f"Reason: {reason}", - fields=fields, - ) - - embed.set_author(name=user.display_name, icon_url=user.display_avatar.url) - embed.set_thumbnail(url=user.display_avatar.url) - embed.set_footer(text=f"{user.username}#{user.discriminator} | {user.id}") + embed = kick_embed(user=user, admin=ctx.author, reason=reason, guild=ctx.guild) k = Kick( user=user.id, diff --git a/jarvis/cogs/admin/mute.py b/jarvis/cogs/admin/mute.py index 822bbc4..a7a6129 100644 --- a/jarvis/cogs/admin/mute.py +++ b/jarvis/cogs/admin/mute.py @@ -7,7 +7,6 @@ from dateparser_data.settings import default_parsers from jarvis_core.db.models import Mute from naff import InteractionContext, Permissions from naff.client.errors import Forbidden -from naff.models.discord.embed import EmbedField from naff.models.discord.modal import InputText, Modal, TextStyles from naff.models.discord.user import Member from naff.models.naff.application_commands import ( @@ -20,8 +19,7 @@ from naff.models.naff.application_commands import ( ) from naff.models.naff.command import check -from jarvis.branding import get_command_color -from jarvis.utils import build_embed +from jarvis.embeds.admin import mute_embed, unmute_embed from jarvis.utils.cogs import ModcaseCog from jarvis.utils.permissions import admin_or_permissions @@ -42,21 +40,8 @@ class MuteCog(ModcaseCog): duration=duration, active=True, ).commit() - ts = int(until.timestamp()) - embed = build_embed( - title="User Muted", - description=f"{user.mention} has been muted", - fields=[ - EmbedField(name="Reason", value=reason), - EmbedField(name="Until", value=f" "), - ], - color=get_command_color("mute"), - ) - embed.set_author(name=user.display_name, icon_url=user.display_avatar.url) - embed.set_thumbnail(url=user.display_avatar.url) - embed.set_footer(text=f"{user.username}#{user.discriminator} | {user.id}") - return embed + return mute_embed(user=user, admin=ctx.author, reason=reason, guild=ctx.guild) @context_menu(name="Mute User", context_type=CommandTypes.USER) @check( @@ -193,12 +178,15 @@ class MuteCog(ModcaseCog): @slash_option( name="user", description="User to unmute", opt_type=OptionTypes.USER, required=True ) + @slash_option( + name="reason", description="Reason for unmute", opt_type=OptionTypes.STRING, required=True + ) @check( admin_or_permissions( Permissions.MUTE_MEMBERS, Permissions.BAN_MEMBERS, Permissions.KICK_MEMBERS ) ) - async def _unmute(self, ctx: InteractionContext, user: Member) -> None: + async def _unmute(self, ctx: InteractionContext, user: Member, reason: str) -> None: if ( not user.communication_disabled_until or user.communication_disabled_until.timestamp() @@ -209,13 +197,6 @@ class MuteCog(ModcaseCog): await user.timeout(communication_disabled_until=datetime.now(tz=timezone.utc)) - embed = build_embed( - title="User Unmuted", - description=f"{user.mention} has been unmuted", - fields=[], - color=get_command_color("unmute"), - ) - embed.set_author(name=user.display_name, icon_url=user.display_avatar.url) - embed.set_thumbnail(url=user.display_avatar.url) - embed.set_footer(text=f"{user.username}#{user.discriminator} | {user.id}") + embed = unmute_embed(user=user, admin=ctx.author, reason=reason, guild=ctx.guild) + await ctx.send(embeds=embed) diff --git a/jarvis/cogs/admin/warning.py b/jarvis/cogs/admin/warning.py index 4b67104..79b0b97 100644 --- a/jarvis/cogs/admin/warning.py +++ b/jarvis/cogs/admin/warning.py @@ -15,9 +15,9 @@ from naff.models.naff.application_commands import ( ) from naff.models.naff.command import check +from jarvis.embeds.admin import warning_embed from jarvis.utils import build_embed from jarvis.utils.cogs import ModcaseCog -from jarvis.utils.embeds import warning_embed from jarvis.utils.permissions import admin_or_permissions @@ -65,7 +65,7 @@ class WarningCog(ModcaseCog): expires_at=expires_at, active=True, ).commit() - embed = warning_embed(user, reason) + embed = warning_embed(user, reason, ctx.author) await ctx.send(embeds=embed) @slash_command(name="warnings", description="Get count of user warnings") diff --git a/jarvis/cogs/reddit.py b/jarvis/cogs/reddit.py index c8b8333..a6f3d40 100644 --- a/jarvis/cogs/reddit.py +++ b/jarvis/cogs/reddit.py @@ -16,11 +16,6 @@ from jarvis_core.db.models import ( SubredditFollow, UserSetting, ) - -from jarvis import const -from jarvis.config import JarvisConfig -from jarvis.utils import build_embed -from jarvis.utils.permissions import admin_or_permissions from naff import Client, Extension, InteractionContext, Permissions from naff.client.utils.misc_utils import get from naff.models.discord.channel import ChannelTypes, GuildText @@ -34,6 +29,11 @@ from naff.models.naff.application_commands import ( ) from naff.models.naff.command import check +from jarvis import const +from jarvis.config import JarvisConfig +from jarvis.utils import build_embed +from jarvis.utils.permissions import admin_or_permissions + DEFAULT_USER_AGENT = f"python:JARVIS:{const.__version__} (by u/zevaryx)" sub_name = re.compile(r"\A[A-Za-z0-9][A-Za-z0-9_]{2,20}\Z") user_name = re.compile(r"[A-Za-z0-9_-]+") @@ -116,7 +116,8 @@ class RedditCog(Extension): ) base_embed.set_author(name="u/" + post.author.name, url=author_url, icon_url=author_icon) base_embed.set_footer( - text="Reddit", icon_url="https://www.redditinc.com/assets/images/site/reddit-logo.png" + text=f"r/{sub.display_name}", + icon_url="https://www.redditinc.com/assets/images/site/reddit-logo.png", ) embeds = [base_embed] diff --git a/jarvis/cogs/remindme.py b/jarvis/cogs/remindme.py index a18dfb6..b247bc4 100644 --- a/jarvis/cogs/remindme.py +++ b/jarvis/cogs/remindme.py @@ -153,7 +153,7 @@ class RemindmeCog(Extension): EmbedField(name="Message", value=message), EmbedField( name="When", - value=f"", + value=f" ()", inline=False, ), ], @@ -182,7 +182,7 @@ class RemindmeCog(Extension): if reminder.private and isinstance(ctx.channel, GuildChannel): fields.embed( EmbedField( - name=f"", + name=f" ()", value="Please DM me this command to view the content of this reminder", inline=False, ) @@ -190,7 +190,7 @@ class RemindmeCog(Extension): else: fields.append( EmbedField( - name=f"", + name=f" ()", value=f"{reminder.message}\n\u200b", inline=False, ) @@ -282,8 +282,12 @@ class RemindmeCog(Extension): return ts = int(reminder.remind_at.timestamp()) + cts = int(reminder.created_at.timestamp()) - fields = [EmbedField(name="Remind At", value=f" ()")] + fields = [ + EmbedField(name="Remind At", value=f" ()"), + EmbedField(name="Created At", value=f" ()"), + ] embed = build_embed( title="You have a reminder!", description=reminder.message, fields=fields diff --git a/jarvis/cogs/rolegiver.py b/jarvis/cogs/rolegiver.py index 6627a39..1cc1c45 100644 --- a/jarvis/cogs/rolegiver.py +++ b/jarvis/cogs/rolegiver.py @@ -90,7 +90,6 @@ class RolegiverCog(Extension): ) embed.set_thumbnail(url=ctx.guild.icon.url) - embed.set_author(name=ctx.author.display_name, icon_url=ctx.author.display_avatar.url) embed.set_footer(text=f"{ctx.author.username}#{ctx.author.discriminator} | {ctx.author.id}") components = Button( @@ -164,7 +163,6 @@ class RolegiverCog(Extension): ) embed.set_thumbnail(url=ctx.guild.icon.url) - embed.set_author(name=ctx.author.display_name, icon_url=ctx.author.display_avatar.url) embed.set_footer( text=f"{ctx.author.username}#{ctx.author.discriminator} | {ctx.author.id}" @@ -207,10 +205,6 @@ class RolegiverCog(Extension): ) embed.set_thumbnail(url=ctx.guild.icon.url) - embed.set_author( - name=ctx.author.display_name, - icon_url=ctx.author.display_avatar.url, - ) embed.set_footer(text=f"{ctx.author.username}#{ctx.author.discriminator} | {ctx.author.id}") components = Button( diff --git a/jarvis/embeds/admin.py b/jarvis/embeds/admin.py new file mode 100644 index 0000000..ced7c29 --- /dev/null +++ b/jarvis/embeds/admin.py @@ -0,0 +1,208 @@ +"""JARVIS bot-specific embeds.""" +from typing import Optional + +from naff.models.discord.embed import Embed, EmbedField +from naff.models.discord.guild import Guild +from naff.models.discord.user import Member, User + +from jarvis.branding import get_command_color +from jarvis.utils import build_embed + + +def ban_embed( + user: User, + admin: User, + reason: str, + type: str, + guild: Guild, + duration: Optional[int] = None, + dm: bool = False, +) -> Embed: + """ + Generate a ban embed. + + Args: + user: User to ban + admin: Admin to execute ban + reason: Reason for ban + type: Ban type + guild: Guild to ban from + duration: Optional temporary ban duration + dm: If the embed should be a user embed + """ + fields = [EmbedField(name="Reason", value=reason), EmbedField(name="Type", value=type)] + if duration: + fields.append(EmbedField(name="Duration", value=f"{duration} hours")) + fields.append( + EmbedField(name="Admin", value=f"{admin.username}#{admin.discriminator} ({admin.mention})") + ) + if dm: + embed = build_embed( + title=f"You have been banned from {guild.name}", + fields=fields, + color=get_command_color("ban"), + ) + embed.set_thumbnail(url=guild.icon.url) + else: + embed = build_embed( + title="User Banned", + description=f"{user.mention} has been banned", + fields=fields, + color=get_command_color("ban"), + ) + embed.set_thumbnail(url=user.display_avatar.url) + embed.set_author(name=user.display_name, icon_url=user.display_avatar.url) + embed.set_footer(text=f"{user.username}#{user.discriminator} | {user.id}") + + return embed + + +def unban_embed(user: User, admin: User, reason: str) -> Embed: + """ + Generate an unban embed. + + Args: + user: User to unban + admin: Admin to execute unban + reason: Reason for unban + """ + fields = ( + EmbedField(name="Reason", value=reason), + EmbedField(name="Admin", value=f"{admin.username}#{admin.discriminator} ({admin.mention})"), + ) + embed = build_embed( + title="User Unbanned", + description=f"{user.mention} was unbanned", + fields=fields, + color=get_command_color("unban"), + ) + embed.set_thumbnail(url=user.display_avatar.url) + embed.set_author(name=user.display_name, icon_url=user.display_avatar.url) + embed.set_footer(text=f"{user.username}#{user.discriminator} | {user.id}") + + return embed + + +def kick_embed(user: Member, admin: Member, reason: str, guild: Guild, dm: bool = False) -> Embed: + """ + Generate a kick embed. + + Args: + user: User to kick + admin: Admin to execute kick + reason: Reason for kick + guild: Guild to kick from + dm: If the embed should be a user embed + """ + fields = [ + EmbedField(name="Reason", value="A valid reason"), + EmbedField( + name="Admin", + value=f"{admin.username}#{admin.discriminator} ({admin.mention})", + ), + ] + if dm: + embed = build_embed( + title=f"You have been kicked from {guild.name}", + color=get_command_color("kick"), + fields=fields, + ) + embed.set_thumbnail(url=guild.icon.url) + else: + embed = build_embed( + title="User Kicked", + description=f"{user.mention} has been kicked", + fields=fields, + color=get_command_color("kick"), + ) + + embed.set_author(name=user.display_name, icon_url=user.display_avatar.url) + embed.set_footer(text=f"{user.username}#{user.discriminator} | {user.id}") + + return embed + + +def mute_embed(user: Member, admin: Member, reason: str, guild: Guild) -> Embed: + """ + Generate a mute embed. + + Args: + user: User to mute + admin: Admin to execute mute + reason: Reason for mute + """ + until = int(user.communication_disabled_until.timestamp()) + fields = ( + EmbedField(name="Reason", value=reason), + EmbedField(name="Until", value=f" ()"), + EmbedField( + name="Admin", + value=f"{admin.username}#{admin.discriminator} ({admin.mention})", + ), + ) + embed = build_embed( + title="User Muted", + description=f"{user.mention} has been muted", + fields=fields, + color=get_command_color("mute"), + ) + + embed.set_thumbnail(url=user.display_avatar.url) + embed.set_author(name=user.display_name, icon_url=user.display_avatar.url) + embed.set_footer(text=f"{user.username}#{user.discriminator} | {user.id}") + + return embed + + +def unmute_embed(user: Member, admin: Member, reason: str, guild: Guild) -> Embed: + """ + Generate an umute embed. + + Args: + user: User to unmute + admin: Admin to execute unmute + reason: Reason for unmute + """ + fields = ( + EmbedField(name="Reason", value=reason), + EmbedField( + name="Admin", + value=f"{admin.username}#{admin.discriminator} ({admin.mention})", + ), + ) + embed = build_embed( + title="User Unmuted", + description=f"{user.mention} has been unmuted", + fields=fields, + color=get_command_color("mute"), + ) + + embed.set_thumbnail(url=user.display_avatar.url) + embed.set_author(name=user.display_name, icon_url=user.display_avatar.url) + embed.set_footer(text=f"{user.username}#{user.discriminator} | {user.id}") + + return embed + + +def warning_embed(user: Member, reason: str, admin: Member) -> Embed: + """ + Generate a warning embed. + + Args: + user: User to warn + reason: Warning reason + admin: Admin who sent the warning + """ + fields = ( + EmbedField(name="Reason", value=reason, inline=False), + EmbedField(name="Admin", value=f"{admin.username}#{admin.discriminator} ({admin.mention})"), + ) + embed = build_embed( + title="Warning", + description=f"{user.mention} has been warned", + fields=fields, + color=get_command_color("warning"), + ) + embed.set_author(name=user.display_name, icon_url=user.display_avatar.url) + embed.set_footer(text=f"{user.username}#{user.discriminator} | {user.id}") + return embed diff --git a/jarvis/utils/embeds.py b/jarvis/utils/embeds.py deleted file mode 100644 index f972aed..0000000 --- a/jarvis/utils/embeds.py +++ /dev/null @@ -1,26 +0,0 @@ -"""JARVIS bot-specific embeds.""" -from naff.models.discord.embed import Embed, EmbedField -from naff.models.discord.user import Member - -from jarvis.branding import get_command_color -from jarvis.utils import build_embed - - -def warning_embed(user: Member, reason: str) -> Embed: - """ - Generate a warning embed. - - Args: - user: User to warn - reason: Warning reason - """ - fields = (EmbedField(name="Reason", value=reason, inline=False),) - embed = build_embed( - title="Warning", - description=f"{user.mention} has been warned", - fields=fields, - color=get_command_color("warning"), - ) - embed.set_author(name=user.display_name, icon_url=user.display_avatar.url) - embed.set_footer(text=f"{user.username}#{user.discriminator} | {user.id}") - return embed