Дискорд бот: изо всех сил пытается подсчитать смайлики реагирует на голосование - PullRequest
1 голос
/ 27 января 2020

Первый постер здесь. Извините, если это очевидное исправление, но я очень плохо знаком с миром nodejs и программированием в целом.

В настоящее время я пытаюсь создать бота Discord, который позволит любому пользователю инициировать " любите это или ненавидите "голосуйте с командой! Как только голосование инициировано, бот отправляет сообщение, объявляющее голосование, а затем реагирует на свое собственное сообщение смайликами сердца и черепа, чтобы обозначить варианты любви и ненависти соответственно. Эта часть работает так, как задумано.

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

В существующем виде я могу заставить бота ответить на мою команду! Voice, отправив новое сообщение в чат и отреагировав на это сообщение правильные смайлики. Бот также будет ждать установленное количество времени и объявит результат голосования. Тем не менее, он всегда объявляет, что голосование было нейтральным, независимо от того, на какие эмодзи я нажал до истечения таймера (конечно, убедившись, что я не нажал на оба).

Мой код для сравнения количества голосов явно не работает должным образом. Тем не менее, потратив несколько часов, пытаясь найти разные варианты, я не могу найти решение для моей жизни, и это сводит меня с ума. Есть ли часть этого, что это неправильно? И если да, то как мне это исправить?

Огромное спасибо всем, кто может вмешаться. Поработав некоторое время и найдя бесчисленные исправления в вопросах других людей в прошлом, я решил наконец обратиться к милые люди в Stack Overflow за помощь. Ребята, вы молодцы!

const Discord = require('discord.js');
const bot = new Discord.Client();

bot.on('message', function(message){
    if(message.content.toLowerCase().startsWith('!vote'))
    {
    var heartCount = 0;
    var skullCount = 0;
        message.channel.send(
            "The vote begins! Do we love it or hate it?")
                .then(async function (message){
                    try {
                    await message.react("❤️")
                    await message.react("?")
                    }
                catch (error) {
                    console.error('One of the emojis failed to react.');
                    }
                })
        const filter = (reaction, user) => {
        return ["❤️","?"].includes(reaction.emoji.name) && user.id === message.author.id };
                
                message.awaitReactions(filter, {time: 10000})
                .then(collected => {
                    for (var i = 0; i < collected.length; i++){
                        if (collected[i].emoji.name === "❤️")
                        {heartCount++;}
                        else if (collected[i].emoji.name === "?")
                        {skullCount++;}
                    };
                
                    if (heartCount > skullCount){
                        message.channel.send("We love it!");
                    }
                    else if (heartCount < skullCount){
                        message.channel.send("We hate it.");
                    }
                    else {
                        message.channel.send("We're neutral about it.");
                    }
                    
                })
    }
});

bot.login(process.env.BOT_TOKEN);

1 Ответ

0 голосов
/ 27 января 2020

Первая проблема - user.id === message.author.id, поэтому реагировать может только автор сообщения. message.channel.send возвращает обещание нового сообщения, поэтому вы можете использовать then => для реакции сообщения. Лучше использовать действие collector on collect для получения счета, а затем, когда сборщик завершится, отправить сообщение.

const Discord = require('discord.js');
const bot = new Discord.Client();

bot.on('message', function(message){
    var heartCount = 0;
    var skullCount = 0;

    if(message.content.toLowerCase().startsWith('!vote')) {
        message.channel.send('The vote begins! Do we love it or hate it?').then(msg => {
            msg.react(`❤️`).then(() => msg.react('?'));
            const filter = (reaction, user) => {
                return [`❤️`, '?'].includes(reaction.emoji.name);
            };

            const collector = msg.createReactionCollector(filter, {time: 10000});
            collector.on('collect', (reaction, reactionCollector) => {
                if (reaction.emoji.name === `❤️`) {
                    heartCount+=1
                } else if (reaction.emoji.name === `?`) {
                    skullCount+=1
                }
            });
            collector.on('end', (reaction, reactionCollector) => {
                   if (heartCount > skullCount){
                        message.channel.send("We love it!");
                    }
                    else if (heartCount < skullCount){
                        message.channel.send("We hate it.");
                    }
                    else {
                        message.channel.send("We're neutral about it.");
                    }
            });

        })
    }
})
...