Получите Discord Bot, чтобы проверить, отреагировал ли он на собственный пост

Я пишу бота Discord, используя discord.js, и недавно я добавил команду // translate, которая использует Google Translate API для перевода между всеми языками, поддерживаемыми Google Translate. Я хочу добавить возможность быстрого повторного перевода перевода обратно на английский, используя реакции, и я хочу, чтобы бот проверял, отреагировал ли 1 человек на сообщение предоставленной реакцией, и, если да, повторно переводил перевод обратно на английский.

Я действительно близок, но я столкнулся с проблемой, что я не могу заставить бота проверять, отправил ли он сам реакцию, поэтому он автоматически переводит обратно на английский, потому что он определяет свою собственную реакцию. Я хочу, чтобы он переводился только тогда, когда реагирует ЧЕЛОВЕК, и только ОДИН РАЗ.

Я еще не очень хорошо знаком с этой областью discord.js, поэтому не могу понять, как это сделать.

Вот код:

if (msg.content.startsWith(`${prefix}translate`) || msg.content.startsWith(`${prefix}t`)) {
        const text = args.slice(1).join(` `);
        if (!text) return msg.channel.send(`Nothing to translate provided! Languages codes are at https://cloud.google.com/translate/docs/languages !\n Command syntax: \`${prefix}translate\` or \`${prefix}t\` [text] [language code]`);
        const text1 = text.substring(0, text.length - 2)
        const target = text.substring(text.length - 2, text.length) || languages
        translate
        .translate(text1, target)
        .then(results => {
            const translation = results[0];
            msg.channel.send(`Translation: ${translation}`).then(sentText => {
                sentText.react(`????`);
                const filter = (reaction, user) => {
                    return ['????'].includes(reaction.emoji.name);
                };
                sentText.awaitReactions(filter, { max: 2, time: 5000, errors: ['time'] })
                .then(collected => {
                    const reaction = collected.first();
                    if (reaction.emoji.name === '????' && sentText.react.me === false) {
                        const target = `en`
                        translate
                        .translate(text1, target)
                        .then(results => {
                        const translation = results[0];
                        msg.channel.send(`Translation: ${translation}`);
                        })
                        .catch(err => {
                            console.log(err);
                        })
                    }   
                })
            })
        })
//code for command continues below this line, but it is irrelevant to what I'm trying to achieve

Ожидаемый результат: Бот повторно переводит обратно на английский, если пользователь реагирует предоставленной реакцией, и только один раз.

Фактический результат: бот ничего не делает, или, если я удалю && sentText.react.me === false, бот повторно переводит обратно на английский, потому что он определяет свою реакцию.

Любая помощь будет оценена по достоинству!


person MoneyHurricane    schedule 03.06.2019    source источник


Ответы (1)


В своем фильтре вы можете проверить, не является ли пользователь клиентом, например ...

const filter = (reaction, user) => reaction.emoji.name === '????' && user.id !== client.user.id;

Таким образом, будут собираться только те реакции, которые не добавлены клиентом.

Вам нужно будет изменить ваш max параметр в сборщике на 1, так как собственная реакция клиента не будет собираться. Вы также можете удалить оператор if, сравнивающий reaction.emoji.name.

person slothiful    schedule 03.06.2019
comment
Итак, я попробовал это, и у меня возникла проблема. Я хочу, чтобы бот переводил перевод (sentText) обратно на английский, а не старый текст (text1) (потому что это просто выводит старый текст), потому что это может привести к некоторым забавным переводам. Однако когда я пытаюсь это сделать, получается вот такой результат. RangeError: Maximum call stack size exceeded at Array.map (<anonymous>) at replaceProjectIdToken (C:\Users\[Name]\node_modules\@google-cloud\projectify\build\src\index.js:31:23). Код такой же, как и в приведенном выше примере с вашими изменениями, при этом text1 просто заменен на sentText. - person MoneyHurricane; 04.06.2019
comment
Похоже, это связано с модулем, который вы используете для перевода. Понятия не имею, как это происходит. Может задать новый вопрос с обновленным кодом? - person slothiful; 04.06.2019