discord-multipurpose-bot/commands/moderation/warn.js

126 lines
3.8 KiB
JavaScript
Raw Normal View History

const {
SlashCommandBuilder,
EmbedBuilder,
PermissionsBitField,
} = require("discord.js");
const Warning = require("../../models/warning");
module.exports = {
data: new SlashCommandBuilder()
.setName("warn")
.setDescription("Issue a warning to a user")
.addUserOption((option) =>
option
.setName("user")
.setDescription("The user to warn")
.setRequired(true)
)
.addStringOption((option) =>
option
.setName("reason")
.setDescription("The reason for the warning")
.setRequired(true)
),
isModOnly: true,
async execute(interaction) {
try {
// Check if the user has the Manage Roles permission
if (
!interaction.member.permissions.has(
PermissionsBitField.Flags.ManageRoles
)
) {
await interaction.reply({
content: "You do not have permission to use this command!",
ephemeral: true,
});
return;
}
const user = interaction.options.getUser("user");
const reason = interaction.options.getString("reason");
const member = interaction.guild.members.cache.get(user.id);
// Save the warning to the database
const warning = new Warning({
userId: user.id,
guildId: interaction.guild.id,
reason: reason,
});
await warning.save();
const logChannelId = process.env.LOG_CHANNEL_ID;
const logChannel = interaction.guild.channels.cache.get(logChannelId);
if (!logChannel) {
await interaction.reply({
content: "Log channel not found!",
ephemeral: true,
});
return;
}
// Create and send the warning log to the log channel
const warnEmbed = new EmbedBuilder()
.setColor("#ffcc00")
.setTitle("User Warned")
.addFields(
{ name: "User", value: `${user.tag} (${user.id})`, inline: true },
{ name: "Reason", value: reason, inline: true },
{ name: "Issued By", value: interaction.user.tag, inline: true },
{ name: "Date", value: new Date().toLocaleString(), inline: true }
)
.setTimestamp()
.setFooter({
text: `Warned in ${interaction.guild.name}`,
iconURL: interaction.guild.iconURL(),
});
await logChannel.send({ embeds: [warnEmbed] });
// Send a DM to the user
try {
const dmEmbed = new EmbedBuilder()
.setColor("#ffcc00")
.setTitle("Warning Notice")
.setDescription(
`You have been warned in **${interaction.guild.name}**.`
)
.addFields(
{ name: "Reason", value: reason, inline: false },
{ name: "Issued By", value: interaction.user.tag, inline: false },
{ name: "Date", value: new Date().toLocaleString(), inline: false }
)
.setFooter({
text: `Please follow the rules of ${interaction.guild.name}`,
iconURL: interaction.guild.iconURL(),
})
.setTimestamp();
await user.send({ embeds: [dmEmbed] });
} catch (dmError) {
console.error("Error sending DM to user:", dmError);
await interaction.reply({
content: `Failed to send a DM to ${user.tag}.`,
ephemeral: true,
});
return;
}
// Notify the mod who issued the warning
await interaction.reply({
content: `Successfully warned ${user.tag} for: ${reason}`,
ephemeral: true,
});
} catch (error) {
console.error("Error executing warn command:", error);
await interaction.reply({
content: "There was an error while executing this command!",
ephemeral: true,
});
}
},
};