Estoy trabajando en un bot que necesita verificar algunas cosas antes de otorgar/eliminar un rol de un usuario, pero por alguna razón, las .has() , .some( .some() , .add() y .remove() no trabajes
Aquí está mi código:
const Permissions = require('discord.js'); function isAdmin(member) { return member.permissions.has(Permissions.FLAGS.ADMINISTRATOR); } function hasRole(member, roleID) { return member.roles.some(role => role.id === roleID); } function giveRole(member, role) { member.roles.add(role) } function removeRole(member, role) { member.roles.remove(role); }Aquí está el error completo que me sale:
TypeError: member.roles.add is not a function at Object.giveRole (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\util.js:101:30) at Object.buttonClicked (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\commands\buttonRole\execute.js:23:14) at WebSocketManager.<anonymous> (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\index.js:101:28) at WebSocketManager.emit (node:events:390:28) at WebSocketShard.onMessage (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\discord.js\src\client\websocket\WebSocketShard.js:300:54) at WebSocket.onMessage (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\ws\lib\event-target.js:199:18) at WebSocket.emit (node:events:390:28) at Receiver.receiverOnMessage (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\ws\lib\websocket.js:1137:20) at Receiver.emit (node:events:390:28) at Receiver.dataMessage (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\ws\lib\receiver.js:528:14) at Receiver.getData (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\ws\lib\receiver.js:446:17) at Receiver.startLoop (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\ws\lib\receiver.js:148:22) at Receiver._write (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\ws\lib\receiver.js:83:10) at writeOrBuffer (node:internal/streams/writable:389:12) at _write (node:internal/streams/writable:330:10) at Receiver.Writable.write (node:internal/streams/writable:334:10) at TLSSocket.socketOnData (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\ws\lib\websocket.js:1231:35) at TLSSocket.emit (node:events:390:28) at addChunk (node:internal/streams/readable:315:12) at readableAddChunk (node:internal/streams/readable:289:9) at TLSSocket.Readable.push (node:internal/streams/readable:228:10) at TLSWrap.onStreamRead (node:internal/stream_base_commons:199:23)Después de revisar las clases de Discord.js, descubrí que no puedes simplemente usar
let member = interaction.member;para obtener un miembro del gremio, pero en su lugar, tienes que hacer
let member = await guild.members.fetch("ID"); Después de hacer eso, las member.permissions.has , member.roles.add y member.roles.remove funcionan.
La única función que aún no funciona es member.roles.some , esto se debe a que la clase GuildMemberRoleManager solo tiene funciones de add , set y remove . La función member.roles.some se puede cambiar para usar member._roles ya que devuelve una lista de cadenas que contienen todos los roles que tiene el miembro del gremio y se puede hacer así:
function hasRole(member, roleID) { return member._roles.indexOf(roleID) >= 0; }En Discord.js versión 12, la sintaxis cambió en su mayoría. La propiedad de caché ahora contiene el caché para muchos de los roles, y existe la posibilidad de que necesite usar una Promesa y buscarla...
// in an ASYNC FUNCTION let roles = await member.roles.fetch(); return roles.some(role => role.id === roleID);¿Intentaste así?
var role = message.guild.roles.cache.find(role => role.name === "Role_Name") member.roles.add(role) var role = message.guild.roles.cache.find(role => role.id === "Role_Id") member.roles.add(role)