【问题标题】:Discord.js smart help embedDiscord.js 智能帮助嵌入
【发布时间】:2021-08-19 15:41:10
【问题描述】:

我正在尝试制作一个帮助嵌入,为我的命令文件文件夹中的每个文件创建一个新字段。一直报错,不知道怎么解决。

这是我的代码:

const Discord = require('discord.js');
const pagination = require('discord.js-pagination')
const { prefix } = require('../config.json').prefix;

module.exports = {
    name: "help", //.ping
    description: "Help command.",
    use: `${prefix}help`,

    async run (bot, message, args) {
        const embed1 = new Discord.MessageEmbed()
            .setTitle('Help')
            .setDescription(`Prefix: ${prefix}`)
            for (const thing of require('../commands')) {
                .addField();
            }
    }
}

【问题讨论】:

    标签: javascript node.js discord discord.js embed


    【解决方案1】:

    您似乎正在使用discordjs.guide site 上提供的设置。这意味着,您已经在client.commandsbot.commands 上拥有一组可用的命令。它包含您需要的所有数据。

    集合有一个返回新数组的map() 方法。您可以使用它来遍历commands 并返回一个新的field object(一个带有namevalue 属性的对象)。拥有此数组后,您可以使用.addFields 方法(与.addField 不同)接受字段数组。

    这样做的问题是字段的最大数量是 25。如果您有超过 25 个命令,则需要将它们发送到不同的嵌入中。您已经导入了discord.js-pagination,它允许您提供一个嵌入数组,然后它会处理所有困难的工作。但是您仍然需要确保字段不超过 25 个。

    要解决这个问题,您可以将原始数组分块为最多包含 25 个项目的新数组。我已经为您编写了一个辅助函数来执行此操作。它返回一个数组数组。

    现在,您可以遍历块并为每个块创建一个新的嵌入对象并设置分页。

    查看下面的代码:

    const Discord = require('discord.js');
    const pagination = require('discord.js-pagination');
    const { prefix } = require('../config.json').prefix;
    
    module.exports = {
      name: 'help', //.ping
      description: 'Help command.',
      use: `${prefix}help`,
    
      async run(bot, message, args) {
        const MAX_FIELDS = 25;
        // iterate over the commands and create field objects
        const fields = bot.commands.map((command) => ({
          name: 'Command',
          value: `${command.name}\n${command.description}\n${command.use}`,
        }));
    
        // if there is less than 25 fields, you can safely send the embed
        // in a single message
        if (fields.length <= MAX_FIELDS)
          return message.channel.send(
            new Discord.MessageEmbed()
              .setTitle('Help')
              .setDescription(`Prefix: ${prefix}`)
              .addFields(fields),
          );
    
        // if there are more, you need to create chunks w/ max 25 fields
        const chunks = chunkify(fields, MAX_FIELDS);
        // an array of embeds used by `discord.js-pagination`
        const pages = [];
    
        chunks.forEach((chunk) => {
          // create a new embed for each 25 fields
          pages.push(
            new Discord.MessageEmbed()
              .setTitle('Help')
              .setDescription(`Prefix: ${prefix}`)
              .addFields(chunk),
          );
        });
    
        pagination('some message', pages);
      },
    };
    
    // helper function to slice arrays
    function chunkify(arr, len) {
      let chunks = [];
      let i = 0;
      let n = arr.length;
    
      while (i < n) {
        chunks.push(arr.slice(i, (i += len)));
      }
    
      return chunks;
    }
    

    【讨论】:

      【解决方案2】:

      如果其他一切都正确,应该这样做:

      async run (bot, message, args) {
          const embed1 = new Discord.MessageEmbed()
              .setTitle('Help')
              .setDescription(`Prefix: ${prefix}`);
      
          for (const thing of require('../commands')) {
              embed1.addField();
          }
      }
      

      【讨论】:

        【解决方案3】:

        将 .addField() 更改为 embed1.addField()。那可能会解决它。最多也有 25 个字段。还可以尝试添加一些参数来添加添加字段,例如里面的文本和字段的标题,例如 addField('test', 'test')。 IDK 你的错误是什么所以这些是可能的修复。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-20
          • 2021-01-12
          • 2019-04-13
          • 1970-01-01
          • 1970-01-01
          • 2021-06-01
          相关资源
          最近更新 更多