情况
我创建了一个简单的Discord机器人,它使用消息嵌入来运行文本风格的冒险任务。在通道中调用机器人时,它会记录调用它的用户的iD,并确保用户只能与按钮进行交互,当另一个用户尝试交互时会出现错误。我一直在我的个人服务器(和其他新服务器)上测试这个机器人,它一直工作得很好,在存储用户id和每次交互时都没有问题。
机器人程序只需要以下权限:查看消息/查看频道
管理消息
嵌入链接
发送消息
并发症
现在机器人程序和任务已经完成,我已经将其添加到我们打算运行它的服务器上(使用相同的权限链接),当用户启动机器人程序并单击播放按钮时,它会出现如下权限错误:(https://i.ibb.co/pWN0Hw1/unknown.png)这表明它没有存储正确启动命令的用户的用户iD,尽管它在其他服务器上运行良好(即用户可以继续任务而不会返回错误)。
完整代码的摘录涵盖了iD的存储并根据交互进行检查,如下所示:
const { Client, Intents, MessageEmbed, MessageActionRow, MessageButton } = require('discord.js'),
client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES ] });
client.db = require("quick.db");
var config = {
token: "Removed",
prefix: "/",
adminID: "admin id",
embed_color: "#ffffff"
};
var quiz = require("./quiz.json");
client.login(config.token);
client.on('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
if ([null, undefined].includes(client.db.get(`quiz`))) client.db.set(`quiz`, {});
if ([null, undefined].includes(client.db.get(`quiz.spawns`))) client.db.set(`quiz.spawns`, {});
});
client.on('messageCreate', async (message) => {
if (!message.content.startsWith(config.prefix)) return;
const args = message.content.slice(config.prefix.length).trim().split(/ +/g);
const command = args.shift();
if (command == "unlock") {
message.delete();
const m = await message.channel.send(getMMenuPage());
client.db.set(`quiz.spawns.m${m.id}`, message.author.id);
}
});
client.on('interactionCreate', async (interaction) => {
if (interaction.isButton()) {
if (client.db.get(`quiz.spawns.m${interaction.message.id}`) != interaction.user.id) return interaction.reply(getMessagePermissionError(client.db.get(`quiz.spawns.m${interaction.message.id}`)));
const q = quiz;
这是错误处理程序:
}
function getMessagePermissionError(ownerId) {
return {
embeds: [
new MessageEmbed()
.setTitle(`Permission Error`)
.setDescription(`This game was started by another user: <@${ownerId}>nIf you want to play by yourself, use the command **/unlock**`)
],
ephemeral: true
};
}
当应用完全相同的权限时,这在某些服务器上有效,但在特定的服务器上无效,这有什么原因吗?
谢谢你的帮助。
在我发现目标服务器将双因素身份验证(2fa)作为各种权限的标准要求后,我设法解决了这个错误,即使为用户/机器人提供了某些权限,如果没有2fa设置,他们也无法执行此操作。
我忘了为附加到机器人的帐户设置2fa。设置后,会返回上面的代码和所需的输出。
我希望这能帮助其他有同样问题的人。