为什么我的Discord机器人在命令后立即崩溃?

时间:2020-09-25 12:42:17

标签: discord discord.js

我制作了Discord机器人来处理“反应角色”。用户可以对消息做出反应以获得角色。

现在,添加了嵌入和反应,但随后崩溃了:

embedMsg.message.react('?') ^

TypeError:无法读取未定义的属性“ react” 在客户处。 (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 [作为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 个答案:

答案 0 :(得分:2)

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进行修复。