UNPKG

kakashi-self-handler

Version:
266 lines (245 loc) 9.67 kB
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;