Javascript 如何在discord bot上删除所有角色并添加一个角色,然后删除添加的角色并恢复以前的角色

Javascript 如何在discord bot上删除所有角色并添加一个角色,然后删除添加的角色并恢复以前的角色,javascript,discord,discord.js,roles,Javascript,Discord,Discord.js,Roles,我为discord bot编写了一行代码,用于删除特定的命名角色,并在特定时间内添加一个名为“mute”的角色。基本上,服务器只能有3个角色,一个可以发出命令,一个具有正常权限的“正常”级别,然后是一个“静音”角色。我的代码专门删除了普通角色,并添加了静音角色,因此他们没有任何权限 我将我的机器人添加到另一个有3个以上角色的服务器上,我决定给每个人一个普通的角色,同时也给他们一个静音的角色。当我运行该命令时,它会起作用,但由于人员具有其他角色,因此它允许继续说话,即使静音角色处于最高优先级 我的

我为discord bot编写了一行代码,用于删除特定的命名角色,并在特定时间内添加一个名为“mute”的角色。基本上,服务器只能有3个角色,一个可以发出命令,一个具有正常权限的“正常”级别,然后是一个“静音”角色。我的代码专门删除了普通角色,并添加了静音角色,因此他们没有任何权限

我将我的机器人添加到另一个有3个以上角色的服务器上,我决定给每个人一个普通的角色,同时也给他们一个静音的角色。当我运行该命令时,它会起作用,但由于人员具有其他角色,因此它允许继续说话,即使静音角色处于最高优先级

我的问题是,是否有一些代码,我可以删除它们的所有角色并添加静音角色。当静音期结束时,将删除静音角色并恢复其以前的角色?下面是我的代码:

 case 'mute':

    if(!message.member.roles.cache.find(r => r.name === "Admin")) return message.channel.send('You dont have permissions to do that you clown')

    let person = message.guild.member(message.mentions.users.first() || message.guild.members.get(args[1]))
    if(!person) return message.reply("User Doesn't Exist");

    let mainrole = message.guild.roles.cache.find(role => role.name == "normal");
    let muterole = message.guild.roles.cache.find(role => role.name == "muted");

    if(!muterole) return message.reply("Role Doesn't Exist");

    let time = args[2];

    if(!time){
        return message.reply("How Long?");
    }

    person.roles.remove(mainrole.id);
    person.roles.add(muterole.id);

    message.channel.send(`@${person.user.tag} has now been muted for ${ms(ms(time))}`);

    setTimeout(function(){
        person.roles.add(mainrole.id);
        person.roles.remove(muterole.id);
        message.channel.send(`@${person.user.tag} has now been unmuted`)
    }, ms(time));
        break;
    case 'help':
        const embed2 = new MessageEmbed()
        .setTitle("How To Get Commands")
        .setColor(0x00fff7)
        .setDescription("Do /commands to get the list of commands");

        message.author.send(embed2);
        break;

我不确定是否有更有效的方法,但您可以尝试以下方法:


循环浏览所有角色并将其保存到文件甚至数据库中,一旦时间用完,请删除禁用的角色并循环浏览已保存的角色列表以将其添加回来。

我不确定是否有更有效的方法来执行此操作,但您可以尝试以下操作:


循环浏览所有角色并将其保存到文件甚至数据库中,一旦时间用完,删除静音角色并循环浏览已保存角色列表以将其添加回。

最简单的方法是从用户处获取角色列表,清除其角色,然后申请静音角色。 然后,您可能希望缓存他们以前的角色,甚至将数据存储在数据库中,以防bot宕机,这样,一旦重启,您就可以获取数据并继续您停止的操作

这里有一个我在飞行中写的快速示例。您可能希望缓存角色的方式与我的方式稍有不同,因为我的方法只是为了快速演示,我强烈建议将数据保存到数据库或类似.json文件的文件中

let cachedUserRoles = {};

function addMutedRole(guildId, userId, roleId) {
    //Get the guild the user is apart of
    let guild = client.guilds.get(guildId);
    //Specify the user from the guild
    let guildMember = guild.members.get(userId);

    //Cache the users existing roles so we can restore them later
    cachedUserRoles[userId] = guildMember.roles.cache
    //Remove all roles from user
    guildMember.roles.set([])
        //Add the muted role after all roles have been removed with an array of the single role ID
        .then(member => member.roles.add([roleId]))
        //Catch and report any errors that might happen
        .catch(console.error)
}

function restoreRoles(guildId, userId) {
    //Get the guild the user is apart of
    let guild = client.guilds.get(guildId);
    //Specify the user from the guild
    let guildMember = guild.members.get(userId);
    //Get and set the user's previouse roles from cachedUserRoles and error log if anything goes wrong
    guildMember.roles.set(cachedUserRoles[userId]).catch(console.error)
}
在您的情况下,它看起来是这样的:

case 'mute':
        if(!message.member.roles.cache.find(r => r.name === "Admin")) return message.channel.send('You dont have permissions to do that you clown')

        let person = message.guild.member(message.mentions.users.first() || message.guild.members.get(args[1]))
        if(!person) return message.reply("User Doesn't Exist");

        let muterole = message.guild.roles.cache.find(role => role.name == "muted");

        if(!muterole) return message.reply("Role Doesn't Exist");

        let time = args[2];

        if(!time){
            return message.reply("How Long?");
        }

        //Cache their already existing roles
        cachedUserRoles[person.id] = person.roles.cache;
        //Set their roles to an empty array to clear them, then add the muted role once all roles were removed successfully
        person.roles.set([]).then(member => member.roles.add(muterole)).catch(console.error);

        message.channel.send(`@${person.user.tag} has now been muted for ${ms(ms(time))}`);

        setTimeout(function(){
            //Grab their existing roles and set them back to the user, we wont need to remove the muted role since setting the roles would override all existing ones already
            person.roles.set(cachedUserRoles[person.id]).catch(console.error)
            message.channel.send(`@${person.user.tag} has now been unmuted`)
        }, ms(time));
        break;
    case 'help':
        const embed2 = new MessageEmbed()
            .setTitle("How To Get Commands")
            .setColor(0x00fff7)
            .setDescription("Do /commands to get the list of commands");

        message.author.send(embed2);
        break;

最简单的方法是从用户那里获取角色列表,清除他们的角色,然后申请静音角色。 然后,您可能希望缓存他们以前的角色,甚至将数据存储在数据库中,以防bot宕机,这样,一旦重启,您就可以获取数据并继续您停止的操作

这里有一个我在飞行中写的快速示例。您可能希望缓存角色的方式与我的方式稍有不同,因为我的方法只是为了快速演示,我强烈建议将数据保存到数据库或类似.json文件的文件中

let cachedUserRoles = {};

function addMutedRole(guildId, userId, roleId) {
    //Get the guild the user is apart of
    let guild = client.guilds.get(guildId);
    //Specify the user from the guild
    let guildMember = guild.members.get(userId);

    //Cache the users existing roles so we can restore them later
    cachedUserRoles[userId] = guildMember.roles.cache
    //Remove all roles from user
    guildMember.roles.set([])
        //Add the muted role after all roles have been removed with an array of the single role ID
        .then(member => member.roles.add([roleId]))
        //Catch and report any errors that might happen
        .catch(console.error)
}

function restoreRoles(guildId, userId) {
    //Get the guild the user is apart of
    let guild = client.guilds.get(guildId);
    //Specify the user from the guild
    let guildMember = guild.members.get(userId);
    //Get and set the user's previouse roles from cachedUserRoles and error log if anything goes wrong
    guildMember.roles.set(cachedUserRoles[userId]).catch(console.error)
}
在您的情况下,它看起来是这样的:

case 'mute':
        if(!message.member.roles.cache.find(r => r.name === "Admin")) return message.channel.send('You dont have permissions to do that you clown')

        let person = message.guild.member(message.mentions.users.first() || message.guild.members.get(args[1]))
        if(!person) return message.reply("User Doesn't Exist");

        let muterole = message.guild.roles.cache.find(role => role.name == "muted");

        if(!muterole) return message.reply("Role Doesn't Exist");

        let time = args[2];

        if(!time){
            return message.reply("How Long?");
        }

        //Cache their already existing roles
        cachedUserRoles[person.id] = person.roles.cache;
        //Set their roles to an empty array to clear them, then add the muted role once all roles were removed successfully
        person.roles.set([]).then(member => member.roles.add(muterole)).catch(console.error);

        message.channel.send(`@${person.user.tag} has now been muted for ${ms(ms(time))}`);

        setTimeout(function(){
            //Grab their existing roles and set them back to the user, we wont need to remove the muted role since setting the roles would override all existing ones already
            person.roles.set(cachedUserRoles[person.id]).catch(console.error)
            message.channel.send(`@${person.user.tag} has now been unmuted`)
        }, ms(time));
        break;
    case 'help':
        const embed2 = new MessageEmbed()
            .setTitle("How To Get Commands")
            .setColor(0x00fff7)
            .setDescription("Do /commands to get the list of commands");

        message.author.send(embed2);
        break;

是的,我不知道怎么做,我只知道这么多。是的,我不知道怎么做,我只知道这么多。他要编辑我的问题并添加我的代码,有没有办法实现我上面的内容?@Quillition我已经更新了答案,包括使用您的代码的实现。非常感谢,我也是Tensei Slime的观察者,如果我是对的,那就是你个人资料照片中的rimuru。但是我在这里得到了这个错误:ReferenceError:cachedUserRoles没有定义是的,您必须像我在第一个示例“let cachedUserRoles={};”中那样添加一个cachedUserRole字段我可以把你添加到discord中吗?因为我仍然有一些问题,它说“缺少权限”。QUILITION#0333我将编辑我的问题并添加我的代码,有没有办法实现我上面的内容?@QUILITION我已经更新了答案,包括使用您的代码的实现。非常感谢,我也是Tensei Slime的观察者,如果我是正确的,那就是您个人资料图片中的rimuru。但是我在这里得到了这个错误:ReferenceError:cachedUserRoles没有定义是的,您必须像我在第一个示例“let cachedUserRoles={};”中那样添加一个cachedUserRole字段我可以把你添加到discord中吗?因为我仍然有一些问题,它说“缺少权限”。Quillition#0333