如何根据Discord.js中的反应编辑消息(创建列表和切换页面)

如何根据Discord.js中的反应编辑消息(创建列表和切换页面),discord,discord.js,Discord,Discord.js,我希望我的Discord bot发送一条消息,然后在人们做出反应时对其进行编辑(例如,创建一个列表,单击右箭头或左箭头将编辑消息并显示列表的下一/上一部分) 示例: 反应前: 反应后: 如何处理信息反应? 有3种方法可以对消息反应作出反应: 使用函数(基于承诺) 使用 使用事件 区别在于: messageReactionAdd是链接到客户端的事件: 在将反应添加到缓存消息时发出 而ReactionCollector和awaittreactions链接到特定的消息,如果将一个反应添加到另一个消息

我希望我的Discord bot发送一条消息,然后在人们做出反应时对其进行编辑(例如,创建一个列表,单击右箭头或左箭头将编辑消息并显示列表的下一/上一部分)

示例:
反应前:

反应后:

如何处理信息反应? 有3种方法可以对消息反应作出反应:

  • 使用函数(基于承诺)
  • 使用
  • 使用事件
  • 区别在于:
    messageReactionAdd
    是链接到
    客户端的事件:

    在将反应添加到缓存消息时发出

    ReactionCollector
    awaittreactions
    链接到特定的消息,如果将一个反应添加到另一个消息中,则不会执行任何操作

    如果将反应添加到缓存消息(旧消息)中,则不会激发
    messageReactionAdd
    。Discord.js指南中有一个警告,其中给出了此警告

    本节介绍如何使用一些未记录的API将不受支持的功能添加到discord.js中,因此您应该非常小心地遵循此处的任何操作。此处的任何内容都可能随时更改,恕不另行通知,并且可能会破坏您的bot中的其他功能

    awaitReactions
    是基于承诺的,它只会在承诺得到解决时返回所有已添加反应的集合(在添加X个反应后,在Y秒后,等等)。没有一个特定的支持来处理每一个附加的反应。您可以将函数放入
    过滤器
    函数中,以添加每个反应,但这是一个小技巧,不是有意的。但是,
    ReactionCollector
    有一个
    collect
    事件

    那么,我用什么呢? 您希望编辑由您的bot发送的消息(因为您无法编辑其他用户的消息)。所以
    ReactionCollector
    等待反应

    如果您想在满足特定条件后编辑消息(X人已投票,Y人已添加反应,15分钟后,…)(例如:投票,您将允许用户在15分钟内投票),您可以使用
    等待反应
    反应收集器

    但是如果您想根据特定的反应编辑消息(如示例中对箭头表情符号作出反应时),则必须使用
    ReactionCollector

    如果消息没有被缓存,您可以使用
    messageReactionAdd
    ,但这将更加复杂,因为您基本上必须重写一个表情符号收集器,但每个表情符号都要重写

    注意:如果bot重新启动,
    ReactionCollector
    awaittreactions
    将被删除,而
    messageReactionAdd
    将正常工作(但您将丢失您声明的变量,因此如果您已存储了要侦听的消息,它们也将消失)

    怎么办? 您将需要不同的东西:

    • 将触发函数的表情列表(您可以选择对每个表情做出反应)
    • 停止侦听消息反应的条件(如果要使用
      messageReactionAdd
    • 接收并编辑消息的函数
    • 一个将返回布尔值的筛选函数:
      true
      我想对此表情做出反应,
      false
      我不想做出反应。此函数将基于表情列表,但也可以筛选做出反应的用户或您需要的任何其他条件
    • 编辑消息的逻辑。例如:对于列表,它将基于结果数、当前索引和添加的反应
    示例:用户列表 表情符号列表:
    const emojiNext=”➡'; // unicode表情符号由表情符号本身识别
    常数emoji⬅';
    常量反动行=[emojiPrevious,emojiNext];
    
    停止条件
    const time=60000;//时限:1分钟
    
    编辑功能 这里的函数非常简单,消息是预先生成的(除了时间戳和页脚)

    const first=()=>new Discord.MessageEmbed()
    .setAuthor('TOTO',”https://i.imgur.com/ezC66kZ.png")
    .setColor(“#AAA”)
    .setTitle(“第一个”)
    .setDescription(“第一”);
    const second=()=>new Discord.MessageEmbed()
    .setAuthor('TOTO',”https://i.imgur.com/ezC66kZ.png")
    .setColor(“#548”)
    .setTitle('Second')
    .setDescription(“第二个”);
    const third=()=>newdiscord.MessageEmbed()
    .setAuthor('TOTO',”https://i.imgur.com/ezC66kZ.png")
    .setColor(“#35D”)
    .setTitle(“第三个”)
    .setDescription(“第三”);
    常量列表=[第一、第二、第三];
    函数getList(一){
    返回列表[i]().setTimestamp().setFooter(`Page${i+1}`);//i+1,因为我们从0开始
    }
    
    过滤函数
    功能过滤器(反应,用户){
    return(!user.bot)&&(reactionArrow.includes(reaction.emoji.name));//检查表情符号是否在表情符号列表中,以及用户是否不是bot
    }
    
    逻辑 请注意,我在这里使用list.length是为了避免进入list[list.length]或超出它。如果您没有对list进行硬编码,则应该在参数中传递一个限制。
    如果索引无效,还可以使getList返回undefined,并将返回值与undefined进行比较,而不是将该索引用于布尔条件

    收集函数(表情符号、消息、i、getList){ if((emoji.name==emojiPrevious)&&(i>0)){ message.edit(getList(--i)); }else if((emoji.name==emojiNext)&&(i
    这是另一个带有另一个getList函数的逻辑,该函数只返回list[i],而没有像上面那样设置时间戳,因为尝试执行
    。未定义的setTimestamp
    将引发错误

    if(emoji.name===