kakashi-self-handler
Version:
package handler for discord bot
266 lines (245 loc) • 9.67 kB
JavaScript
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, messageLink } = require("discord.js");
async function handleMessage(message, prefix, client) {
const { scommands, aliases, cooldowns, topgg } = client;
if (!message.content.startsWith(prefix)) return;
const cmd = message.content.slice(prefix.length).trim().split(/ +/g);
const cd = cmd.shift();
const command = scommands.get(cd) || aliases.get(cd);
const commandName = command?.name;
if (!command) return;
try {
const cooldownKey = `${message.author.id}-${commandName || cd}`;
const userCooldown = cooldowns.get(cooldownKey);
if (userCooldown && userCooldown > Date.now()) {
return sendCooldownEmbed(message, client, userCooldown).catch(handleError);
}
const { cooldownDuration, voteOnly } = findCommandAndCooldown(command);
setCooldown(cooldowns, cooldownKey, cooldownDuration);
if (!checkTopGG(topgg, commandName, message)) {
return sendTopGGError(message).catch(handleError);
}
if (voteOnly && !await topgg.hasVoted(message.author.id)) {
return sendVoteEmbed(message, client).catch(handleError);
}
if (!checkBotPerms(command.botPerms, message)) {
return sendPermsError(message, commandName, command.botPerms).catch(handleError)
}
if (!checkUserPerms(command.userPerms, message)) {
return sendUPermsError(message, commandName, command.userPerms).catch(handleError)
}
executeCommand(command, message, client).catch(handleError);
} catch (err) {
console.error('Error handling message:', err);
}
}
function findCommandAndCooldown(command) {
let cooldownDuration = 0;
let voteOnly = null;
cooldownDuration = parseInt(command?.cooldown, 10) || 0;
voteOnly = command?.voteonly;
return { cooldownDuration, voteOnly };
}
function setCooldown(cooldowns, key, duration) {
const expirationTime = Date.now() + duration * 1000;
cooldowns.set(key, expirationTime);
setTimeout(() => {
cooldowns.delete(key);
}, duration * 1000);
}
function checkTopGG(topgg, commandName, message) {
if (topgg && !topgg.hasVoted(message.author.id)) {
return false;
}
return true;
}
function checkBotPerms(botPerms, message) {
if (!message.guild.members.me.permissions.has(
botPerms || ["SendMessages"]
)) {
return false;
}
return true;
}
function checkUserPerms(userPerms, message) {
if (!message.member.permissions.has(
userPerms || ["SendMessages"]
)) {
return false;
}
return true;
}
async function sendCooldownEmbed(message, client, userCooldown) {
const remainingTime = (userCooldown - Date.now()) / 1000;
const cooldownEmbed = new EmbedBuilder()
.setColor('Red')
.setFooter({ text: 'Info: The cooldown is for preventing spam usage of commands', iconURL: 'https://cdn.discordapp.com/emojis/1159095895640522822.gif' })
.setDescription(`You are on cooldown. Please wait ${remainingTime.toFixed(1)} seconds.`);
return message.reply({ embeds: [cooldownEmbed] });
}
async function sendTopGGError(message) {
return message.reply({
content: `Something went wrong with topgg. If you are not an admin, please contact them.`,
ephemeral: true
});
}
async function sendPermsError(message, commandName, userPerms) {
const embed = new EmbedBuilder()
.setDescription(`**Alert :** I donot have \`${userPerms}\` permission to run ${commandName} command.`)
.setColor('Red')
return message.reply({
embeds: [embed]
});
}
async function sendUPermsError(message, commandName, userPerms) {
const embed = new EmbedBuilder()
.setDescription(`**Alert :** You donot have \`${userPerms}\` permission to run ${commandName} command.`)
.setColor('Red')
return message.reply({
embeds: [embed]
});
}
async function sendVoteEmbed(message, kakashi) {
let voteEmbed;
let row;
let emoji;
let demoji;
if (kakashi.support.button.emoji) {
emoji = kakashi.support.button.emoji
} else {
emoji = '1158760255476486225'
}
if (kakashi.vote.button.emoji) {
demoji = kakashi.vote.button.emoji
} else {
demoji = '1230589784733257789'
}
const voteButton = new ButtonBuilder()
.setLabel('Vote To Unlock')
.setStyle(ButtonStyle.Link)
.setEmoji(`${demoji}`)
.setURL(kakashi.vote.url);
const supportButton = new ButtonBuilder()
.setLabel('Support Server')
.setStyle(ButtonStyle.Link)
.setEmoji(`${emoji}`)
.setURL(`${kakashi.support.server}`);
let eemoji
if (kakashi.vote.embed.emoji) {
eemoji = kakashi.vote.embed.emoji
} else {
eemoji = `<:error:1230860807252873306>`
}
const description = kakashi.vote.embed.message || `${eemoji} **Vote:** Please vote first before using this command`;
if (kakashi.support.button.enabled) {
row = new ActionRowBuilder().addComponents(voteButton, supportButton);
} else {
row = new ActionRowBuilder().addComponents(voteButton);
}
if (kakashi.vote.embed && kakashi.vote.button) {
voteEmbed = new EmbedBuilder()
.setColor('Red')
.setFooter({ text: 'Note: Don\'t worry, the vote will help us and it\'s free', iconURL: 'https://cdn.discordapp.com/emojis/1159095895640522822.gif' })
.setDescription(description);
return message.reply({
embeds: [voteEmbed],
components: [row],
});
} else if (kakashi.vote.embed.enabled) {
const voteEmbed = new EmbedBuilder()
.setColor('Red')
.setFooter({ text: 'Note: Don\'t worry, the vote will help us and it\'s free', iconURL: 'https://cdn.discordapp.com/emojis/1159095895640522822.gif' })
.setDescription(description);
return message.reply({
embeds: [voteEmbed],
});
} else if (kakashi.vote.button) {
return message.reply({
content: description,
components: [row],
});
} else {
return message.reply({
content: description,
});
}
}
async function sendCooldownEmbed(message, kakashi, userCooldown) {
const remainingTime = (userCooldown - Date.now()) / 1000;
let m;
let d = kakashi.cooldown.embed.message
if (d && d.includes('remainingtime')) {
m = d.replace('remainingtime', remainingTime.toFixed(1))
} else {
m = d;
}
const description = m || `<:error:1230860807252873306> **Cooldown:** You are on cooldown please wait ${remainingTime.toFixed(1)} seconds`;
let embed;
if (kakashi.cooldown.embed.enabled) {
embed = new EmbedBuilder()
.setDescription(`${description}`)
.setColor('Red')
}
if (kakashi.cooldown.embed.enabled && kakashi.cooldown.embed.footer) {
embed.setFooter({ text: `Info : The cooldown is for preventing spam usage of commands/buttons`, iconURL: 'https://images-ext-1.discordapp.net/external/cpRhajDvGdN-7vpA4v_auFKPbBX9emkfZw0F1i3MLl4/https/cdn.discordapp.com/emojis/1159095895640522822.gif' })
}
if (kakashi.cooldown.embed.enabled) {
if (kakashi.cooldown.button) {
if (kakashi.support.button.emoji) {
emoji = kakashi.support.button.emoji
} else {
emoji = '1158760255476486225'
}
const supportButton = new ButtonBuilder()
.setLabel('Support Server')
.setStyle(ButtonStyle.Link)
.setEmoji(`${emoji}`)
.setURL(`${kakashi.support.server}`);
const row = new ActionRowBuilder().addComponents(supportButton);
return message.reply({
embeds: [embed],
components: [row],
})
} else {
return message.reply({
embeds: [embed],
})
}
} else {
if (kakashi.support.button) {
if (kakashi.support.button.emoji) {
emoji = kakashi.support.button.emoji
} else {
emoji = '1158760255476486225'
}
const supportButton = new ButtonBuilder()
.setLabel('Support Server')
.setStyle(ButtonStyle.Link)
.setEmoji(`${emoji}`)
.setURL(`${kakashi.support.server}`);
const row = new ActionRowBuilder().addComponents(supportButton);
return message.reply({
content: `${description}`,
components: [row],
})
} else {
return message.reply({
content: `${description}`,
})
}
}
}
async function executeCommand(command, message, client) {
try {
await command.execute(message, client);
} catch (error) {
console.error('Error executing command:', error);
await message.reply({
content: 'Something went wrong while executing this command.',
ephemeral: true,
});
}
}
function handleError(error) {
console.error('Error replying to interaction:', error);
}
module.exports = handleMessage;