#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. Большое вам спасибо, после небольшой настройки этого кода в соответствии с моим проектом, похоже, он работает! Я полагаю, что я уже пробовал указание «большой палец вверх», но, возможно, поставил его в неправильное место, я ценю помощь и подробный ответ!