/ src / commands / help.ts
help.ts
 1  import { AmethystCommand } from 'amethystjs';
 2  import { ApplicationCommandOptionType, EmbedBuilder } from 'discord.js';
 3  import { boolEmojis, buildLocalizations } from '../utils/functions';
 4  
 5  const locals = buildLocalizations('help');
 6  export default new AmethystCommand({
 7      name: 'help',
 8      description: 'Displays help page',
 9      options: [
10          {
11              name: 'command',
12              description: 'Command to show help',
13              required: false,
14              autocomplete: true,
15              type: ApplicationCommandOptionType.String,
16              nameLocalizations: locals.options.command.name,
17              descriptionLocalizations: locals.options.command.description
18          }
19      ],
20      cooldown: 5,
21      nameLocalizations: locals.name,
22      descriptionLocalizations: locals.description
23  }).setChatInputRun(({ interaction, options }) => {
24      const cmd: AmethystCommand = interaction.client.chatInputCommands.find(
25          (x) => x.options.name === options.getString('command')
26      );
27      if (cmd) {
28          return interaction.reply({
29              embeds: [
30                  new EmbedBuilder()
31                      .setTitle(
32                          interaction.client.langs.getText(interaction, 'help', 'commandEmbedTitle', {
33                              commandName: cmd.options.nameLocalizations[interaction.locale] ?? cmd.options.name
34                          })
35                      )
36                      .setDescription(cmd.options.descriptionLocalizations[interaction.locale] ?? cmd.options.description)
37                      .setFields(
38                          {
39                              name: interaction.client.langs.getText(interaction, 'help', 'permissionsName'),
40                              value: cmd.options.preconditions?.find((x) => x.name === 'adminIfNotAlone')
41                                  ? interaction.client.langs.getText(interaction, 'help', 'adminIfNotAlone')
42                                  : interaction.client.langs.getText(interaction, 'help', 'noPermission'),
43                              inline: false
44                          },
45                          {
46                              name: interaction.client.langs.getText(interaction, 'help', 'GuildOnly'),
47                              value: boolEmojis(
48                                  !(cmd.options.preconditions?.find((x) => x.name === 'GuildOnly') ?? false)
49                              ),
50                              inline: true
51                          }
52                      )
53                      .setColor('Orange')
54                      .setThumbnail(interaction.client.user.displayAvatarURL({ forceStatic: true }))
55              ]
56          });
57      }
58      const commands = interaction.client.chatInputCommands.map((x) => x.options);
59  
60      const embed = new EmbedBuilder()
61          .setTitle(interaction.client.langs.getText(interaction, 'help', 'help'))
62          .setDescription(
63              interaction.client.langs.getText(interaction, 'help', 'description', {
64                  list: commands
65                      .map(
66                          (c) =>
67                              `\`${c.nameLocalizations[interaction.locale] ?? c.name}\` : ${
68                                  c.descriptionLocalizations[interaction.locale] ?? c.description
69                              }`
70                      )
71                      .join('\n')
72              })
73          )
74          .setThumbnail(interaction.client.user.displayAvatarURL())
75          .setColor(interaction.client.user.hexAccentColor ?? 'Orange')
76          .setTimestamp()
77          .addFields({
78              name: interaction.client.langs.getText(interaction, 'help', 'more'),
79              value: interaction.client.langs.getText(interaction, 'help', 'moreValue'),
80              inline: false
81          });
82  
83      interaction.reply({ embeds: [embed] }).catch(() => {});
84  });