为啥我的 Discord 机器人在发出命令后立即崩溃?
Posted
技术标签:
【中文标题】为啥我的 Discord 机器人在发出命令后立即崩溃?【英文标题】:Why does my Discord bot immediately crash after a command?为什么我的 Discord 机器人在发出命令后立即崩溃? 【发布时间】:2021-01-11 19:20:33 【问题描述】:我制作了一个 Discord 机器人来处理“反应角色”。用户可以对消息做出反应以获得角色。
现在,嵌入和反应已添加,但之后立即崩溃:
embedMsg.message.react('????') ^
TypeError:无法读取未定义的属性“反应” 在客户端。 (C:\Users\rdvdn\Desktop\Bot\Bot.js:19:34) 在 Client.emit (events.js:311:20) 在 MessageCreateAction.handle (C:\Users\rdvdn\Desktop\Bot\node_modules\discord.js\src\client\actions\MessageCreate.js:31:14) 在 Object.module.exports [as MESSAGE_CREATE] (C:\Users\rdvdn\Desktop\Bot\node_modules\discord.js\src\client\websocket\handlers\MESSAGE_CREATE.js:4:32) 在 WebSocketManager.handlePacket (C:\Users\rdvdn\Desktop\Bot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:384:31) 在 WebSocketShard.onPacket (C:\Users\rdvdn\Desktop\Bot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:444:22) 在 WebSocketShard.onMessage (C:\Users\rdvdn\Desktop\Bot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:301:10) 在 WebSocket.onMessage (C:\Users\rdvdn\Desktop\Bot\node_modules\ws\lib\event-target.js:125:16) 在 WebSocket.emit (events.js:311:20) 在 Receiver.receiverOnMessage (C:\Users\rdvdn\Desktop\Bot\node_modules\ws\lib\websocket.js:797:20)
我认为该错误可能是由于 Discord.js 的 v12 造成的。 我不确定它为什么会崩溃,但确实添加了嵌入和反应,如果我能得到任何帮助,我将不胜感激。
我现在的代码如下:
const Client, MessageEmbed = require('discord.js');
const client = new Client();
const TOKEN = require('./config.json');
client.login(TOKEN.token);
client.on('ready', () =>
console.log("Bot is online and ready!")
)
client.on('message', message =>
if(message.author.bot)
if(message.embeds)
const embedMsg = message.embeds.find(msg => msg.title === 'Application Access');
if(embedMsg)
embedMsg.message.react('????')
.then(reaction => reaction.message.react('????'))
.catch(err => console.error);
return;
if(message.content.toLowerCase() === ']roles')
const embed = new MessageEmbed();
embed.setTitle("Application Access");
embed.setColor("GREEN");
embed.setDescription("React with the emoji and you will be able to apply for Logistics!\n" +
"\n" +
"\???? - Applicant");
message.channel.send(embed);
)
client.on('messageReactionAdd', (reaction, user) =>
if(user.bot)
return;
var roleName = "Applicant";
var role = reaction.message.guild.roles.find(role => role.name.toLowerCase() === roleName.toLowerCase());
var member = reaction.message.guild.members.find(member => member.id === user.id);
member.addRole(role.id).then(member =>
console.log("Added " + member.user.username + " to Applicant.");
).catch(err => console.error);
);
client.on('messageReactionRemove', (reaction, user) =>
if(user.bot)
return;
var roleName = "Applicant";
var role = reaction.message.guild.roles.find(role => role.name.toLowerCase() === roleName.toLowerCase());
var member = reaction.message.guild.members.find(member => member.id === user.id);
if(member.roles.has(role.id))
member.removeRole(role.id).then(member =>
console.log("Removed " + member.user.username + " from Applicant role.");
).catch(err => console.error);
)
感谢任何帮助!
【问题讨论】:
【参考方案1】:message
不是 MessageEmbed
属性,这就是您的机器人出错的原因。
// change:
const embedMsg = message.embeds.find(
(msg) => msg.title === 'Application Access'
);
if (embedMsg)
embedMsg.message
.react('?')
.then((reaction) => reaction.message.react('?'))
.catch((err) => console.error);
// to:
if (message.embeds[0].title === 'Application Access')
message
.react('?') // you can't react to the same message twice
.catch(console.error);
另外,您的代码中有很多过时的v11.x
函数,例如addRole()
。我建议查看this post 来修复它们。
【讨论】:
以上是关于为啥我的 Discord 机器人在发出命令后立即崩溃?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 Heroku Discord 机器人无法连接到端口后崩溃? [复制]
我的 Discord 机器人多次响应一个命令,我想知道是不是有办法只发送一次