Discord.js команда раздачи v12

#javascript #discord #discord.js

#javascript #Discord #discord.js

Вопрос:

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

 client.on('message', async message =>{
  if(message.content.toLowerCase().startsWith(prefix   'giveaway')) {
    if(!message.member.hasPermission("MANAGE_MESSAGES")) 
return message.channel.send('You cant use this command sice youre missing `manage_messages` perm')
    let args = message.content.substring(prefix.length).split(" ")
    let time = args[1]
    if(!time) return message.channel.send('You did not specify your time');
    if(
      !args[1].endsWith("d") amp;amp;
      !args[1].endsWith("h") amp;amp;
      !args[1].endsWith("m") amp;amp;
      !args[1].endsWith("s")
    )
    return message.channel.send("You need to use d (days), h (hours), m (minutes), or s (seconds)")

    let gchannel = message.mentions.channels.first();
    if(!gchannel) return message.channel.send("I cant find that channel in the server.")
    let prize = args.slice(3).join(" ")
    if(!prize) return message.channel.send('What is the prize?')

    message.delete()
    gchannel.send(`:tada: **New Giveaway** :tada:`)
    const newEmbed = new Discord.MessageEmbed()
    .setTitle('New Giveaway')
    .setColor("RANDOM")
    .setDescription(`React with :tada: to enter the giveaway. 
nHosted By: **${message.author}** nTime: **${time}**nPrize: **${prize}**`)
    .setFooter(`Will end in ${time}`)
    let reaction = await gchannel.send(newEmbed)
    reaction.react("🎉")
    setTimeout(() => {
      if ((m) => m.reaction.cache.get("🎉").count <= 0) {
        return message.channel.send("Not enough people reacted for me to draw a winner")
      }
      let winner = (m) => m.reaction.cache.get("🎉").users.cache.filter((u) => !u.bot).random();
      gchannel.send(`Congratulations ${winner} You just won the **${prize}**!`
      );
    }, ms(args[1]));
  }
})
 

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

1. Откуда m он берется? Вы не можете этого сделать. Вам нужно получить фактический объект сообщения с реакциями на него ( reaction )

2. как я могу это сделать?

3. У вас уже есть это в reaction переменной

4. idk что изменить или что изменить вместо этого

5. Well .send() возвращает обещание, содержащее объект Message, который имеет свойство reactions для него

Ответ №1:

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

Чтобы исправить это, вам нужно использовать отправляемое вами сообщение в качестве объекта Message, так как при использовании .send() возвращается обещание, которое содержит объект Message. Затем этот объект обладает свойством reactions , которое можно использовать для получения реакции на сообщение.

Например:

 if (reaction.reactions.cache.get("🎉").count <= 0) {
    return message.channel.send("Not enough people reacted for me to draw a winner")
}
 

Однако я бы предложил вместо этого использовать ReactionCollector, поскольку вы можете настроить фильтр и время, а затем вместо этого будет запущено событие, которое вы можете прослушать и получить размер и т.д.

 const filter = (reaction, user) => {
    return reaction.emoji.name === '🎉';
};

const collector = reaction.createReactionCollector(filter, { time: 15000 });
// time is in ms (so 15000ms is 15 seconds)

collector.on('collect', (reaction, user) => {
    console.log(`Collected 🎉 from ${user.tag}`);
});

collector.on('end', collected => {
    console.log(`Collected ${collected.size} items`);
    // collected.size will only contain the number of 🎉 on the message, as the collector had a filter applied to it
});