取消静音成员后,Discord bot 不会交还角色

时间:2021-02-13 08:37:15

标签: javascript discord.js

所以我制作了一个可以让用户静音和静音的机器人。主要问题是,在静音并取消静音后,角色不再回来 这是我尝试过的

const mainRole = [`791144820810842163` , `794825576602533898` , `791144908240060426` , `791144966474563624` , `791145298072305685` , `791145926344966185` , `791146191336505414` , `791146355552682034` , `792565793568587796` , `795357387794939904` , `795358283623432213` , `798804993468530699` , `791146747367653387`];
module.exports = {
    name: `unjail`,
    description: "this is unjail command!",
    execute(message, args){
        const target = message.mentions.users.first();

        if (target) {
            const memberTarget = message.guild.members.cache.get(target.id);
            if (!message.member.hasPermission("MANAGE_MESSAGES")) return message.channel.send("You cant unjail person because you are not staff/co owner/owner");
            let mainRole = message.guild.roles.cache.find(role => role.name === 'Peasant');
            let muteRole = message.guild.roles.cache.find(role => role.name === 'Jailed');
 
            let = message.guild.members.cache.get(target.id);
 
            memberTarget.roles.remove(muteRole.id);
            memberTarget.roles.add(mainRole.id);
            message.channel.send(`<@${memberTarget.user.id}> has been unjailed`);
        } else {
            message.channel.send('Cant find that member!');
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我猜代码逻辑很好,它应该按预期工作。所以让我们描述它并尝试解决问题。

    //extract mentioned user, by this command
    const target = message.mentions.users.first();

    if (target) {
        //target mentioned user from discord server members
        const memberTarget = message.guild.members.cache.get(target.id);
        //check permissions for user that using the command
        if (!message.member.hasPermission("MANAGE_MESSAGES")) return message.channel.send("You cant unjail person because you are not staff/co owner/owner");
        //find roles Peasant in server cache that should be returned and role Jailed
        let mainRole = message.guild.roles.cache.find(role => role.name === 'Peasant');
        let muteRole = message.guild.roles.cache.find(role => role.name === 'Jailed');
        //?????? What have been here?
        let = message.guild.members.cache.get(target.id);
        //return roles
        memberTarget.roles.remove(muteRole.id);
        memberTarget.roles.add(mainRole.id);
        message.channel.send(`<@${memberTarget.user.id}> has been unjailed`);
    } else {
        message.channel.send('Cant find that member!');
    }

按照正确的逻辑,这段代码实际上应该如何工作:

  1. 在 module.exports 之前没有预定义 const mainRole = ['791144820810842163',...]
  2. 以下代码将仅向未入狱的人返回一个角色(在本例中为 Peasant)。但是,如果您可以在 静音 时刻存储来自用户的所有角色,则它可以返回更多角色。因此,您将需要某种存储空间,并且不要忘记将以下逻辑添加到实际将用户静音的命令中。

通过 fs 模块或 any DBaaS for free-for-dev 写入 JSON 文件应该对您有所帮助。

<块引用>

如果你有一个拥有数千用户的庞大 Discord 服务器,我强烈推荐 Mongo Atlas。

module.exports = {
  name: `unjail`,
  description: "this is unjail command!",
  execute(message, args){
    //return exeption for lack of permission
    if (!message.member.hasPermission("MANAGE_MESSAGES")) return message.channel.send("You cant unjail person because you are not staff/co owner/owner");

    const target = message.mentions.users.first();
    if (!target) return message.channel.send(`Can't find mentioned user!`);
    const memberTarget = message.guild.members.cache.get(target.id);
    if (!memberTarget) return message.channel.send(`Can't find mentioned user!`);
    
    /**
    * At this point, we should return from the store the original roles for a user to restore
    * But since we don't have any storage, let's just return the only available role, Peasant, and remove the role Jailed
    */
    let mainRole = message.guild.roles.cache.find(role => role.name === 'Peasant');
    let muteRole = message.guild.roles.cache.find(role => role.name === 'Jailed');

    memberTarget.roles.remove(muteRole.id);
    memberTarget.roles.add(mainRole.id);
    
    message.channel.send(`<@${memberTarget.user.id}> has been unjailed`);
  }
}