Как исправить не работающие функции реакции (после перезагрузки бота) - PullRequest
1 голос
/ 20 ноября 2019

Итак, я работаю над системой тикетов discord.js и обнаружил ошибку, которую сам, похоже, не могу исправить.

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

Мой код:

    else if(reaction.emoji.name === '?') {

        if(userTickets.has(user.id)) {
            if(reaction.message.channel.id === userTickets.get(user.id)) {
                reaction.remove(user);
                let embed = new RichEmbed();
                embed.setDescription("Ticket will be closed in 5 seconds.")
                reaction.message.channel.send(embed);
                setTimeout(() => {
                    reaction.message.channel.delete('closing ticket')
                    .then(channel => {
                        console.log("Deleted " + channel.name);
                    })
                    .catch(err => console.log(err));
                }, 5000);
            }
        }

        else if(reaction.message.guild.channels.some(channel => channel.name.toLowerCase() === user.username + 's-ticket')) {
            let embed = new RichEmbed();
            embed.setDescription("Ticket will be closed in 5 seconds.");
            reaction.message.channel.send(embed);
            setTimeout(() => {
                reaction.message.guild.channels.forEach(channel => {
                    if(channel.name.toLowerCase() === user.username + 's-ticket') {
                        channel.delete().then(ch => console.log('Deleted Channel ' + ch.id))
                    }
                });
            }, 5000);
        }
    }
});

1 Ответ

0 голосов
/ 20 ноября 2019

Вы должны обрабатывать события для некэшированных сообщений

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

Чтобы решить эту проблему, вам нужно будет прослушать raw события. Это выглядит так:

// check for reactions on unloaded messages and trigger the appropriate events
client.on('raw', packet => {
  if (!['MESSAGE_REACTION_ADD', 'MESSAGE_REACTION_REMOVE'].includes(packet.t)) return;
  const channel = client.channels.get(packet.d.channel_id);
  if (channel.messages.has(packet.d.message_id)) return;
  channel.fetchMessage(packet.d.message_id).then(message => {
    const emoji = packet.d.emoji.id ? `${packet.d.emoji.name}:${packet.d.emoji.id}` : packet.d.emoji.name;
    const reaction = message.reactions.get(emoji);
    if (packet.t === 'MESSAGE_REACTION_ADD') { client.emit('messageReactionAdd', reaction, client.users.get(packet.d.user_id)); }
    if (packet.t === 'MESSAGE_REACTION_REMOVE') { client.emit('messageReactionRemove', reaction, client.users.get(packet.d.user_id)); }
  });
});

Я не могу объяснить это лучше, чем то, что делает Эвелин Лашанс в оригинальном руководстве, я взял это из , так что если вы хотите понять, как это работаетПрочтите его там.

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

...