将 Discord.js v11 翻译成 v12

时间:2021-01-02 19:14:06

标签: discord.js

所以我试图在我的 v12 机器人中使用 discord.js v 11 中的一些旧代码,但我在弄清楚什么是正确的以及为什么它不想正常运行时遇到了问题

我觉得问题出在这两点上,就是不知道在哪里

async finish(bot) {
        const now = new Date();
        const message = await this.getPollMessage(bot);
        if (!message) {
            console.error("Cant find poll message");
            return;
        }
        if (message.embeds.length < 1) {
            console.error("The poll message ha no embeds.");
            return;
        }
        
        this.hasFinished = true;
        
        const embed = new Discord.MessageEmbed(message.embeds[0]);
        embed.setColor("FF0800")
            .setAuthor(`${this.question} [FINISHED]`)
            .setFooter(`Poll ${this.id} finished ${now.toUTCString()}`);

        try {
            await message.edit({ embed: embed });
            await this.getVotes(message);
            await this.showResults(message.channel);
        } catch (error) {
            console.error(error);
        }
    }
async getPollMessage(message, bot) {
        try {
            return await message.guild.cache.get(this.guildId).channel.cache.get(this.channelId).messages.cache.get(this.id);
        } catch (err) {
            return;
        }
    }

1 个答案:

答案 0 :(得分:1)

问题

我认为将您的机器人从 DJS v11 转换为 v12 的第一步实际上是查看 DJS 文档。我不知道你想在这条线上做什么:

return await message.guild.cache.get(this.guildId).channel.cache.get(this.channelId).messages.cache.get(this.id);

那应该是什么?那条线是完全错误的。

快速浏览文档会发现 message.guildmessage.channel 甚至没有 cache 属性;这是有道理的,因为 DJS 的缓存只是已经从 Discord API 获取的公会、频道、消息等的集合(为了防止您每次想要从 API 获取该信息)使用公会、频道、消息等),而 message.guildmessage.channel 代表单个公会/频道,而不是它们的集合。

所以现在我们已经确定该行是完全错误的,并且肯定会导致错误。好吧,该行在 try/catch 中,当您发现错误时,您只是在执行 return;。这意味着 message 现在将是 undefined 中的 finish(),这就是为什么它会记录“找不到投票消息”的原因。

解决方案

那么我们现在如何解决这个问题?好吧,这取决于您希望这部分代码如何运行,但根据我提供的信息,我假设您想使用公会 ID、频道 ID 和消息 ID 来获取轮询消息。现在这个公会ID可以是其他公会的ID,也可以是当前公会的ID。这意味着使用这些 ID 超出了 messagegetPollMessage() 的“范围”,因为消息对象没有任何属性或方法会引导您进入另一个公会或另一个公会中的频道/消息公会。

您可以访问哪些对象可以获取有关您的机器人所在的任何公会的信息?只有一个,代表您的机器人本身的对象:client。幸运的是,我们可以通过 client 访问您的 message 对象。所以这里是我们如何修复我上面指出的有问题的代码行:

return await message.client.guilds.cache.get(this.guildId).channels.cache.get(this.channelId).messages.cache.get(this.id);

说明

那么我们的新代码行有什么作用呢?好吧,我们首先使用 message.client 获取我们的机器人客户端的对象。然后,我们使用 client.guilds.cache 获取机器人所在的所有公会,并专门使用我们正在寻找的 ID 获取公会。然后我们使用 guild.channels.cache 对我们正在寻找的频道和频道 ID 执行相同的操作。最后,我们再次使用 channel.messages.cache 对频道的消息和我们正在寻找的消息 ID 执行相同的操作。

当您将来遇到此类问题时,请更仔细地查看文档。我在下面提供了此答案的每个组件的文档链接,供您参考。

相关资源

https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=guilds https://discord.js.org/#/docs/main/stable/class/Guild?scrollTo=channels https://discord.js.org/#/docs/main/stable/class/TextChannel?scrollTo=messages