AI_botter/events/interactionCreate.js
DeathbotGaming 961f8b00d1
Ai-Bot
V1.0.0
2024-03-01 02:09:57 -09:00

674 lines
No EOL
36 KiB
JavaScript

const Discord = require('discord.js');
const chalk = require('chalk');
const ms = require('ms');
const { moderation } = require('../configs/moderation');
module.exports = async (client, interaction) => {
try {
// Command Handler
if (interaction.isChatInputCommand()) {
const command = client.SlashCommands.get(interaction.commandName);
if (command) {
try {
command.execute(client, interaction);
} catch (error) {
console.error(chalk.bold.redBright(error));
return await interaction.reply({ content: error.message.length > 4096 ? error.message.slice(0, 4093) + "..." : error.message, ephemeral: true }).catch(() => null);
};
};
// Auto Moderation
} else if (interaction.isButton()) {
const id = interaction.customId.split('-');
if (['deleteMessage', 'timeout', 'kick', 'ban'].includes(id[0])) {
await interaction.deferReply({ ephemeral: true });
let admin = false;
if (
interaction.member.roles.cache.hasAny(...moderation.AdminRoles)
|| moderation.AdminUsers.includes(interaction.member.id)
) admin = true;
if (id[0] === 'deleteMessage') {
const channel = client.channels.cache.get(id[1]);
if (admin || channel?.permissionsFor(interaction.member).has('ManageMessages')) {
if (channel.permissionsFor(interaction.guild.members.me).has('ManageMessages')) {
const message = await channel.messages.fetch({ message: id[2] }).catch(() => null);
if (message) {
try {
await message.delete();
if (interaction.message.components.length === 1) {
const embed = Discord.EmbedBuilder.from(interaction.message.embeds[0]);
embed.addFields({
name: 'Message Action:',
value: `Message deleted by ${interaction.user} \`(${interaction.user.id})\``
});
const row1 = Discord.ActionRowBuilder.from(interaction.message.components[0]);
const buttons = [];
for (const button of interaction.message.components[1].components) {
const newButton = Discord.ButtonBuilder.from(button).setDisabled();
buttons.push(newButton);
};
const row2 = new Discord.ActionRowBuilder()
.addComponents(buttons);
await interaction.message.edit({
embeds: [embed],
components: [row1, row2]
});
} else if (interaction.message.components.length > 1) {
const embed = Discord.EmbedBuilder.from(interaction.message.embeds[0]);
embed.addFields({
name: 'Message Action:',
value: `Message deleted by ${interaction.user} \`(${interaction.user.id})\``
});
const row1 = Discord.ActionRowBuilder.from(interaction.message.components[0]);
const buttons = [];
for (const button of interaction.message.components[1].components) {
const newButton = Discord.ButtonBuilder.from(button).setDisabled();
buttons.push(newButton);
};
const row2 = new Discord.ActionRowBuilder()
.addComponents(buttons);
await interaction.message.edit({
embeds: [embed],
components: [row1, row2]
});
};
await interaction.editReply({ content: 'The message has been deleted successfully.' });
} catch (error) {
await interaction.editReply({ content: `There was an error while deleting this message, *(${error.message})*` });
};
} else {
const row1 = Discord.ActionRowBuilder.from(interaction.message.components[0]);
const buttons = [];
for (const button of interaction.message.components[1].components) {
const newButton = Discord.ButtonBuilder.from(button).setDisabled();
buttons.push(newButton);
};
const row2 = new Discord.ActionRowBuilder()
.addComponents(buttons);
await interaction.message.edit({ components: [row1, row2] });
await interaction.editReply({ content: 'This message has already been deleted.' });
};
} else await interaction.editReply({ content: `I need Manage Message permission in ${channel}.` });
} else await interaction.editReply({ content: 'You can\'t use this button. you are not an Admin.' });
} else if (id[0] === 'timeout') {
if (admin || interaction.member.permissions.has('ModerateMembers')) {
const member = await interaction.guild.members.fetch(id[1]).catch(() => null);
if (member) {
try {
if (member.moderatable) {
if (
interaction.member.roles.highest.comparePositionTo(member.roles.highest) <= 0
&& interaction.user.id !== interaction.guild.ownerId
) return await interaction.editReply({ content: `You can't timeout ${member.user.tag}` });
const timeoutButton1 = new Discord.ButtonBuilder()
.setLabel(`60 Seconds`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('60s');
const timeoutButton2 = new Discord.ButtonBuilder()
.setLabel(`5 Mins`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('5m');
const timeoutButton3 = new Discord.ButtonBuilder()
.setLabel(`10 Mins`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('10m');
const timeoutButton4 = new Discord.ButtonBuilder()
.setLabel(`1 Hour`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('1h');
const timeoutButton5 = new Discord.ButtonBuilder()
.setLabel(`1 Day`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('1d');
const timeoutButton6 = new Discord.ButtonBuilder()
.setLabel(`3 Days`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('3d');
const timeoutButton7 = new Discord.ButtonBuilder()
.setLabel(`1 Week`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('1w');
const cancelButton = new Discord.ButtonBuilder()
.setLabel(`Cancel`)
.setStyle(Discord.ButtonStyle.Secondary)
.setCustomId('Cancel');
const row1 = new Discord.ActionRowBuilder()
.addComponents([
timeoutButton1,
timeoutButton2,
timeoutButton3,
timeoutButton4,
]);
const row2 = new Discord.ActionRowBuilder()
.addComponents([
timeoutButton5,
timeoutButton6,
timeoutButton7,
cancelButton,
]);
const reply = await interaction.editReply({
content: `Are you sure you want timeout ${member} (${member.user.tag}) if yes select one of the Timeout Durations buttons (Red ones)`,
components: [
row1,
row2
]
});
const collector = await reply.createMessageComponentCollector({ time: 60000 });
collector.on('collect', async (int) => {
if (int.customId === 'Cancel') {
await collector.stop("messageDelete");
await int.deferUpdate();
await interaction.deleteReply();
} else {
await collector.stop("timed out");
await int.deferUpdate();
const duration = ms(int.customId);
await member.timeout(duration, `Timed out by ${interaction.user.tag}`);
const embed = Discord.EmbedBuilder.from(interaction.message.embeds[0]);
embed.addFields({
name: 'Punish Action:',
value: `${member.user.tag} timed out by ${interaction.user} \`(${interaction.user.id})\` for ${ms(duration, { long: true })}.`
});
await interaction.message.edit({ embeds: [embed] }).catch(() => null);
await interaction.editReply({
content: `${member.user.tag} has been timed out successfully.`,
components: []
});
};
});
collector.on('end', async (collection, reason) => {
if (["messageDelete", "timed out"].includes(reason)) return;
await interaction.editReply({
components: [
new Discord.ActionRowBuilder().addComponents([
timeoutButton1.setDisabled(true),
timeoutButton2.setDisabled(true),
timeoutButton3.setDisabled(true),
timeoutButton4.setDisabled(true)
]),
new Discord.ActionRowBuilder().addComponents([
timeoutButton5.setDisabled(true),
timeoutButton6.setDisabled(true),
timeoutButton7.setDisabled(true),
cancelButton.setDisabled(true)
]),
]
});
});
} else await interaction.editReply({ content: `I can't timeout ${member.user.tag}.` });
} catch (error) {
await interaction.editReply({ content: `There was an error while timeouting ${member}, *(${error.message})*` });
};
} else {
const user = await client.users.fetch(id[1]).catch(() => null);
if (user) await interaction.editReply({ content: `${user.tag} is no longer in the server.` });
else await interaction.editReply({ content: 'This user is no longer in the server.' });
};
} else await interaction.editReply({ content: 'You can\'t use this button. you are not an Admin.' });
} else if (id[0] === 'kick') {
if (admin || interaction.member.permissions.has('KickMembers')) {
const member = await interaction.guild.members.fetch(id[1]).catch(() => null);
if (member) {
try {
if (member.kickable) {
if (
interaction.member.roles.highest.comparePositionTo(member.roles.highest) <= 0
&& interaction.user.id !== interaction.guild.ownerId
) return await interaction.editReply({ content: `You can't kick ${member.user.tag}` });
const kickButton = new Discord.ButtonBuilder()
.setLabel(`Kick ${member.user.username}`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('Kick');
const cancelButton = new Discord.ButtonBuilder()
.setLabel(`Cancel`)
.setStyle(Discord.ButtonStyle.Secondary)
.setCustomId('Cancel');
const row = new Discord.ActionRowBuilder()
.addComponents([kickButton, cancelButton]);
const reply = await interaction.editReply({
content: `Are you sure you want kick ${member} (${member.user.tag})`,
components: [row]
});
const collector = await reply.createMessageComponentCollector({ time: 60000 });
collector.on('collect', async (int) => {
if (int.customId === 'Kick') {
await collector.stop("kicked");
await int.deferUpdate();
await member.kick(`Kicked by ${interaction.user.tag}`);
const embed = Discord.EmbedBuilder.from(interaction.message.embeds[0]);
embed.addFields({
name: 'Punish Action:',
value: `${member.user.tag} kicked by ${interaction.user} \`(${interaction.user.id})\``
});
await interaction.message.edit({ embeds: [embed] }).catch(() => null);
await interaction.editReply({
content: `${member.user.tag} has been kicked successfully.`,
components: []
});
} else if (int.customId === 'Cancel') {
await collector.stop("messageDelete");
await int.deferUpdate();
await interaction.deleteReply();
};
});
collector.on('end', async (collection, reason) => {
if (["messageDelete", "kicked"].includes(reason)) return;
await interaction.editReply({
components: [new Discord.ActionRowBuilder().addComponents([
kickButton.setDisabled(true),
cancelButton.setDisabled(true)
])]
});
});
} else await interaction.editReply({ content: `I can't kick ${member.user.tag}.` });
} catch (error) {
await interaction.editReply({ content: `There was an error while kicking ${member}, *(${error.message})*` });
};
} else {
const user = await client.users.fetch(id[1]).catch(() => null);
if (user) await interaction.editReply({ content: `${user.tag} is no longer in the server.` });
else await interaction.editReply({ content: 'This user is no longer in the server.' });
};
} else await interaction.editReply({ content: 'You can\'t use this button. you are not an Admin.' });
} else if (id[0] === 'ban') {
if (admin || interaction.member.permissions.has('BanMembers')) {
const member = await interaction.guild.members.fetch(id[1]).catch(() => null);
if (member) {
try {
if (member.bannable) {
if (
interaction.member.roles.highest.comparePositionTo(member.roles.highest) <= 0
&& interaction.user.id !== interaction.guild.ownerId
) return await interaction.editReply({ content: `You can't ban ${member.user.tag}` });
const banButton1 = new Discord.ButtonBuilder()
.setLabel(`Don't Delete Any`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('0');
const banButton2 = new Discord.ButtonBuilder()
.setLabel(`Previous Hour`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('1h');
const banButton3 = new Discord.ButtonBuilder()
.setLabel(`Previous 6 Hours`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('6h');
const banButton4 = new Discord.ButtonBuilder()
.setLabel(`Previous 12 Hours`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('12h');
const banButton5 = new Discord.ButtonBuilder()
.setLabel(`Previous 24 Hours`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('24h');
const banButton6 = new Discord.ButtonBuilder()
.setLabel(`Previous 3 Days`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('3d');
const banButton7 = new Discord.ButtonBuilder()
.setLabel(`Previous 7 Days`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('7d');
const cancelButton = new Discord.ButtonBuilder()
.setLabel(`Cancel`)
.setStyle(Discord.ButtonStyle.Secondary)
.setCustomId('Cancel');
const row1 = new Discord.ActionRowBuilder()
.addComponents([
banButton1,
banButton2,
banButton3,
banButton4,
]);
const row2 = new Discord.ActionRowBuilder()
.addComponents([
banButton5,
banButton6,
banButton7,
cancelButton,
]);
const reply = await interaction.editReply({
content: `Are you sure you want ban ${member} (${member.user.tag}) if yes select one of the Delete Message History buttons (Red ones)`,
components: [
row1,
row2
]
});
const collector = await reply.createMessageComponentCollector({ time: 60000 });
collector.on('collect', async (int) => {
if (int.customId === 'Cancel') {
await collector.stop("messageDelete");
await int.deferUpdate();
await interaction.deleteReply();
} else {
await collector.stop("banned");
await int.deferUpdate();
const duration = ms(int.customId);
await member.ban({ deleteMessageSeconds: duration / 1000, reason: `Banned by ${interaction.user.tag}` });
const embed = Discord.EmbedBuilder.from(interaction.message.embeds[0]);
let fieldValue = `${member.user.tag} banned by ${interaction.user} \`(${interaction.user.id})\` and all their messages in the last ${ms(duration, { long: true })} were deleted.`;
if (duration === 0) fieldValue = `${member.user.tag} banned by ${interaction.user} \`(${interaction.user.id})\``;
embed.addFields({
name: 'Punish Action:',
value: fieldValue
});
await interaction.message.edit({ embeds: [embed] }).catch(() => null);
await interaction.editReply({
content: `${member.user.tag} has been banned successfully.`,
components: []
});
};
});
collector.on('end', async (collection, reason) => {
if (["messageDelete", "banned"].includes(reason)) return;
await interaction.editReply({
components: [
new Discord.ActionRowBuilder().addComponents([
banButton1.setDisabled(true),
banButton2.setDisabled(true),
banButton3.setDisabled(true),
banButton4.setDisabled(true)
]),
new Discord.ActionRowBuilder().addComponents([
banButton5.setDisabled(true),
banButton6.setDisabled(true),
banButton7.setDisabled(true),
cancelButton.setDisabled(true)
]),
]
});
});
} else await interaction.editReply({ content: `I can't ban ${member.user.tag}.` });
} catch (error) {
await interaction.editReply({ content: `There was an error while banning ${member}, *(${error.message})*` });
};
} else {
const user = await client.users.fetch(id[1]).catch(() => null);
try {
const fetchedBan = await interaction.guild.bans.fetch(user.id).catch(() => null);
if (!fetchedBan) {
const banButton1 = new Discord.ButtonBuilder()
.setLabel(`Don't Delete Any`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('0');
const banButton2 = new Discord.ButtonBuilder()
.setLabel(`Previous Hour`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('1h');
const banButton3 = new Discord.ButtonBuilder()
.setLabel(`Previous 6 Hours`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('6h');
const banButton4 = new Discord.ButtonBuilder()
.setLabel(`Previous 12 Hours`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('12h');
const banButton5 = new Discord.ButtonBuilder()
.setLabel(`Previous 24 Hours`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('24h');
const banButton6 = new Discord.ButtonBuilder()
.setLabel(`Previous 3 Days`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('3d');
const banButton7 = new Discord.ButtonBuilder()
.setLabel(`Previous 7 Days`)
.setStyle(Discord.ButtonStyle.Danger)
.setCustomId('7d');
const cancelButton = new Discord.ButtonBuilder()
.setLabel(`Cancel`)
.setStyle(Discord.ButtonStyle.Secondary)
.setCustomId('Cancel');
const row1 = new Discord.ActionRowBuilder()
.addComponents([
banButton1,
banButton2,
banButton3,
banButton4,
]);
const row2 = new Discord.ActionRowBuilder()
.addComponents([
banButton5,
banButton6,
banButton7,
cancelButton,
]);
const reply = await interaction.editReply({
content: `Are you sure you want ban ${user} (${user.tag}) if yes select one of the Delete Message History buttons (Red ones)`,
components: [
row1,
row2
]
});
const collector = await reply.createMessageComponentCollector({ time: 60000 });
collector.on('collect', async (int) => {
if (int.customId === 'Cancel') {
await collector.stop("messageDelete");
await int.deferUpdate();
await interaction.deleteReply();
} else {
await collector.stop("banned");
await int.deferUpdate();
const duration = ms(int.customId);
await interaction.guild.bans.create(id[1], { deleteMessageSeconds: duration / 1000, reason: `Banned by ${interaction.user.tag}` });
const embed = Discord.EmbedBuilder.from(interaction.message.embeds[0]);
let fieldValue = `${user ? user.tag : id[1]} banned by ${interaction.user} \`(${interaction.user.id})\` and all their messages in the last ${ms(duration, { long: true })} were deleted.`;
if (duration === 0) fieldValue = `${user ? user.tag : id[1]} banned by ${interaction.user} \`(${interaction.user.id})\``;
embed.addFields({
name: 'Punish Action:',
value: fieldValue
});
await interaction.message.edit({ embeds: [embed] }).catch(() => null);
await interaction.editReply({
content: `${user ? user.tag : id[1]} has been banned successfully.`,
components: []
});
};
});
collector.on('end', async (collection, reason) => {
if (["messageDelete", "banned"].includes(reason)) return;
await interaction.editReply({
components: [
new Discord.ActionRowBuilder().addComponents([
banButton1.setDisabled(true),
banButton2.setDisabled(true),
banButton3.setDisabled(true),
banButton4.setDisabled(true)
]),
new Discord.ActionRowBuilder().addComponents([
banButton5.setDisabled(true),
banButton6.setDisabled(true),
banButton7.setDisabled(true),
cancelButton.setDisabled(true)
]),
]
});
});
} else await interaction.editReply({ content: `${fetchedBan.user.tag} has been already banned.` });
} catch (error) {
await interaction.editReply({ content: `There was an error while banning this user, *(${error.message})*` });
};
};
} else await interaction.editReply({ content: 'You can\'t use this button. you are not an Admin.' });
};
};
};
} catch (error) {
console.error(chalk.bold.redBright(error));
};
};