Discord.js Меню справки ReactionCollector — сброс эмодзи

#javascript #bots #discord #discord.js

#javascript #боты #Discord #discord.js

Вопрос:

Я использую приведенный ниже код для создания меню справки для бота 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 === '⬅' amp;amp; user.id === message.author.id;
        const forwardsFilter = (reaction, user) => reaction.emoji.name === '➡' amp;amp; 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)
        })
    })
})
  

}

Это работает, за исключением того, что мне нужно дважды щелкнуть по эмодзи, чтобы перейти на следующую / предыдущую страницу. Я считаю, что мне нужно удалить эмодзи, а затем перезагрузить их с настройками по умолчанию.

Кто-нибудь знает лучший способ сделать это? или, если есть что-то еще, что мне нужно сделать вместо этого?

Комментарии:

1. Спасибо, DNLST, все сработало отлично!

Ответ №1:

На всякий случай, если кто-нибудь наткнется на это и попытается использовать этот код в текущей версии DJS и получит ошибки, вот как написать всю эту функцию в текущей версии Discord.JS (версия 12.2.0):

ПРИМЕЧАНИЕ: Предполагается, что вы уже передали клиент, сообщение и, при необходимости, любые аргументы

Редактировать: сделано так, что бот удалит реакцию, если пользователь выберет кнопку ie «Назад», но уже на 1-й странице, или кнопку «Вперед», но уже на последней странице

 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 === '⬅' amp;amp; user.id === message.author.id
    const forwardsFilter = (reaction, user) => reaction.emoji.name === '➡' amp;amp; 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 = удалить

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

Внутри обоих коллекторов должна выполняться работа.

Редактировать

Если вы хотите, чтобы каждый пользователь мог использовать это меню, лучше использовать этот фильтр вместо:

 .filter(u => !u.bot)