discord-multipurpose-bot/commands/verification/code.js

145 lines
4.6 KiB
JavaScript
Raw Permalink Normal View History

const { SlashCommandBuilder } = require("discord.js");
const VerificationCode = require("../../models/VerificationCode");
const ServerSettings = require("../../models/ServerSettings");
module.exports = {
data: new SlashCommandBuilder()
.setName("code")
.setDescription("Verify your account with a verification code")
.addStringOption((option) =>
option
.setName("code")
.setDescription("Your verification code")
.setRequired(true)
),
async execute(interaction, client) {
// Fetch server settings from the database
const serverSettings = await ServerSettings.findOne({
guildId: interaction.guild.id,
});
if (!serverSettings) {
return interaction.reply({
content:
"Server settings have not been configured yet. Please contact an administrator.",
ephemeral: true,
});
}
// Ensure command is only used in the specified verification channel
const verificationChannelId = serverSettings.verificationChannelId;
if (interaction.channel.id !== verificationChannelId) {
return interaction.reply({
content: `This command can only be used in <#${verificationChannelId}> channel.`,
ephemeral: true,
});
}
const code = interaction.options.getString("code");
if (!code) {
return interaction.reply({
content:
"Please provide the verification code sent to your email address.",
ephemeral: true,
});
}
try {
// Find the verification code and user email in the database
const verificationEntry = await VerificationCode.findOne({
userId: interaction.user.id,
code,
});
if (!verificationEntry) {
return interaction.reply({
content: "Invalid or expired verification code. Please try again.",
ephemeral: true,
});
}
const guild = client.guilds.cache.get(interaction.guild.id);
if (!guild) {
console.error("Guild not found.");
return interaction.reply({
content: "The guild could not be found.",
ephemeral: true,
});
}
const member = guild.members.cache.get(interaction.user.id);
if (!member) {
console.error("Member not found in the guild.");
return interaction.reply({
content: "You are not a member of the guild.",
ephemeral: true,
});
}
const role = guild.roles.cache.find(
(r) => r.name === serverSettings.verifiedRoleName
);
if (!role) {
console.error(`Role "${serverSettings.verifiedRoleName}" not found.`);
return interaction.reply({
content: `The role "${serverSettings.verifiedRoleName}" could not be found.`,
ephemeral: true,
});
}
if (member.roles.cache.has(role.id)) {
return interaction.reply({
content: "You are already verified!",
ephemeral: true,
});
}
// Add the verified role to the member
await member.roles.add(role);
// Delete the verification code entry
await VerificationCode.deleteOne({ userId: interaction.user.id, code });
// Get the log channel and send a log message, including the user's email
const adminLogChannel = client.channels.cache.get(
serverSettings.logChannelId
);
if (adminLogChannel) {
await adminLogChannel.send({
content: `🎉 **Verification Success**\nUser: <@${interaction.user.id}> (${interaction.user.tag})\nEmail: ${verificationEntry.email}\nRole: ${role.name}`,
});
} else {
console.error("Admin log channel not found.");
}
// Get the general channel and send a welcome message
const generalChannel = client.channels.cache.get(
serverSettings.generalChannelId
);
if (generalChannel) {
await generalChannel.send({
content: `Welcome <@${interaction.user.id}> to the server! 🎉`,
});
} else {
console.error("General channel not found.");
}
return interaction.reply({
2024-09-02 21:35:05 +01:00
content: `Congratulations <@${interaction.user.id}>, you have been verified!`,
ephemeral: true,
});
} catch (err) {
console.error("Error processing verification code:", err);
return interaction.reply({
content:
"There was an error processing your verification. Please try again later.",
ephemeral: true,
});
}
},
};