Move to static embeds in own package

This commit is contained in:
Zeva Rose 2022-10-03 20:04:30 -06:00
parent c1806dffcf
commit 46d42114ba
10 changed files with 272 additions and 187 deletions

View file

@ -26,9 +26,7 @@ class MessageEventMixin:
autopurge = await Autopurge.find_one(q(guild=message.guild.id, channel=message.channel.id))
if autopurge:
if not message.author.has_permission(Permissions.ADMINISTRATOR):
self.logger.debug(
f"Autopurging message {message.guild.id}/{message.channel.id}/{message.id}"
)
self.logger.debug(f"Autopurging message {message.guild.id}/{message.channel.id}/{message.id}")
await message.delete(delay=autopurge.delay)
async def autoreact(self, message: Message) -> None:
@ -40,9 +38,7 @@ class MessageEventMixin:
)
)
if autoreact:
self.logger.debug(
f"Autoreacting to message {message.guild.id}/{message.channel.id}/{message.id}"
)
self.logger.debug(f"Autoreacting to message {message.guild.id}/{message.channel.id}/{message.id}")
for reaction in autoreact.reactions:
await message.add_reaction(reaction)
if autoreact.thread:
@ -92,9 +88,7 @@ class MessageEventMixin:
reason="Sent an invite link",
user=message.author.id,
).commit()
tracker = warnings_tracker.labels(
guild_id=message.guild.id, guild_name=message.guild.name
)
tracker = warnings_tracker.labels(guild_id=message.guild.id, guild_name=message.guild.name)
tracker.inc()
embed = warning_embed(message.author, "Sent an invite link")
try:
@ -118,9 +112,7 @@ class MessageEventMixin:
- (1 if message.author.id in message._mention_ids else 0) # noqa: W503
> massmention.value # noqa: W503
):
self.logger.debug(
f"Massmention threshold on {message.guild.id}/{message.channel.id}/{message.id}"
)
self.logger.debug(f"Massmention threshold on {message.guild.id}/{message.channel.id}/{message.id}")
expires_at = datetime.now(tz=timezone.utc) + timedelta(hours=24)
await Warning(
active=True,
@ -131,9 +123,7 @@ class MessageEventMixin:
reason="Mass Mention",
user=message.author.id,
).commit()
tracker = warnings_tracker.labels(
guild_id=message.guild.id, guild_name=message.guild.name
)
tracker = warnings_tracker.labels(guild_id=message.guild.id, guild_name=message.guild.name)
tracker.inc()
embed = warning_embed(message.author, "Mass Mention")
try:
@ -186,9 +176,7 @@ class MessageEventMixin:
break
if role_in_rolepings and user_missing_role and not user_is_admin and not user_has_bypass:
self.logger.debug(
f"Rolepinged role in {message.guild.id}/{message.channel.id}/{message.id}"
)
self.logger.debug(f"Rolepinged role in {message.guild.id}/{message.channel.id}/{message.id}")
expires_at = datetime.now(tz=timezone.utc) + timedelta(hours=24)
await Warning(
active=True,
@ -199,9 +187,7 @@ class MessageEventMixin:
reason="Pinged a blocked role/user with a blocked role",
user=message.author.id,
).commit()
tracker = warnings_tracker.labels(
guild_id=message.guild.id, guild_name=message.guild.name
)
tracker = warnings_tracker.labels(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")
try:
@ -226,9 +212,7 @@ class MessageEventMixin:
reason="Phishing URL",
user=message.author.id,
).commit()
tracker = warnings_tracker.labels(
guild_id=message.guild.id, guild_name=message.guild.name
)
tracker = warnings_tracker.labels(guild_id=message.guild.id, guild_name=message.guild.name)
tracker.inc()
embed = warning_embed(message.author, "Phishing URL")
try:
@ -239,9 +223,7 @@ class MessageEventMixin:
await message.delete()
except Exception:
self.logger.warn("Failed to delete malicious message")
tracker = malicious_tracker.labels(
guild_id=message.guild.id, guild_name=message.guild.name
)
tracker = malicious_tracker.labels(guild_id=message.guild.id, guild_name=message.guild.name)
tracker.inc()
return True
return False
@ -275,9 +257,7 @@ class MessageEventMixin:
reason="Unsafe URL",
user=message.author.id,
).commit()
tracker = warnings_tracker.labels(
guild_id=message.guild.id, guild_name=message.guild.name
)
tracker = warnings_tracker.labels(guild_id=message.guild.id, guild_name=message.guild.name)
tracker.inc()
reasons = ", ".join(f"{m['source']}: {m['type']}" for m in data["matches"])
embed = warning_embed(message.author, reasons)
@ -289,9 +269,7 @@ class MessageEventMixin:
await message.delete()
except Exception:
self.logger.warn("Failed to delete malicious message")
tracker = malicious_tracker.labels(
guild_id=message.guild.id, guild_name=message.guild.name
)
tracker = malicious_tracker.labels(guild_id=message.guild.id, guild_name=message.guild.name)
tracker.inc()
return True
return False
@ -347,9 +325,7 @@ class MessageEventMixin:
icon_url=after.author.display_avatar.url,
url=after.jump_url,
)
embed.set_footer(
text=f"{after.author.username}#{after.author.discriminator} | {after.author.id}"
)
embed.set_footer(text=f"{after.author.username}#{after.author.discriminator} | {after.author.id}")
await channel.send(embeds=embed)
except Exception as e:
self.logger.warning(
@ -422,13 +398,8 @@ class MessageEventMixin:
url=message.jump_url,
)
embed.set_footer(
text=(
f"{message.author.username}#{message.author.discriminator} | "
f"{message.author.id}"
)
text=(f"{message.author.username}#{message.author.discriminator} | " f"{message.author.id}")
)
await channel.send(embeds=embed)
except Exception as e:
self.logger.warning(
f"Failed to process edit {message.guild.id}/{message.channel.id}/{message.id}: {e}"
)
self.logger.warning(f"Failed to process edit {message.guild.id}/{message.channel.id}/{message.id}: {e}")

View file

@ -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(

View file

@ -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,

View file

@ -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"<t:{ts}:F> <t:{ts}:R>"),
],
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()
@ -213,13 +201,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)

View file

@ -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")

View file

@ -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]

View file

@ -153,7 +153,7 @@ class RemindmeCog(Extension):
EmbedField(name="Message", value=message),
EmbedField(
name="When",
value=f"<t:{int(remind_at.timestamp())}:F>",
value=f"<t:{int(remind_at.timestamp())}:F> (<t:{int(remind_at.timestamp())}:R>)",
inline=False,
),
],
@ -182,7 +182,7 @@ class RemindmeCog(Extension):
if reminder.private and isinstance(ctx.channel, GuildChannel):
fields.embed(
EmbedField(
name=f"<t:{int(reminder.remind_at.timestamp())}:F>",
name=f"<t:{int(reminder.remind_at.timestamp())}:F> (<t:{int(reminder.remind_at.timestamp())}:R>)",
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"<t:{int(reminder.remind_at.timestamp())}:F>",
name=f"<t:{int(reminder.remind_at.timestamp())}:F> (<t:{int(reminder.remind_at.timestamp())}:R>)",
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"<t:{ts}:F> (<t:{ts}:R>)")]
fields = [
EmbedField(name="Remind At", value=f"<t:{ts}:F> (<t:{ts}:R>)"),
EmbedField(name="Created At", value=f"<t:{cts}:F> (<t:{cts}:R>)"),
]
embed = build_embed(
title="You have a reminder!", description=reminder.message, fields=fields

View file

@ -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(

208
jarvis/embeds/admin.py Normal file
View file

@ -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"<t:{until}:F> (<t:{until}:R>)"),
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

View file

@ -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