Discord.js 智能帮助嵌入

Posted

技术标签:

【中文标题】Discord.js 智能帮助嵌入【英文标题】:Discord.js smart help embed 【发布时间】: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: `$prefixhelp`,

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

【问题讨论】:

【参考方案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: `$prefixhelp`,

  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 你的错误是什么所以这些是可能的修复。

【讨论】:

以上是关于Discord.js 智能帮助嵌入的主要内容,如果未能解决你的问题,请参考以下文章

嵌入上的 Discord.js 按钮

Discord.JS 嵌入问题

discord.js 分页嵌入

我的 discord.js 帮助命令不能正常工作

嵌入消息(不和谐)

Discord.js 嵌入不显示