简体   繁体   English

TypeError: member.roles.add 不是 function (discord.js v13)

[英]TypeError: member.roles.add is not a function (discord.js v13)

I'm working on a bot that needs to check some things before giving/removing a role from a user, but for some reason, the .has() , .some() , .add() and, .remove() functions don't work.我正在开发一个机器人,它需要在授予/删除用户角色之前检查一些事情,但出于某种原因, .has().some().add().remove()函数不工作。

Here's my code:这是我的代码:

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);
}

Here's the full error that I get:这是我得到的完整错误:

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)

After looking through the Discord.js classes, I found out that you cannot simply use浏览完 Discord.js 类后,我发现你不能简单地使用

let member = interaction.member;

to get a guild member, but instead, you have to do获得公会成员,但相反,你必须做

let member = await guild.members.fetch("ID");

After doing that, the member.permissions.has , member.roles.add and member.roles.remove functions all work!这样做之后, member.permissions.hasmember.roles.addmember.roles.remove函数都可以工作了!

The only function that still doesn't work is the member.roles.some , this is because the GuildMemberRoleManager class only has add , set , and remove functions.唯一仍然不起作用的 function 是member.roles.some ,这是因为GuildMemberRoleManager class 只有addsetremove功能。 The member.roles.some function can be changed to use member._roles as it returns a list of Strings containing all the roles the guild member has and can be done as such: member.roles.some function 可以更改为使用member._roles因为它返回一个字符串列表,其中包含公会成员拥有的所有角色,并且可以这样做:

function hasRole(member, roleID) {
    return member._roles.indexOf(roleID) >= 0;
}

In Discord.js version 12, the syntax mostly changed.在 Discord.js 版本 12 中,语法大部分发生了变化。 The cache property now contains the cache for a lot of the roles, and there is a chance you need to use a Promise and fetch it...缓存属性现在包含许多角色的缓存,您有可能需要使用 Promise 并获取它...

// in an ASYNC FUNCTION
let roles = await member.roles.fetch();
return roles.some(role => role.id === roleID);

Did you tried like this?你试过这样吗?

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)

When doing anything with roles, and most stuff in general, you need to access it via the cache , for example:在对角色做任何事情时,以及大多数一般情况下,您需要通过cache访问它,例如:

  function hasRole(member, roleID) {
      return member.roles.cache.some(role => role.id === roleID);
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM