Javascript 如何制作从.json文件加载元素的嵌入反应菜单?

Javascript 如何制作从.json文件加载元素的嵌入反应菜单?,javascript,arrays,node.js,json,discord.js,Javascript,Arrays,Node.js,Json,Discord.js,我正在尝试制作一个显示我的公会自定义表情列表的菜单(参见 图片) 我有一个.json文件,emojis和emojis代码都存储在上面,我用它来获得将来存储更多emojis的能力 这是我用来嵌入的代码: 执行(消息){ const Discord=require('Discord.js'); const Emojis=require('./Emojis.json'); const key=对象.keys(Emojis); 变量i=0 常数嵌入={ “标题”:“服务器表情列表:”, “颜色”:1

我正在尝试制作一个显示我的公会自定义表情列表的菜单(参见 图片)

我有一个.json文件,emojis和emojis代码都存储在上面,我用它来获得将来存储更多emojis的能力

这是我用来嵌入的代码:

执行(消息){ const Discord=require('Discord.js'); const Emojis=require('./Emojis.json'); const key=对象.keys(Emojis); 变量i=0 常数嵌入={ “标题”:“服务器表情列表:”, “颜色”:1056085, “时间戳”:新日期(), “页脚”:{ “图标\u url”:”https://cdn.discordapp.com/icons/469276415746113568/f86e89f362f1df6dc1f996818ef49e7a.png?size=1024", “文本”:“Dz玩家社区” }, “字段”:[{ “名称”:“表情符号:”, “值”:`${Emojis[keys[i+0]]}\n${Emojis[keys[i+1]]}\n${Emojis[keys[i+2]]}\n${Emojis[keys[i+3]]}\n${Emojis[keys[i+4]}\n`, “内联”:true }, { “名称”:“表情符号代码:”, “值”:“**${keys[i+0]}\n${keys[i+1]}\n${keys[i+2]}\n${keys[i+3]}\n${keys[i+4]}\n**”, “内联”:true }] }; 我使用的是反应收集器,但我不确定如何编辑嵌入字段

message.channel.send({embed})
。然后(异步嵌入消息=>{
等待消息。反应('◀')
等待消息。反应('▶')
常量表情符号={
下一页:'▶',
上一页:'◀',
}
const collector=new Discord.ReactionCollector(embedMessage,(reaction,user)=>Object.values(emoji).includes(reaction.emoji.name)和&!user.bot,{});
collector.on('collect',(反应,用户)=>{
开关(reaction.emoji.name){
case emoji.NEXT_页面:
{
//编辑此处嵌入(下一页)
embeddemessage.reactions.get(emoji.PREV_页面)。remove(message.author)
打破
}
case emoji.PREV_页面:
{
//编辑此处嵌入(上一页)
embeddemessage.reactions.get(emoji.PREV_页面)。remove(message.author)
打破
}
};
});
collector.on('end',()=>embedMessage.delete());
})
}

现在,我想要一种方法让机器人编辑嵌入,在每个菜单页面上加载5个emojis(按顺序),所以我认为它应该是一个var,var值将是页码,然后我将能够使用is on
键[]

您可以创建一个简洁的小函数来帮助您解决这个问题。它将迭代json文件的条目,并将指定页面上需要的条目添加到嵌入中。然后,它将收集反应,并再次调用自身以显示不同的页面

用一个例子来说明这一点要容易得多。请确保在复制和粘贴代码之前理解代码

//需要json文件。
const emojis=require('./emojis.json');
//定义我们的功能。
异步函数列表(listMsg、page、increment){
const entries=Object.entries(emojis);
//设置基嵌入。
var embed=newdiscord.RichEmbed()
.setColor(1056085)
.setTitle(“**服务器表情**”)
.setDescription(${Math.ceil(entries.length/increment)}的`Page**${Page}**
.setFooter('Dz玩家社区','https://cdn.discordapp.com/icons/469276415746113568/f86e89f362f1df6dc1f996818ef49e7a.png?size=1024')
.setTimestamp(listMsg?listMsg.createdAt:未定义);
//添加要嵌入的字段。
常量emojiField=[];
常量字符串字段=[];
for(让[emoji,string]条目的.slice((第1页)*增量,(第*页增量)+1)){
emojiField.push(emoji);
stringField.push(字符串);
}
embed.addField('Emoji:',emojiField.join('\n'),true);
embed.addField('String:',stringField.join('\n'),true);
//编辑/发送嵌入。
if(listMsg)等待listMsg.edit(嵌入);
else listMsg=wait message.channel.send(嵌入);
//设置页面反应。
常量lFilter=(反应,用户)=>reaction.emoji.name=='◀' && 页面!==1&&user.id===message.author.id;
const lCollector=listMsg.createReactionCollector(lFilter,{max:1});
lCollector.on('collect',async()=>{
rCollector.stop();
等待listMsg.clearReactions();
列表(listMsg,第1页,增量);
});
const rFilter=(反应,用户)=>reaction.emoji.name=='▶' && entries.length>page*增量和&user.id===message.author.id;
const rCollector=listMsg.createReactionCollector(rFilter,{max:1});
rCollector.on('collect',async()=>{
lCollector.stop();
等待listMsg.clearReactions();
列表(listMsg,第+1页,增量);
});
如果(第!==1页)等待listMsg.react('◀');
如果(entries.length>page*increment)等待listMsg.react('▶');
}
//发送列表;每页显示第1页和第5页。
列表(未定义,1,5)
.catch(控制台错误);
由于某些部件可能看起来很混乱,而且从外观上看很难理解,下面是一些进一步的解释:

  • Math.ceil(entries.length/increment)
    • 条目的长度
      除以每页上显示的元素数量(
      增量
      )将给出总共应该有多少页。我们可以这样做,因为如果还有剩余的,我们需要另一页
  • embed.setTimestamp(listMsg?listMsg.createdAt:未定义)
    • 如果我们每次编辑消息时都设置嵌入的时间戳,那么它就不是消息发送的时间。因此,如果我们编辑消息,我们将其设置为该消息的时间戳;如果我们发送新消息,则使用新的时间戳