【问题标题】:Get Discord Bot to Check If It's Reacted To It's Own Post让 Discord Bot 检查它是否对自己的帖子做出反应
【发布时间】:2019-10-18 14:04:59
【问题描述】:

我正在使用 discord.js 编写一个不和谐机器人,并且我最近添加了一个 //translate 命令,该命令利用 Google Translate API 在 Google Translate 支持的所有语言之间进行翻译。我想添加使用反应快速将翻译重新翻译回英语的功能,并且我希望机器人检查是否有 1 人对帖子做出了反应,如果他们有,重新翻译翻译回来到英语。

我真的很接近,但我遇到了一个问题,即我无法让机器人检查它本身是否发送了反应,因此它会自动重新翻译回英语,因为它正在检测自己的反应。我希望它只在 A PERSON 做出反应时重新翻译,并且只翻译一次。

我对 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,机器人会重新翻译回英文,因为它正在检测自己的反应。

任何帮助将不胜感激!

【问题讨论】:

    标签: discord discord.js google-translation-api


    【解决方案1】:

    在您的过滤器中,您可以检查以确保用户不是客户端,就像这样...

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

    这样,只会收集客户端添加的反应。

    您必须将收集器中的 max 选项更改为 1,因为不会收集客户自己的反应。您还可以删除比较reaction.emoji.nameif 语句。

    【讨论】:

    • 所以我尝试了这个,我遇到了一个问题。我希望机器人将翻译(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。
    • 似乎与您用于翻译的模块有关。不知道这是怎么回事。也许用更新的代码提出一个新问题?
    猜你喜欢
    • 2019-06-07
    • 2021-05-12
    • 2020-07-27
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2020-11-07
    相关资源
    最近更新 更多