Discord.js ReactionCollector 帮助菜单 - 重置表情符号

Posted

技术标签:

【中文标题】Discord.js ReactionCollector 帮助菜单 - 重置表情符号【英文标题】:Discord.js ReactionCollector Help Menu - reset emojis 【发布时间】:2019-07-31 12:52:29 【问题描述】:

我正在使用以下代码为 Discord 机器人创建帮助菜单。

let pages = ['Page one!', 'Second page', 'Third page'];
let page = 1; 

    const embed = new Discord.RichEmbed() // Define a new embed
    .setColor(0xffffff) // Set the color
    .setFooter(`Page $page of $pages.length`)
    .setDescription(pages[page-1])

    message.channel.send(embed).then(msg => 

    msg.react('⬅').then( r => 
        msg.react('➡')

        // Filters
        const backwardsFilter = (reaction, user) => reaction.emoji.name === '⬅' && user.id === message.author.id;
        const forwardsFilter = (reaction, user) => reaction.emoji.name === '➡' && user.id === message.author.id;

        const backwards = msg.createReactionCollector(backwardsFilter, timer: 6000);
        const forwards = msg.createReactionCollector(forwardsFilter, timer: 6000);

        backwards.on('collect', r => 
            if (page === 1) return;
            page--;
            embed.setDescription(pages[page-1]);
            embed.setFooter(`Page $page of $pages.length`);
            msg.edit(embed)
        )

        forwards.on('collect', r => 
            if (page === pages.length) return;
            page++;
            embed.setDescription(pages[page-1]);
            embed.setFooter(`Page $page of $pages.length`);
            msg.edit(embed)
        )
    )
)

除了我必须在表情符号上单击两次才能移动到下一页/上一页之外,它可以正常工作。我认为我需要删除表情符号,然后以默认设置重新加载它们。

有人知道最好的方法吗?或者如果我需要做其他事情来代替?

【问题讨论】:

感谢 DNLST,它运行良好! 【参考方案1】:

以防万一有人偶然发现并尝试在当前版本的 DJS 上使用此代码并出现错误,以下是如何在当前版本的 Discord.JS (v12.2.0) 中编写整个函数:

注意:这假设您已经传递了客户端、消息和可选的任何参数

编辑:如果用户选择后退按钮但已在第一页,或前进按钮已在最后一页,机器人将删除反应

const Discord = require('discord.js')
let pages = ['Page one!', 'Second page', 'Third page']
let page = 1 

const embed = new Discord.MessageEmbed() // Define a new embed
.setColor(0xffffff) // Set the color
.setFooter(`Page $page of $pages.length`)
.setDescription(pages[page-1])

message.channel.send(embed).then(msg => 
  msg.react('⬅').then( r => 
    msg.react('➡')

    // Filters
    const backwardsFilter = (reaction, user) => reaction.emoji.name === '⬅' && user.id === message.author.id
    const forwardsFilter = (reaction, user) => reaction.emoji.name === '➡' && user.id === message.author.id

    const backwards = msg.createReactionCollector(backwardsFilter, timer: 6000)
    const forwards = msg.createReactionCollector(forwardsFilter, timer: 6000)

    backwards.on('collect', (r, u) => 
        if (page === 1) return r.users.remove(r.users.cache.filter(u => u === message.author).first())
        page--
        embed.setDescription(pages[page-1])
        embed.setFooter(`Page $page of $pages.length`)
        msg.edit(embed)
        r.users.remove(r.users.cache.filter(u => u === message.author).first())
    )

    forwards.on('collect', (r, u) => 
        if (page === pages.length) return r.users.remove(r.users.cache.filter(u => u === message.author).first())
        page++
        embed.setDescription(pages[page-1])
        embed.setFooter(`Page $page of $pages.length`)
        msg.edit(embed)
        r.users.remove(r.users.cache.filter(u => u === message.author).first())
    )
  )
)

希望这对任何人都有帮助:)

【讨论】:

【参考方案2】:

https://discord.js.org/#/docs/main/stable/class/MessageReaction?scrollTo=remove

r.remove(r.users.filter(u => u === message.author).first());

内部的两个收集器都应该做一份工作。

编辑

如果您希望每个用户都能使用此菜单,最好使用此过滤器:

.filter(u => !u.bot)

【讨论】:

以上是关于Discord.js ReactionCollector 帮助菜单 - 重置表情符号的主要内容,如果未能解决你的问题,请参考以下文章

Discord 错误错误 Discord.js 中的无效令牌

Discord 仅识别 discord.js 中的“ping”命令

错误“const Discord = require(discord.js) ^ ReferenceError: discord is not defined”

(Discord 机器人)当用户加入 Discord 服务器(discord.js)时,如何发送欢迎消息?

Discord.js 和 discord.js-commando 防止命令在特定通道中运行

使用 Discord 按钮的建议命令 Discord.JS