Discord.js:向消息发送者添加角色

时间:2021-05-15 08:56:49

标签: javascript discord discord.js

我正在尝试制作一个 discord.js 机器人,当用户输入 +rolename 时为其添加角色。

这是我想出来的:

const { Client } = require("discord.js");
const { config } = require("dotenv");
const fs = require('fs');

const client = new Client({
    partials: ['MESSAGE', 'CHANNEL', 'REACTION']
});

config({
    path: __dirname + "/.env"
});

client.on("ready", () => {
    console.log(`Hi, ${client.user.username} is now online!`);
    client.user.setStatus('online');
    client.user.setActivity('me getting developed', { type: "WATCHING"})
        .then(() => console.log('bot status set'))
        .catch(console.error);
});

client.on("message", (message) => {
    if (message.content.startsWith("+")) {
        var args = message.content.split(' ');
        if (args.length == 1) {
            console.log(`message is created -> ${message}`);
            const { guild } = message;

            var passrole = args[0];
            var roleid = passrole.substring(1);
                
            var role = message.guild.roles.cache.find((role) => {
                return role.name == roleid;
            });
            
            console.log('role found')
            var authoruser = message.author.id;
            if (!role) {
                message.reply('this role does not exist')
                console.log('role does not exist')
                return;          
            }

            console.log(target)
            authoruser.roles.add(role)
                            
            console.log("role added")
        } else {
            message.reply('invalid argument length passed')
            return;
        }
    } else {
        return;
    }
});

client.login(process.env.TOKEN);

运行代码时出现以下错误:

<块引用>

类型错误:无法读取未定义的属性“添加”

当我使用此代码并键入 +test @DiscordName#0001 时不会发生这种情况:

const { Client } = require("discord.js");
const { config } = require("dotenv");
const fs = require('fs');

const client = new Client({
    partials: ['MESSAGE', 'CHANNEL', 'REACTION']
});

config({
    path: __dirname + "/.env"
})

client.on("ready", () => {
    console.log(`Hi, ${client.user.username} is now online!`);
    client.user.setStatus('online');
    client.user.setActivity('me getting developed', { type: "WATCHING"})
        .then(presence => console.log('bot status set'))
        .catch(console.error);
});

client.on("message", (message) => {
    let target = message.mentions.members.first();
    if (message.content.startsWith("+")) {
        var args = message.content.split(' ');
        if(args.length == 2){
            console.log(`message is created -> ${message}`);
            const { guild } = message;

            var passrole = args[0]
            var roleid = passrole.substring(1);
                
            var role = message.guild.roles.cache.find((role) => {
                return role.name == roleid;
            })
            
            console.log('role found')
            if (!role) {
                message.reply('role does not exist')
                console.log('role does not exist')
                return;          
            }

            console.log(target)
            target.roles.add(role)
                            
            console.log("role added")
        } else {
            message.reply('invalid argument length passed')
            return;
        }
    } else {
        return;
    }
});

client.login(process.env.TOKEN);

我的问题是:如何将角色添加到消息作者。

提前致谢

1 个答案:

答案 0 :(得分:1)

问题是您的 authoruser 是用户 ID(= 字符串)而不是成员。您不能向用户添加角色。此外,如果您获得角色的 id 而不是角色的名称,您可以使用角色的 id 添加角色。

client.on("message", message =>{
    if (message.content.startsWith("+")) {
        var args = message.content.split(' ');
        if (args.length !== 1) {
            message.reply('invalid argument count passed');
            return;
        }

        if (!message.member ||!message.guild) {
            message.reply('can only be used in guilds');
            return;
        }

        console.log(`message is created -> ${message}`);
        const { guild } = message;

        var passrole = args[0];

        var roleid = passrole.substring(1);
        
        // If you get the role's id then you won't need this
        var role = message.guild.roles.cache.find((role) => role.name == roleid);
            
        if (!role) {
            message.reply('this role does not exist');
            console.log('role does not exist');
            return;          
        }

        console.log('role found');
        console.log(target);

        message.member.roles.add(role);
        // If you get the role's id use this:
        message.member.roles.add(roleid);

        console.log('role added');
});