您似乎正在使用discordjs.guide site 上提供的设置。这意味着,您已经在client.commands 或bot.commands 上拥有一组可用的命令。它包含您需要的所有数据。
集合有一个返回新数组的map() 方法。您可以使用它来遍历commands 并返回一个新的field object(一个带有name 和value 属性的对象)。拥有此数组后,您可以使用.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;
}