反应事件 discord.js
我正在尝试用我的机器人制作右舷代码,其他一切都运行良好.但我正试图让机器人忽略实际消息作者的反应.
I'm trying to make a starboard code with my bot, and everything else is working good. But I'm trying to make it to where the bot ignores reactions from the author of the actual message.
这是我当前的代码:
client.on('messageReactionAdd', (reaction_orig, message, user) => {
if (message.author.id === reaction_orig.users.id) return
manageBoard(reaction_orig)
})
它返回以下错误:
if (message.author.id === reaction_orig.users.id) return;
^
TypeError: Cannot read property 'id' of undefined
推荐答案
问题是 messageReactionAdd
有两个参数;消息反应为第一个,应用表情符号的用户为第二个.当您编写 reaction_orig, message, user
时,reaction_orig
是反应(这是正确的),但 message
是做出反应的用户,因为它是第二个参数.user
变量将为 undefined
.
The problem is that messageReactionAdd
takes two parameters; the message reaction as the first one, and the user that applied the emoji as the second one. When you write reaction_orig, message, user
, reaction_orig
is the reaction (which is correct), but message
is the user who reacted as it's the second parameter. The user
variable will be undefined
.
另一个问题是 reaction_orig.users
返回一个 ReactionUserManager 没有 id
属性.幸运的是,user
已经传递给您的回调,因此您可以使用它的 ID.
Another issue is that reaction_orig.users
returns a ReactionUserManager that doesn't have an id
property. Luckily, the user
is already passed down to your callback so you can use its ID.
另外,reaction_orig
有一个 message
属性,即此反应所引用的原始消息,因此您可以从中获取其作者的 ID.
Also, reaction_orig
has a message
property, the original message that this reaction refers to so you can get its authors' ID from it.
您可以将您的代码更改为此工作:
You can change your code to this to work:
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
启用部分结构,例如这个:
However, the code above only works on cached messages, ones posted after the bot is connected. Reacting on older messages won't fire the messageReactionAdd
event. If you also want to listen to reactions on old messages you need to enable partial structures for MESSAGE
, CHANNEL
and REACTION
when instantiating your client, like this:
const client = new Discord.Client({
partials: ['MESSAGE', 'CHANNEL', 'REACTION'],
});
您可以检查消息是否被缓存,例如检查它的 author
属性是否不是 null
.如果是null
,你可以获取消息.现在,您拥有消息作者和做出反应的用户,因此您可以比较他们的 ID:
You can check if the message is cached by e.g. checking if its author
property is not null
. If it's null
, you can fetch the message. Now, you have both the message author and the user who reacted, so you can compare their IDs:
// 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);
});
相关文章