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 中的角色?