nyx/command/Information/help.js

205 lines
6.4 KiB
JavaScript
Raw Normal View History

2023-04-02 14:12:53 +02:00
const {
EmbedBuilder,
Client,
CommandInteraction,
ActionRowBuilder,
StringSelectMenuBuilder,
ComponentType,
} = require("discord.js");
const Utils = require("../../util/functions/function");
2021-09-06 12:38:25 +02:00
module.exports = {
name: "help",
usage: "(Command/Category)",
description: "Shows all available bot commands",
category: "Information",
options: [
{
type: 3,
name: "command",
description: "The command you want to see",
required: false,
},
],
2023-04-02 14:12:53 +02:00
/**
*
* @param {Client} client
* @param {CommandInteraction} interaction
* @param {String[]} args
* @param {Utils} utils
*/
2021-09-06 12:38:25 +02:00
run: async (client, interaction, args, utils) => {
if (!args[0]) {
await interaction.deleteReply();
const emoji = {
CODM: "<a:codm:897030768793104385>",
2023-04-02 14:12:53 +02:00
APEX: "🎆",
Config: "<a:config:896990033561669762>",
Information: "<a:information:894962394932064346>",
Utilities: "<a:utilites:897233087941988392>",
2021-09-06 12:38:25 +02:00
};
const directories = [
...new Set(client.slashCommands.map(cmd => cmd.directory)),
];
const categories = directories.map(dir => {
if (dir == "Owner") return;
const getCmds = client.slashCommands
.filter(c => c.directory == dir)
.map(cmd => {
return {
name: cmd.name || "No command name",
};
});
return {
directory: dir,
commands: getCmds,
};
});
2023-04-02 14:12:53 +02:00
const embed = new EmbedBuilder()
.setTitle(`**NYX's Commands**`)
2021-09-06 12:38:25 +02:00
.setDescription(`Please choose a category in the dropdown menu`)
.setColor(client.color)
.setTimestamp()
.addFields(
{
name: ":link: **Invite Me**",
2023-04-02 14:12:53 +02:00
value: `[Click Here](${utils.inviteLink(client.user.id)})`,
inline: true,
},
{
name: "<:support1:867093614403256350> **Need Help ?**",
2023-04-02 14:12:53 +02:00
value: `[Support Server](${client.invite})`,
inline: true,
},
{
name: "<:YouTube:841186450497339412> **Video Guide**",
value: `[How to use Slash Coammands](https://youtu.be/YSKDu1gKntY)`,
inline: true,
},
{
name: `<:nyx_description:897379659665264650> Documentation`,
value: `[Click here](${client.docs})`,
inline: true,
},
{
name: "<a:booster:896527475063025704> **Premium**",
value: `You can either boost support server or subscribe to developer's team [Ko-Fi](https://ko-fi.com/cathteam) or gift a nitro to one of the developer team.`,
inline: false,
}
2021-09-06 12:38:25 +02:00
)
.setURL(client.docs)
.setThumbnail(
"https://media.discordapp.net/attachments/896078559293104128/896392631565828146/nyx_logo_transparent.webp"
2021-09-06 12:38:25 +02:00
)
.setFooter({
text: `Requested by ${interaction.user.tag}`,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
});
2021-09-06 12:38:25 +02:00
const components = state => [
2023-04-02 14:12:53 +02:00
new ActionRowBuilder().addComponents(
new StringSelectMenuBuilder()
2021-09-06 12:38:25 +02:00
.setCustomId("help-menu")
.setPlaceholder(`Please select a category`)
.setDisabled(state)
.addOptions(
categories.map(cmd => {
return {
label: cmd.directory,
value: cmd.directory,
description: `Commands from ${cmd.directory} category`,
emoji: emoji[cmd.directory] || null,
};
})
)
),
];
const msg = await interaction.channel.send({
embeds: [embed],
components: components(false),
});
const filter = m => m.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({
filter,
2023-04-02 14:12:53 +02:00
componentType: ComponentType.StringSelect,
2021-09-06 12:38:25 +02:00
time: 60000,
});
collector.on("collect", async interaction => {
const [directory] = interaction.values;
const category = categories.find(u => u.directory === directory);
2023-04-02 14:12:53 +02:00
const newembed = new EmbedBuilder()
2021-09-06 12:38:25 +02:00
.setTitle(
`${emoji[directory]} ${directory} Commands ${emoji[directory]}`
2021-09-06 12:38:25 +02:00
)
.setTimestamp()
.setColor(client.color)
2022-03-02 15:37:01 +01:00
.setFooter({
text: `Please use /help (Command Name) for more details`,
})
2021-09-06 12:38:25 +02:00
.setDescription(
category.commands
.map(cmd => {
return [`\`${cmd.name}\``];
})
.join(", ")
);
interaction.reply({ embeds: [newembed] });
});
collector.on("end", () => msg.edit({ components: components(true) }));
} else {
const command = client.slashCommands.get(args[0].toLowerCase());
if (!command) {
2023-04-02 14:12:53 +02:00
interaction.editReply({
content: `There isn't any command named "${args[0]}"`,
2021-09-06 12:38:25 +02:00
});
} else {
2021-09-21 01:51:56 +02:00
if (command.UserPerms && Array.isArray(command.UserPerms)) {
UserPermissions = command.UserPerms;
} else {
UserPermissions = [command.UserPerms ? command.UserPerms : ""];
}
2023-04-02 14:12:53 +02:00
const fields = [];
const embed = new EmbedBuilder()
2021-09-06 12:38:25 +02:00
.setTitle(`"${command.name}" command details`)
2023-04-02 14:12:53 +02:00
.addFields([
{
name: "**Command**:",
value: command.name ? `\`${command.name}\`` : "N/A",
},
]);
2022-03-02 15:37:01 +01:00
if (command.usage)
2023-04-02 14:12:53 +02:00
fields.push({
name: "**Usage**:",
value: `\`/${command.name} ${command.usage}\``,
});
else
fields.push({
name: "**Usage**:",
value: `\`/${command.name}\``,
});
2022-03-02 15:37:01 +01:00
if (command.description)
2023-04-02 14:12:53 +02:00
fields.push({
name: "**Description**:",
value: command.description,
});
2022-03-02 15:37:01 +01:00
if (command.timeout)
2023-04-02 14:12:53 +02:00
fields.push({
name: "**Cooldown**:",
value: utils.timer(command.timeout),
});
2021-09-06 12:38:25 +02:00
embed
2022-03-02 15:37:01 +01:00
.setFooter({
text: `Requested by ${interaction.user.tag}`,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
})
2021-09-06 12:38:25 +02:00
.setTimestamp()
2023-04-02 14:12:53 +02:00
.addFields(fields)
2021-09-06 12:38:25 +02:00
.setURL(client.web)
.setColor(client.color);
2023-04-05 00:06:53 +02:00
interaction.followUp({ embeds: [embed] });
2021-09-06 12:38:25 +02:00
}
}
},
};