Как мне заставить пользователя ответить на вопрос, используя реакции в Discord.js ?

#javascript #node.js #discord #discord.js

#javascript #node.js #Discord #discord.js

Вопрос:

Я хочу, чтобы пользователь ответил на вопрос «да или нет», используя реакции. Вот мой код ниже.

 var emojiArray = ['🔥', '👍', '👎', '✅', '❌'];

client.on('message', (negotiate) => {
    const listen = negotiate.content; 
    const userID = negotiate.author.id;
    var prefix = '!';
    var negotiating = false; 
    let mention = negotiate.mentions.user.first();
    if(listen.toUpperCase().startsWith(prefix   'negotiate with '.toUpperCase()) amp;amp; (mention)) {
        negotiate.channel.send(`<@${mention.id}>, do you want to negotiate with `   `<@${userID}>`)
        .then(r => r.react(emojiArray[3], emojiArray[4]));
        negotiating = true;
    }
    if(negotiating == true amp;amp; listen === 'y') {
        negotiate.channel.send('Please type in the amount and then the item you are negotiating.');
    } else return; 
})
 

Как вы можете видеть, приведенный выше код позволяет пользователю помечать кого-либо и вести с ним переговоры (часть переговоров не имеет значения). Когда пользователь помечает кого-то другого, он спрашивает их, хотят ли они договориться с пользователем, который их пометил. Если пользователь говорит «да», они ведут переговоры.

Я хочу сделать это более чистым способом, используя реакции в discord. Есть ли какой-нибудь способ просто добавить смайлик с ответом «да» или «нет», и пользователю нужно будет нажать «Да» или «нет» для подтверждения?

Ответ №1:

Прежде всего, вы вроде как напортачили при получении пользовательского объекта упомянутого пользователя, так что просто, чтобы вы знали, что это negotiate.mentions.users.first() !

Желая запросить ввод данных пользователем с помощью реакций, мы обычно хотели бы использовать одно из следующих действий:

  • Ожидание реакций()
  • createReactionCollector

Поскольку я лично предпочитаю awaitReactions() , вот краткое объяснение того, как его использовать:

awaitReactions является message расширением объекта и создает сборщик реакций на выбранное нами сообщение. Кроме того, эта функция также поставляется с возможностью добавления к ней фильтра. Вот фильтр, который я обычно люблю использовать:

 const filter = (reaction, user) => {
   return emojiArray.includes(reaction.emoji.name) amp;amp; user.id === mention.id;
   // The first thing we wanna do is make sure the reaction is one of our desired emojis!
   // The second thing we wanna do is make sure the user who reacted is the mentioned user.
};
 

С этого момента мы могли бы очень просто реализовать наш фильтр в нашей awaitReactions() функции следующим образом:

  message.awaitReactions(filter, {
     max: 1, // Accepts only one reaction
     time: 30000, // Will not work after 30 seconds
     errors: ['time'] // Will display an error if using .catch()
 })
 .then(collected => { // the reaction object the user reacted with
     const reaction = collected.first();
     // Your code here! You can now use the 'reaction' variable in order to check certain if statements such as:
     if (reaction.emoji.name === '🔥') console.log(`${user.username} reacted with Fire emoji!`)
 

Наконец, ваш код должен выглядеть следующим образом:

 const filter = (reaction, user) => {
   return emojiArray.includes(reaction.emoji.name) amp;amp; user.id === mention.id;
};
message.awaitReactions(filter, {
     max: 1,
     time: 30000, 
     errors: ['time'] 
 })

 .then(collected => {
     const reaction = collected.first();
     if (reaction.emoji.name === '🔥') console.log(`${user.username} reacted with Fire emoji!`)
 

Ответ №2:

вы должны использовать ReactionCollector :

 var emojiArray = ['🔥', '👍', '👎', '✅', '❌'];
const yesEmoji = '✅';
const noEmoji = '❌';

client.on('message', (negotiate) => {
    const listen = negotiate.content; 
    const userID = negotiate.author.id;
    var prefix = '!';
    var negotiating = false; 
    let mention = negotiate.mentions.user.first();

    if(listen.toUpperCase().startsWith(prefix   'negotiate with '.toUpperCase()) amp;amp; (mention)) {
        negotiate.channel.send(`<@${mention.id}>, do you want to negotiate with `   `<@${userID}>`)
        .then(async (m) => {
            await m.react(yesEmoji);
            await m.react(noEmoji);
            // we want to get an answer from the mentioned user
            const filter = (reaction, user) => user.id === mention.id;
            const collector = negotiate.createReactionCollector(filter);
            collector.on('collect', (reaction) => {
                 if (reaction.emoji.name === yesEmoji) {
                      negotiate.channel.send('The mentioned user is okay to negotiate with you!');
                      // add your negotiate code here
                 } else {
                      negotiate.channel.send('The mentioned user is not okay to negotiate with you...');
                 }
            });
        });
        negotiating = true;
    }

})
 

Это позволяет прослушивать новые реакции, добавленные к сообщению. Вот документация: https://discord.js.org/#/docs/main/stable/class/Message?scrollTo=createReactionCollector

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

1. Этот код не отображает, согласен ли упомянутый пользователь на переговоры после того, как упомянутый пользователь нажмет на реакцию.