Discord.js 将特定角色添加到数组

Posted

技术标签:

【中文标题】Discord.js 将特定角色添加到数组【英文标题】:Discord.js add specific roles to array 【发布时间】:2021-06-17 22:05:28 【问题描述】:

我正在开发一个为用户分配角色的 Discord 机器人。如果被 ping 的用户和执行命令的用户具有特定角色,我想将其添加到 const 中。

const role1 = message.guild.roles.cache.find(role => role.name === "role1")
const role2 = message.guild.roles.cache.find(role => role.name === "role2")
const role3 = message.guild.roles.cache.find(role => role.name === "role3")
const roles = [ role1, role2, role3 ]
        
let pingedUser = message.mentions.members.first();
        
const userRole = roles.filter(role => pingedUser.roles.cache.has(role.id))
const ownRole = roles.filter(role => message.member.roles.cache.has(role.id));

console.log(userRole);
console.log(ownRole);

我在控制台中收到此错误:“无法读取未定义的属性 'roles'”

如果有人有解决方案,我会很高兴:)

编辑: 这就是我执行命令的方式(index.js):

client.on('message', message => 
    if (!message.content.startsWith(prefix) || message.author.bot) return;
    
    const args = message.content.slice(prefix.length).split(/ +/);
    const command = args.shift().toLowerCase();

    if (command === 'testcommand') 
        client.commands.get('testcommand').execute(message, args, Discord, client);
     
);

这是我的整个命令文件(commands/testcommand.js):

module.exports = 
    name: 'testcommand',
    description: "",
    async execute(message, args, Discord, client)     
        const role1 = message.guild.roles.cache.find(role => role.name === "role1")
        const role2 = message.guild.roles.cache.find(role => role.name === "role2")
        const role3 = message.guild.roles.cache.find(role => role.name === "role3")
        const roles = [ role1, role2, role3 ]
        
        let pingedUser = message.mentions.members.first();

        if (!pingedUser) 
            return
          

        const userRole = roles.filter(role => pingedUser.roles.cache.has(role.id))
        const ownRole = roles.filter(role => message.member.roles.cache.has(role.id));

        console.log(userRole);
        console.log(ownRole);
    
   

【问题讨论】:

【参考方案1】:

GuildMemberRoleManager#cache 返回一个Collection<Snowflake, Role>,其中Snowflake (id) 是键,Role 是值。因此,您应该检查该集合是否具有 role.id 键。您可以使用Array.prototype.filter 简化您的代码。在计算他们的角色之前确保pingedUser 存在。

if (!pingedUser) 
  return message.reply('User mention missing')


const roles = [role1, role2, role3]
const userRoles = roles.filter(role => pingedUser.roles.cache.has(role.id))

【讨论】:

感谢您的帮助。我稍微更改了代码并添加了您的建议,但现在我在控制台中遇到错误。我更新了帖子。如果你能提供帮助会很高兴:) @DavidB 该消息似乎没有任何用户提及。您可以在计算他们的角色之前检查pingedUser 是否存在。 这一行:“const userRole = roles.filter(role => pingedUser.roles.cache.has(role.id))” @DavidB 在进行编辑时,您不必删除您的实际问题。您可以添加编辑部分并添加您的后续问题。 现在它每次都返回,没有给我控制台输出(console.log):/

以上是关于Discord.js 将特定角色添加到数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 Discord.js 检测到添加的特定角色时删除另一个角色

无法添加角色,Discord.js

Discord.js v12 角色添加到提到的用户问题

使用参数 Discord.JS 按名称将用户添加到角色

Discord.js 如何列出具有特定角色的所有成员的显示名称

将 2 个 JSON 数组组合成成员角色 (DISCORD.JS)