问题是messageReactionAdd有两个参数;消息反应为第一个,应用表情符号的用户为第二个。当你写reaction_orig, message, user 时,reaction_orig 是反应(这是正确的),但message 是反应的用户,因为它是第二个参数。 user 变量将是 undefined。
另一个问题是reaction_orig.users 返回一个没有id 属性的ReactionUserManager。幸运的是,user 已经传递给您的回调,因此您可以使用它的 ID。
另外,reaction_orig 有一个 message 属性,这是此反应所指的原始消息,因此您可以从中获取其作者的 ID。
您可以将您的代码更改为此工作:
client.on('messageReactionAdd', (reaction_orig, user) => {
if (reaction_orig.message.author.id === user.id) {
// the reaction is coming from the same user who posted the message
return;
}
manageBoard(reaction_orig);
});
但是,上面的代码仅适用于缓存消息,即在机器人连接后发布的消息。对旧消息做出反应不会触发 messageReactionAdd 事件。如果您还想听取对旧消息的反应,则需要在实例化客户端时启用 MESSAGE、CHANNEL 和 REACTION 的部分结构,如下所示:
const client = new Discord.Client({
partials: ['MESSAGE', 'CHANNEL', 'REACTION'],
});
您可以检查消息是否被缓存,例如检查其author 属性是否不是null。如果是null,你可以fetch the message。现在,您拥有消息作者和做出反应的用户,因此您可以比较他们的 ID:
// make sure it's an async function
client.on('messageReactionAdd', async (reaction_orig, user) => {
// fetch the message if it's not cached
const message = !reaction_orig.message.author
? await reaction_orig.message.fetch()
: reaction_orig.message;
if (message.author.id === user.id) {
// the reaction is coming from the same user who posted the message
return;
}
// the reaction is coming from a different user
manageBoard(reaction_orig);
});