discord.js V12中根据反应赋予角色时出错

Posted

技术标签:

【中文标题】discord.js V12中根据反应赋予角色时出错【英文标题】:Error in the event of giving roles according to the reaction in the discord.js V12 【发布时间】:2021-06-06 00:46:43 【问题描述】:

错误

(node:6880) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'roles' of undefined
    at Client.<anonymous> (C:\Users\Pc\Desktop\RemakeTO\bot.js:307:23)
    at Client.emit (events.js:327:22)
    at WebSocketShard.onMessage (C:\Users\Pc\Desktop\RemakeTO\node_modules\discord.js\src\client\websocket\WebSocketShard.js:295:27)
    at WebSocket.onMessage (C:\Users\Pc\Desktop\RemakeTO\node_modules\ws\lib\event-target.js:132:16)
    at WebSocket.emit (events.js:315:20)
    at Receiver.receiverOnMessage (C:\Users\Pc\Desktop\RemakeTO\node_modules\ws\lib\websocket.js:825:20)
    at Receiver.emit (events.js:315:20)
    at Receiver.dataMessage (C:\Users\Pc\Desktop\RemakeTO\node_modules\ws\lib\receiver.js:437:14)
    at Receiver.getData (C:\Users\Pc\Desktop\RemakeTO\node_modules\ws\lib\receiver.js:367:17)
    at Receiver.startLoop (C:\Users\Pc\Desktop\RemakeTO\node_modules\ws\lib\receiver.js:143:22)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:6880) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:6880) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

代码

/*
**** Constantes
*/

const Discord = require("discord.js"); //Aqui definimos a discord.js em nosso código, caso dê erro nessa linha, só dê npm i discord.js no console ;v
const bot     = new Discord.Client() // Aqui definimos o bot ( bot )
const config  = require("./config.js"); //Aqui definimos o config.js em nosso código, ele vai servir pro bot logar e sabermos o prefix do bot sem definir algo novamente, caso dê erro nessa linha, cheque o arquivo config.js, digitação dessa linha e se o arquivo config.js e a pasta utils existem :v
const fs      = require("fs") //Aqui definimos o fs em nosso código, ele vai servir pro nosso Handler, caso dê erro nessa linha, só dê npm i fs no console ;v

bot.commands  = new Discord.Collection();
bot.aliases   = new Discord.Collection();

/*
**** Handler
*/

fs.readdir("./comandos/", (err, files)=>  //pedimos para o fs ler a pasta comandos
    if(err) return console.log(`Houve um erro:\n$err`); //se tiver um erro, ele não executará o que estiver abaixo e irá retornar com um log no console
    let jsfile = files.filter(f => f.split(".").pop() === "js") //aqui a gente define files para diferenciar os arquivos com .js dos sem .js
    if(jsfile.length <= 0) 
        return console.log('Não encontrei nenhum comando.')
    ;
    jsfile.forEach((f, i) =>  //aqui dizemos que para cada arquivo com .js na pasta, iremos fazer a seguinte coisa:
        let pull = require(`./comandos/$f`); //iremos definir comando
        bot.commands.set(pull.config.name, pull); //iremos setar o nome do comando/local na collection comandos
        console.log(`[Carregando] > $f`); //aqui colocamos para que o bot envie os comandos carregados para o console
        pull.config.aliases.forEach(alias =>  //aqui dizemos que para cada aliases do comand
            bot.aliases.set(alias, pull.config.name) //setar a aliases/nome do comando na collection aliases
        );
    );
);

/*
**** Primeiro Evento
*/

let status = [
    name: `Skins no Netflix!`, type: `WATCHING`,
    name: `a felicidade!`, type: "STREAMING", url: "https://www.twitch.tv/zpandakst_",
    name: `o jogo da vida!`, type: `PLAYING`,
   //name: 'msg4', type: 'STREAMING', url: 'https://www.twitch.tv/hinami_fueguchi_', 
   
  ];
  
  //STREAMING = TRANSMITINDO
  //LISTENING = OUVINDO
  //PLAYING = JOGANDO
  //WATCHING = ASSISTINDO

bot.on('ready', () => 
    var embed = new Discord.MessageEmbed()
    .setTitle(`:pushpin: | Iniciando...`)
    .setDescription(`:white_small_square: | Utilitários **Iniciado** \n \n Dados: \n ▸ Usuários: $bot.users.size \n ▸ Canais: $bot.channels.size`)
    .setThumbnail(bot.user.avatarURL)
    .setTimestamp()
    bot.channels.cache.get(`814858116021616670`).send(embed);
    // bot.guilds.get(`771513497069682711`).channels.get(`814858116021616670`).send(embed)
  
    function setStatus() 
        let randomStatus = status[Math.floor(Math.random() * status.length)];
        bot.user.setPresence(game: randomStatus);
    
  
    setStatus();
    setInterval(() => setStatus(), 7000); //1000/1s\10000/10s\100000/1m
  );
  
  bot.on("ready", () => 
    console.log('Estou online.')
    /*
    * PLAYING = Jogando. Exemplo - bot.user.setActivity('oi', type: 'PLAYING');
    * WATCHING = Assistindo. Exemplo - bot.user.setActivity('oi', type: 'WATCHING');
    * LISTENING = Ouvindo. Exemplo - bot.user.setActivity('oi', type: 'LISTENING');
    * STREAMING = Transmitindo. Exemplo - bot.user.setActivity('oi', type: 'STREAMING', url: 'twitch');
    */
);

/*
**** Evento Join
*/


bot.on('guildMemberAdd', guildMember =>
    let semRegistro = guildMember.roles.cache.find(role => role.id === '818270808543723520');
    let separatorRole1 = guildMember.roles.cache.find(role => role.id === '786364288520552449');
    let separatorRole2 = guildMember.roles.cache.find(role => role.id === '786364299940593666');
    let separatorRole3 = guildMember.roles.cache.find(role => role.id === '786364304579624970');
    let separatorRole4 = guildMember.roles.cache.find(role => role.id === '786364307650379816');
    let separatorRole5 = guildMember.roles.cache.find(role => role.id === '786364310954835999');
    let separatorRole6 = guildMember.roles.cache.find(role => role.id === '786364313274679336');

    guildMember.addRole(semRegistro);
    guildMember.addRole(separatorRole1);
    guildMember.addRole(separatorRole2);
    guildMember.addRole(separatorRole3);
    guildMember.addRole(separatorRole4);
    guildMember.addRole(separatorRole5);
    guildMember.addRole(separatorRole6);
);

/*
**** Evento Message
*/

bot.on('message', async(message) =>  // Sempre que ocorrer uma mensagem, esse evento é executado ;v
    if(message.author.bot) return; //Se o author da mensagem, ou seja, quem mandou a mensagem, for um bot, ele não executará o código
    if(message.channel.type === 'dm') return; //Se o canal que a mensagem foi mandada for na DM ( Direct Messages, ou seja, as mensagens privadas ), ele não executará o código
    if(message.content.includes('<@'+bot.user.id+'>')) //Qunado algun usuário mencionar o bot ele vai mandar uma mensagem
        message.channel.send(`$message.author, meu prefixo é \`$config.prefix\``);
    
    if(!message.content.startsWith(config.prefix)) return; //Se a mensagem não começar com o prefix, ele não executará o código

    let args = message.content.slice(config.prefix.length).trim().split(/ +/g); // Aqui definimos args
    let comando = args.shift().toLowerCase(); // Definição de comando
    let ma = message.content.split(' ');
    let cmd = ma[0];
    
    let commandFile = bot.commands.get(cmd.slice(config.prefix.length)) || bot.commands.get(bot.aliases.get(cmd.slice(config.prefix.length))) // Aqui definimos "cmd" para buscar os comandos na collection
    if (commandFile) commandFile.run(bot, message, args)//Se existir o comando o bot executará o comando usando a function "run"
);

/*
**** Evento Cargos Regiões
*/

bot.on('raw', async dados => 
    if(dados.t !== "MESSAGE_REACTION_ADD" && dados.t !== "MESSAGE_REACTION_REMOVE") return
    if(dados.d.message_id != "818315405143441438") return

    let servidor = bot.guilds.cache.get("771513497069682711")
    let membro = servidor.members.cache.get(dados.d.user_id)

    dados.d.mesage_id !="818315405143441438".react("")

    let cargoNRD = servidor.roles.cache.get('786364289282736128'),
        cargoNRT = servidor.roles.cache.get('786364289610809387'),
        cargoCTR = servidor.roles.cache.get('786364290672230470'),
        cargoSUL = servidor.roles.cache.get('786364291514499082'),
        cargoSDT = servidor.roles.cache.get('786364292252696576')

    if(dados.t === "MESSAGE_REACTION_ADD")
        if(dados.d.emoji.id === "????")
            if(membro.roles.has(membro.roles.has(cargoNRD))) return
            membro.addRole(cargoNRD)
        else if(dados.d.emoji.name === "????")
            if(membro.roles.has(cargoNRT)) return
            membro.addRole(cargoNRT)
        else if(dados.d.emoji.id === "????????")
            if(membro.roles.has(cargoCTR)) return
            membro.addRole(cargoCTR)
        else if(dados.d.emoji.id === "????")
            if(membro.roles.has(cargoSUL)) return
            membro.addRole(cargoSUL)
        else if(dados.d.emoji.id === "????")
            if(membro.roles.has(cargoSDT)) return
            membro.addRole(cargoSDT)
        
    
    if(dados.t === "MESSAGE_REACTION_REMOVE")
        if(dados.d.emoji.id === "????")
            if(membro.roles.has(cargoNRD)) return
            membro.removeRole(cargoNRD)
        else if(dados.d.emoji.name === "????")
            if(membro.roles.has(cargoNRT)) return
            membro.removeRole(cargoNRT)
        else if(dados.d.emoji.id === "????????")
            if(membro.roles.has(cargoCTR)) return
            membro.removeRole(cargoCTR)
        else if(dados.d.emoji.id === "????")
            if(membro.roles.has(cargoSUL)) return
            membro.removeRole(cargoSUL)
        else if(dados.d.emoji.id === "????")
            if(membro.roles.has(cargoSDT)) return
            membro.removeRole(cargoSDT)
        
    
)

/*
**** Evento Cargos Idades
*/

bot.on('raw', async dados => 
    if(dados.t !== "MESSAGE_REACTION_ADD" && dados.t !== "MESSAGE_REACTION_REMOVE") return
    if(dados.d.message_id != "818315637373272085") return

    let servidor = bot.guilds.cache.get("771513497069682711")
    let membro = servidor.members.cache.get(dados.d.user_id)

    let cargoI18 = servidor.roles.cache.get('786364300964134912'),
        cargoI17 = servidor.roles.cache.get('786364301660651531')

    if(dados.t === "MESSAGE_REACTION_ADD")
        if(dados.d.emoji.id === "????")
            if(membro.roles.has(cargoI17)) return
            membro.addRole(cargoI17)
        else if(dados.d.emoji.id === "????")
            if(membro.roles.has(cargoI18)) return
            membro.addRole(cargoI18)
        
    
    if(dados.t === "MESSAGE_REACTION_REMOVE")
        if(dados.d.emoji.id === "????")
            if(membro.roles.has(cargoI17)) return
            membro.removeRole(cargoI17)
        else if(dados.d.emoji.name === "????")
            if(membro.roles.has(cargoI18)) return
            membro.removeRole(cargoI18)
        
    
)

/*
**** Evento Cargos Relacionamentos
*/

bot.on('raw', async dados => 
    if(dados.t !== "MESSAGE_REACTION_ADD" && dados.t !== "MESSAGE_REACTION_REMOVE") return
    if(dados.d.message_id != "818316026063749130") return

    let servidor = bot.guilds.cache.get("771513497069682711")
    let membro = servidor.members.cache.get(dados.d.user_id)

    let cargoCSD = servidor.roles.cache.get('786364305289117716'),
        cargoNMR = servidor.roles.cache.get('786364306068996196'),
        cargoSLT = servidor.roles.cache.get('786364306954256384')

    if(dados.t === "MESSAGE_REACTION_ADD")
        if(dados.d.emoji.id === "????")
            if(membro.roles.has(membro.roles.has(cargoCSD))) return
            membro.addRole(cargoCSD)
        else if(dados.d.emoji.name === "????")
            if(membro.roles.has(cargoNMR)) return
            membro.addRole(cargoNMR)
        else if(dados.d.emoji.id === "????????")
            if(membro.roles.has(cargoSLT)) return
            membro.addRole(cargoSLT)
        
    
    if(dados.t === "MESSAGE_REACTION_REMOVE")
        if(dados.d.emoji.id === "????")
            if(membro.roles.has(cargoCSD)) return
            membro.removeRole(cargoCSD)
        else if(dados.d.emoji.name === "????")
            if(membro.roles.has(cargoNMR)) return
            membro.removeRole(cargoNMR)
        else if(dados.d.emoji.id === "????????")
            if(membro.roles.has(cargoSLT)) return
            membro.removeRole(cargoSLT)
        
    
)

/*
**** Evento Cargos Sexualidades
*/

bot.on('raw', async dados => 
    if(dados.t !== "MESSAGE_REACTION_ADD" && dados.t !== "MESSAGE_REACTION_REMOVE") return
    if(dados.d.message_id != "818316240077586504") return

    let servidor = bot.guilds.cache.get("771513497069682711")
    let membro = servidor.members.cache.get(dados.d.user_id)

    let cargoLGB = servidor.roles.cache.get('786364308061159466'),
        cargoHET = servidor.roles.cache.get('786364309093613588')

    if(dados.t === "MESSAGE_REACTION_ADD")
        if(dados.d.emoji.id === "????️‍????")
            if(membro.roles.has(membro.roles.has(cargoLGB))) return
            membro.addRole(cargoLGB)
        else if(dados.d.emoji.name === "????‍❤️‍????")
            if(membro.roles.has(cargoHET)) return
            membro.addRole(cargoHET)
        
    
    if(dados.t === "MESSAGE_REACTION_REMOVE")
        if(dados.d.emoji.id === "????️‍????")
            if(membro.roles.has(cargoLGB)) return
            membro.removeRole(cargoLGB)
        else if(dados.d.emoji.name === "????‍❤️‍????")
            if(membro.roles.has(cargoHET)) return
            membro.removeRole(cargoHET)
        
    
)

/*
**** Evento Cargos Gêneros
*/

bot.on('raw', async dados => 
    if(dados.t !== "MESSAGE_REACTION_ADD" && dados.t !== "MESSAGE_REACTION_REMOVE") return
    if(dados.d.message_id != "818316443937407016") return

    let servidor = bot.guilds.cache.get("771513497069682711")
    let membro = servidor.members.cache.get(dados.d.user_id)

    let cargoMLR = servidor.roles.cache.get('786364311794483200'),
        cargoHOM = servidor.roles.cache.get('786364312066588705')

    if(dados.t === "MESSAGE_REACTION_ADD")
        if(dados.d.emoji.id === "????")
            if(membro.roles.has(membro.roles.has(cargoMLR))) return
            membro.addRole(cargoMLR)
        else if(dados.d.emoji.name === "????")
            if(membro.roles.has(cargoHOM)) return
            membro.addRole(cargoHOM)
        
    
    if(dados.t === "MESSAGE_REACTION_REMOVE")
        if(dados.d.emoji.id === "????")
            if(membro.roles.has(cargoMLR)) return
            membro.removeRole(cargoMLR)
        else if(dados.d.emoji.name === "????")
            if(membro.roles.has(cargoHOM)) return
            membro.removeRole(cargoHOM)
        
    
)
//Login

bot.login(config.token);

根据discord.js V12中的反应分配角色时出错。我是否尝试过使用 member.roles.cache.some(cargoHOM) 方法?这个新版本的 discord.js 让我很困惑。我要疯了吗?也许,这一定只是一个我没有意识到的愚蠢错误

【问题讨论】:

Djs v12 引入了管理器的概念,也可以称之为缓存。您提供的代码使用了 v11。它们是 v12 中引入的许多 changes。检查文档一次。同样在您的情况下,membro 未定义,这意味着您提供的用于获取成员的 ID 是错误的。 请记住,您提到您使用的是 discord.js V12,但您的许多代码仍然来自 V11。例如,addRole 不再是一种方法,您需要使用cache 才能获取用户拥有的缓存角色的完整集合,这意味着membro.roles.has() 也不再可用。请确保您的代码是最新的。 【参考方案1】:

所以我一直在查看代码并搜索问题,但我有点困惑

if(dados.t === "MESSAGE_REACTION_ADD")
        if(dados.d.emoji.id === "?")
            if(membro.roles.has(membro.roles.has(cargoMLR))) return //function in function?
            membro.addRole(cargoMLR)
        else if(dados.d.emoji.name === "?")
            if(membro.roles.has(cargoHOM)) return //another way?
            membro.addRole(cargoHOM)
        
    

但我认为我发现了你的问题它看起来像机器人不知道这个角色。 299-300 行

let cargoMLR = servidor.roles.cache.get('786364311794483200');
let cargoHOM = servidor.roles.cache.get('786364312066588705');

如果解决了您的问题,请提供反馈:D

【讨论】:

以上是关于discord.js V12中根据反应赋予角色时出错的主要内容,如果未能解决你的问题,请参考以下文章

无法读取未定义 discord.js v12 的属性“角色”

如何添加 ID 保存在 JSON 文件 discord.js v12 中的角色?

v12 不会删除机器人的反应,但 v13 会删除机器人的反应 (discord.js)

如何从用户 discord.js v12 中删除所有角色?

角色反应 Discord Bot

TypeError:无法读取未定义 discord.js v12 的属性“发送”