Отправьте изображение на канал, если достигнуто # реакций, Discord.js

#javascript #discord #discord.js

Вопрос:

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

Допустим, пользователь А отправляет изображение. Это изображение получает 2 голоса и отправляется на канал #голосовые изображения. Пользователь B приходит и публикует изображение. Их изображение также получает 2 голоса и отправляется на #голосовые изображения, но изображение пользователя A отправляется снова вместе с изображением пользователя B.

 bot.on("message", async message => {

  if(message.channel.id !== '869294795019923486')return;
  if(message.author.bot) return;
  message.react("⭐")

  bot.on('messageReactionAdd', (reaction, user) => {
      let limit = 2; // number of thumbsdown reactions you need
      if (reaction.emoji.name == '⭐' amp;amp; reaction.count >= limit){
          const channel = message.guild.channels.cache.find(ch => ch.name === 'test3');
          message.react("👍")
          channel.send("My Bot's message", {files:[message.attachments.first().url]});

          console.log(message.attachments.url)
      }
  })

})
 

Я сейчас вроде как на блокпосту, любая помощь приветствуется, спасибо!

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

1. Не могли бы вы прояснить свою проблему и добавить более подробную информацию? Как вы ожидаете, что код будет работать? Каково ваше желаемое поведение? Что я понимаю до сих пор, так это то, что, когда изображение получает, например, 3 голоса, оно снова отправляется на канал #test3 и так далее для 4 голосов и т. Д. Это правильно? Вы хотите, чтобы оно было отправлено только один раз и когда оно достигнет порога в 2 голоса?

2. Прости! У меня закончилось время, но теперь я могу объяснить это подробно. Так что в значительной степени, скажем, пользователь А отправляет изображение. Это изображение получает 2 голоса и отправляется на канал #голосовые изображения. Пользователь B приходит и публикует изображение. Их изображение также получает 2 голоса и отправляется на #голосовые изображения, но изображение пользователя A отправляется снова вместе с изображением пользователя B.

3. @washingm Я думаю, было бы полезно, если бы вы добавили это описание к своему вопросу

4. @washingm Предоставленный вами код отвечает за отправку только одного изображения. Проблема не в этом. Нам нужно больше контекста, где выполняется код?

5. Также ваш console.log(message.attachments.url) всегда печатает undefined , потому Collection что не имеет собственности .url . Вы, вероятно console.log(message.attachments.first().url) , имели в виду то, что сказали выше.

Ответ №1:

Проблема в том, что вы создаете новый прослушиватель событий каждый раз при отправке сообщения. Каждый обратный вызов прослушивателя messageReactionAdd в вашем случае имеет ссылку на исходный message объект. Это означает, что при срабатывании события оно будет срабатывать для каждого сообщения, для которого был зарегистрирован прослушиватель событий.

Решение состоит в том, чтобы вывести прослушиватель событий для за messageReactionAdd пределы прослушивателя событий для message .

 client.on("message", async (message) => {
    if (message.channel.id !== "869294795019923486") return;
    if (message.author.bot) return;

    message.react("⭐");
});
 
 client.on("messageReactionAdd", (reaction, user) => {

    const message = reaction.message;

    // You could use your 👍 reaction for a neat safety check,
    // so images that were already sent to the channel don't get sent again.
    // We treat 👍 reaction as an indication that the bot has already sent the image to the specified channel.
    // This way when someone unreacts and adds the reaction back,
    // or when someone adds the reaction after it met the two upvote treshold,
    // it won't get sent again.
    if (message.reactions.cache.some(re => re.emoji.name === "👍" amp;amp; re.users.cache.has(client.user.id))) {
        return;
    }

    let upvoteLimit = 2;
    // Number of reactions needed to be cast by the users (including the bot itself)
    // in order for the image to be sent to another channel.
    
    if (reaction.emoji.name == "⭐" amp;amp; reaction.count >= upvoteLimit) {
        const channel = message.guild.channels.cache.find(ch => ch.name === "test3");
        channel.send("My Bot's message", {files:[message.attachments.first().url]});
        message.react("👍");
    }

});
 

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

Если вы хотите собирать реакции только временно, вы можете взглянуть на ReactionCollector .

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

1. Большое вам спасибо, после небольшой настройки этого кода в соответствии с моим проектом, похоже, он работает! Я полагаю, что я уже пробовал указание «большой палец вверх», но, возможно, поставил его в неправильное место, я ценю помощь и подробный ответ!