【问题标题】:How to create a command that only who have one of the roles can use?如何创建只有具有其中一种角色的人才能使用的命令?
【发布时间】:2018-06-29 08:06:58
【问题描述】:
let staffrole = ['383874699941117952', '149622819158884353', '149622998180036608'];

你如何制定一个只有拥有其中一个角色的人才能使用的命令? 谢谢!

【问题讨论】:

  • 有哪些尝试研究过有关该主题的文档?
  • 是的,我试过了...
  • @Braguetta,我认为 Daniel 是在问你到目前为止已经尝试过什么,而不仅仅是你是否研究过这个话题。我希望我的回答可以帮助,但如果没有,请澄清问题

标签: javascript node.js discord.js


【解决方案1】:

我建议这样做:

首先,在客户端的消息监听器中设置你的命令名称:

// ... (in client message listener)
switch(command) {
    case '<your command>':
        runIfRoleIncluded(message);
        break;
}

接下来,从发送的消息中获取角色 ID,并检查该消息的角色 ID 是否在您的 staffrole 数组中:

function runIfRoleIncluded(message) {
    let rolesCollection = message.member.roles;
    let staffrole = ['383874699941117952', '149622819158884353', '149622998180036608'];

    // only 1 member can send a message, so get role collection's first key (id)
    let messageRoleId = rolesCollection.firstKey();

    // check if message's role id is in staff role array
    if (staffrole.includes(messageRoleId)) {
        // do stuff here
        // ...
    }
}

.member 对象的.roles 属性是Collection,这就是为什么必须使用.firstKey() 方法的原因。你也可以把Collection转成普通的jsArray,不过我上面介绍的方法更简单。

【讨论】:

    【解决方案2】:

    开始看这个...不太了解不和谐空间,但有一个示例机器人和一个 hello world ping,还发现这个非常可爱的Github gist,它很好地说明了如何构建相当于命令切换语句。在这里做很多猜测——作为对未来问题的注释,添加一些关于你正在尝试做的事情的代码会非常有帮助——设置为数组的单个变量是没什么可继续的......

    在阅读了@Raymond Zhang 所说的之后,因为,是的,这就是我正在做的......

    这直接来自我链接的 Github 要点 ->

        ...
          if(command === "kick") {
            if(!message.member.roles.some(r=>["Administrator","Moderator"].includes(r.name)) )
                  return message.reply("Sorry, you don't have permissions to use this!");
         ...
    

    我已经对此进行了测试,效果很好,尽管它检查的是角色名称而不是数字。如果您更新答案以解释您的流程,这将有所帮助。更多信息=更好的答案。 :)

    【讨论】:

    • 您正在检查您自己的机器人 ID
    • 我定义的 ID 是角色 ID,而不是成员 ID。
    【解决方案3】:

    您可以做的是,在消息事件中,您运行该命令,然后您可以检查成员的角色以查找 数组 中的角色之一。

    下面是这个样子:

    client.on("message", msg => {
        if(command === "whateverItIs") {
            let staffrole = ['383874699941117952', '149622819158884353', '149622998180036608'];
            for(i=0;i<staffrole.length;i++) {
                if(msg.member.roles.filter((role) => role.id == staffrole[i]).size > 0) {
                    //run the code
                    return;
                }
            }
        }
    })
    

    在消息事件中,使用确定的command,机器人将检查每个员工角色,如果message author 的角色包括其中一个员工角色,则该命令将运行。

    【讨论】:

    • msg.member.roles.includes 不是函数
    猜你喜欢
    • 2021-03-16
    • 2021-01-19
    • 2021-09-09
    • 2018-02-28
    • 2021-07-27
    • 1970-01-01
    • 2021-08-18
    • 2017-02-06
    • 1970-01-01
    相关资源
    最近更新 更多