角色未添加到成员

时间:2021-01-16 17:49:29

标签: javascript discord.js

我有一些代码可以检测某人何时输入命令 role 并为他们赋予角色,并将第一个参数的名称传递给命令 (args[0])。例如,机器人会尝试检测诸如 !role nameOfTheRole 之类的东西,这将为用户提供名称为 nameOfTheRole 的角色。

但是,代码不起作用,我不知道为什么。这是我到目前为止所得到的:


var cmdmap = {
    role: gimmerole
}

function gimmerole(member, args, message) {
    var memb = message.member() //<------- ERROR

    const role = memb.guild.roles.find(r => r.name == args[0])
    memb.roles.add(role)
}

client.on('message', (msg) => {
    var cont   = msg.content,
        author = msg.member,
        chan   = msg.channel,
        guild  = msg.guild

    if (author.id != client.user.id && cont.startsWith(config.prefix)) {

        var invoke = cont.split(' ')[0].substr(config.prefix.length),
            args   = cont.split(' ').slice(1)

        console.log(invoke, args)
        if (invoke in cmdmap) {
            cmdmap[invoke](msg, args)
        }
    }

})

3 个答案:

答案 0 :(得分:0)

我注意到您试图寻找角色的方式不当。为了获得完整的角色集合,您需要使用 cachemessage.guild.roles 方法,结果如下:

const roleObject = memb.guild.roles.cache.find(...);

答案 1 :(得分:0)

我对您的代码进行了一些修改:

  • 我将 function gimmerole(member, args, message) { 行更改为 function gimmerole(message, args) {,就像在 cmdmap[invoke](msg, args); 行中一样,您使用消息对象和参数调用它,因此消息被分配给 {{ 1}} 而 member 本来是 message
  • 我将 undefined 更改为 message.member(),因为 message.membermember 的属性,而不是方法。
  • 我还更改了解析消息并将其拆分为命令和参数的代码,使其更加清晰。
  • 添加了健全性检查 (message),以便在角色不存在时将机器人记录到控制台。
  • if (!role) return console.log(`The role "${args[0]}" does not exist`); 更改为 args[0] 以启用要指定空格的角色。
args.join(' ')

如果您想要跟随某些东西,可以使用 Discord.js Guide。这真的很有帮助而且很详细。

答案 2 :(得分:0)

var cmdmap = {

role: gimmerole

};

函数 gimmerole(message, args) {

const member = message.member;

const role = message.guild.roles.cache.find(r => r.name === args.join(' '));
if (!role) return console.log(`The role "${args.join(' ')}" does not exist`);

member.roles.add(role);

}

client.on('message', (msg) => {

var cont   = msg.content,
    author = msg.member,
    chan   = msg.channel,
    guild  = msg.guild;

if (author.id !== client.user.id && cont.startsWith(config.prefix)) {

    const [invoke, ...args] = cont.slice(config.prefix.length).trim().split(' ');

    console.log(invoke, args);
    if (invoke in cmdmap) {
        cmdmap[invoke](msg, args);
    }
}

}

  • 感谢 Deamon Beast