Как подождать, а затем проверить, сколько реакций есть на сообщение (discord.js)

#javascript #discord.js

Вопрос:

В настоящее время я пытаюсь написать команду, в которой вы можете порекомендовать серверу новую идею. Я хочу, чтобы команда могла (сама по себе) проверять, когда было 3 эмодзи 👍 или👎. Затем бот удалит старое сообщение и отправит новое, в котором будет указано, была ли команда одобрена или отклонена.

     async run(client, message, args){
        const channelToSend = message.guild.channels.cache.find(channel => channel.name === '👍-recommendations');
        const Author = message.author;        ;
        const newEmbed = new Discord.MessageEmbed()
        .setColor('#FFB6C1')
        .setTitle(`Server Recommendation:`)
        .setDescription(args.slice(0).join(' '))
        .setAuthor(message.author.tag, message.author.avatarURL())

        const errorEmbed = new Discord.MessageEmbed()
        .setColor('#FFB6C1')
        .setDescription('You need to reccomend something.');

        const sentEmbed = new Discord.MessageEmbed()
        .setColor('RANDOM')
        .setDescription('Recommendation sent! Thank you.');

        try {
          gogo();
        } catch(e) {
          
        } 

      async function gogo() {
        if(message.length <= '0' || message.content == null || message.content == undefined){
            message.channel.send(errorEmbed);
        } else{
          const question = await channelToSend.send(newEmbed); 

          let ryC = 0;

          let rnC = 0;


          ['👍', '👎'].forEach(async el => await question.react(el)); 

          const collector = question.createReactionCollector(filter, { max: 4, time: 5000 });
          collector.on('collect', r => 
          {
            if(r == '👍'){
              ryc   ;
            } else if (r == '👎'){
              rnC   ;
            } 
          });
          collector.on('end', async collected => {
            if(ryC >= rnC){
              const verifiedEmbed = new Discord.MessageEmbed()
              .setColor('#FFB6C1')
              .setTitle(`Server Recommendation:`)
              .setDescription(args.slice(0).join(' '))
              .setAuthor(message.author.tag, message.author.avatarURL())
              .setFooter('**Recommendation Approved**');

              await question.delete();

              channelToSend.send(verifiedEmbed);
            }

            if(rnC > ryC){
              const verifiedEmbed = new Discord.MessageEmbed()
              .setColor('#FFB6C1')
              .setTitle(`Server Recommendation:`)
              .setDescription(args.slice(0).join(' '))
              .setAuthor(message.author.tag, message.author.avatarURL())
              .setFooter('**Recommendation Denied**');

              await question.delete();

              channelToSend.send(verifiedEmbed);
            }
          });
        }
      }
    }
 

Ответ №1:

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

 client.on('messageReactionAdd', (reaction, author) => {
    if(reaction.message.author == bot){
    //Here you can check the message itself, the author, a tag on the message or in its content, title ...
        if(reaction.message.reactions.cache.get('👍').count == 3){
            //Delete message
            //Post New message
        }
    }
}
 

Было бы лучше добавить обратный вызов непосредственно в сообщение, но я не знаю, как это сделать.
Еще лучше, вы можете прикрепить обратный вызов, когда публикуете свою рекомендацию, и отсоединить его, когда emoji >= 3 с помощью client.off(‘messageReactionAdd’, …).

Изменить : Я изменил оператор if. Поскольку вы не хотите хранить сообщение в памяти, вам просто нужно найти подходящий способ определить, является ли это сообщение рекомендацией.

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

1. Проблема в том, что я не хочу указывать текущую рекомендацию, я хочу, чтобы она могла выполняться на своих собственных условиях. По сути, пользователь отправит команду, затем код распознает, что сообщение имеет (скажем, здесь) три реакции, затем сообщение удалится и сообщит всем, что оно было одобрено.

2. Сообщение является обновлением. Скажи мне, что ты думаешь.

3. В настоящее время я работаю над исправлением, используя событие messageReactionAdd. Вот фрагмент моего кода. @Zekovski async run(client, message){ recChannel = '773052032151715846'; if(message.channel.id == '773052032151715846'){ if(message.embed.title.content.includes('Recommendation')){ if(message.reactions.cace.get('👍').count >=3){

Ответ №2:

Попробуйте создать глобальную переменную, которая увеличивается, когда кто-то нажимает на определенную реакцию. Каждый раз, когда нажимается одна из реакций, вы можете проверить, какая из них уже имеет 3 реакции.

Ответ №3:

После некоторого времени переоценки и частичного ответа от @Zekovski я придумал этот код.

По сути, я не могу вечно перепроверять сообщение, пока в нем не будет так много реакций, поэтому я добавил событие messageReactionAdd, оттуда я проверяю, находится ли канал, по которому отправляются реакции, затем мы убеждаемся, что сообщение является внедрением, оттуда мы видим, имеет ли сообщение три 👍 реакции или три 👎 реакции.

Наконец, мы берем исходную вставку и редактируем ее, добавляя » да » и «нет». Тогда отправь его!

     const baseEvent = require("../BaseClasses/baseEvent");
    const Discord = require('discord.js')
    
    module.exports = class messageReactionAdd extends baseEvent {
        constructor(){
            super('messageReactionAdd');
        }
    
        async run(client, reaction){
          const recChannel = '773052032151715846';
          if(reaction.message.channel.id == recChannel){
            if(reaction.message.embeds[0].title.includes('Recommendation')){
              let yC = reaction.message.reactions.cache.get('👍').count;
              let nC = reaction.message.reactions.cache.get('👎').count;
              let total = [];
              reaction.message.reactions.cache.forEach(e => {
                if(e.emoji.name == '👍'){
                  //yC = yC   1;
                  console.log(yC);
                }
                else if(e.emoji.name == '👎'){
                  //nC = nC   1;
                  console.log(nC);
                }
              });
    
              console.log(`${yC} : yesses , ${nC} : no's`);
              console.log(total);
    
              if(yC >=2){
                const oldEmbed = reaction.message.embeds[0];
                const verifiedEmbed = new Discord.MessageEmbed(oldEmbed)
                .addFields(
                  { name: 'Total 👍:', value: yC, inline: true },
                  { name: 'Total 👎:', value: nC, inline: true}
                ).setFooter('**Recommendation Approved**');
    
                  reaction.message.delete();
                  reaction.message.channel.send(verifiedEmbed);
              } else if(nC >=3){
                  const oldEmbed = reaction.message.embeds[0];
                  const deniedEmbed = new Discord.MessageEmbed(oldEmbed).setFooter('**Recommendation Denied**');
    
                  reaction.message.delete();
                  recChannel.send(deniedEmbed);
              }
            }
          }
        }
    }