因此,我正在为不和谐的机器人设置黑名单功能,您基本上只是在其中输入一个单词和一个角色,如果有人担任该角色,那么...会发生什么?还不是很确定。但是当我尝试遍历成员的角色时,出现此错误:
(node:21803) UnhandledPromiseRejectionWarning: TypeError: message.member.roles is not iterable
这是我的代码:
for (const word of message.content.split(" ")) {
for (const role of message.member.roles) {
console.log(role.name);
}
}
关于如何解决此问题的任何想法?
答案 0 :(得分:1)
我不确定您指的是什么角色,但我想您是在谈论公会角色。您可以从消息中获取公会,然后是RoleManager,因此可以映射其缓存以获取其中的所有角色。这是您的操作方式:
const roles = message.guild.roles.cache.map(role => role);
与Javascript中的任何其他数组一样,您可以使用forEach循环遍历它。
// This log every role in the Guild the message was sent
roles.forEach(role => {
console.log(role);
});
对于提到的用户,您可以通过MessageMentions对象获取它。这样:
// In case you want the User Object
const user = message.mentions.users.first();
// In case you want the GuildMember object (most likely)
const member = message.mentions.members.first();
有了这一点,我认为您可以解决您要达到的目标。无论如何,如果您正在谈论消息中提到的角色,则可以像用户一样(从MessageMentions对象中)获得它。
const role = message.mentions.roles.first();
正如您所说,您不确定要执行的操作,但是如果这就像一个'将用户分配给角色'命令,则可以执行以下操作:< / p>
const member = message.mentions.members.first();
const role = message.mentions.roles.first();
member.roles.add(role);
// !command @user @role - adds the user to the role
或者,如果这是整个时间,您只是尝试遍历该成员的角色。它的工作原理与第一个示例差不多。你去了
// In case you want the mentioned user
const member = message.mentions.members.first();
// In case you want the message author user
const member = message.member;
// Map the User Roles
const roles = member.roles.cache.map(role => role);
// Iterate though it =)
roles.forEach(role => {
console.log(role);
});
有用的链接:
Message#guild | discord.js
Guild#roles | discord.js
RoleManager#cache | discord.js
答案 1 :(得分:0)
如果您使用的是v12+
,则必须通过GuildMemberRoleManager
属性传递cache
for (const role of message.member.roles.cache) {
// ...