我一直在开发一个多功能机器人,既是一个小型项目,又是协助大学协会使用的Discord Server的运行,并且从一个静态JS文件过渡到模块化方法后,我遇到了一些问题,但这是我无法解决的问题。
该机器人目前对反应有2件事,其中一项工作正常:
1。-每个DM向该bot反馈的人,都会将其发布到指定的频道中,并竖起大拇指,然后竖起大拇指,人们可以发表自己的看法。一切正常,反应出现,控制台中没有捕获任何错误。
2。-机器人按需创建消息,每当有人对该消息做出反应时,该机器人都会发送一条消息,说“ X对Y做出反应”,同样,如果有人删除了该消息,则说相反。
但是,每当有人对此消息做出反应并在漫游器监视的通道中对任何消息进行响应时,都会记录一条错误,指出未定义反应的消息ID。>
下面是messageReactAdd
事件的代码,如果消息的ID与机器人正在“监视”的消息的ID相匹配,则会表明有人做出了反应。
messageReactionAdd.js
module.exports = async (react, user) => {
if(react.message.id === client.config.reactMsg)
react.message.channel.send("<@" + user.id +">" + " reacted with " + reaction.emoji);}
然后为每个反应发出一个事件,以便即使在机器人重启后我们也可以捕获到原始事件
raw.js
module.exports = async (client, packet) => {
if (!['MESSAGE_REACTION_ADD', 'MESSAGE_REACTION_REMOVE'].includes(packet.t)) return;
const channel = client.channels.get(packet.d.channel_id);
if (channel.messages.has(packet.d.message_id)) return;
const message = await channel.fetchMessage(packet.d.message_id);
const emoji = packet.d.emoji.id ? `${packet.d.emoji.name}:${packet.d.emoji.id}` : packet.d.emoji.name;
const reaction = message.reactions.get(emoji);
if (packet.t === 'MESSAGE_REACTION_ADD') {
client.emit('messageReactionAdd', reaction, client.users.get(packet.d.user_id));
console.log(reaction.message.id);
}
if (packet.t === 'MESSAGE_REACTION_REMOVE') {
client.emit('messageReactionRemove', reaction, client.users.get(packet.d.user_id));
}};
记录的实际错误如下:
(node:15713) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'id' of undefined
at module.exports (/discord/events/messageReactionAdd.js:2:26)
at Client.emit (events.js:188:13)
at Client.EventEmitter.emit (domain.js:441:20)
at MessageReactionAdd.handle (/discord/node_modules/discord.js/src/client/actions/MessageReactionAdd.js:24:31)
at MessageReactionAddHandler.handle (/discord/node_modules/discord.js/src/client/websocket/packets/handlers/MessageReactionAdd.js:7:39)
at WebSocketPacketManager.handle (/discord/node_modules/discord.js/src/client/websocket/packets/WebSocketPacketManager.js:103:65)
at WebSocketConnection.onPacket (/discord/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:333:35)
at WebSocketConnection.onMessage (/discord/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:296:17)
at WebSocket.onMessage (/discord/node_modules/ws/lib/event-target.js:120:16)
at WebSocket.emit (events.js:188:13)
一开始,即使机器人创建了自己的反应,也只会经历一次,并且记录了一个错误,指出找不到ID,但由于与反应模块保持了异步,并且反应正常,只是用户反应不再起作用。
(由于依赖异步/等待,我也知道我需要实现promise和catch)
更新-19/01/24
根据到目前为止的两个注释(谢谢!),当raw
事件发出反应事件时,messageReactionAdd
事件中的对象都是null / undefined,尽管是在建议的raw
事件,并通过额外的日志记录进行备份。
我猜想这与我实现异步的方式有关,因为当bot都在一个静态文件中时,所有这些都可以继续工作,并且可以继续工作,而且似乎两个事件都重叠了或有些东西-尽管我对此知之甚少它如何在Node JS中工作。