首页 > 解决方案 > Discord.js 角色检查优化

问题描述

我目前正在构建一个不和谐验证机器人,该机器人的功能之一是检查您是否从每个所需类别中拥有 1 个角色,然后在最后生成您的角色摘要。目前我有一个工作解决方案,它的功能也完全符合我的要求,但它使用了大量的 if 堆栈,我对 js 很陌生,但被告知不要使用大的 if/if else if 堆栈。我已经研究过开关案例,但无法真正看到我将如何在这里应用它们,所以我想知道是否有更优化的方式来实现我所需要的。我目前的代码如下:

var hasrole = false;
var role = "";
var subrole = "";
var istype1 = false;
var istype2 = false;
var istype3 = false;
var istype4 = false;
var counter = 0;

if (message.member.roles.cache.find(r => r.id === "736032207248031765")) {
    istype1 = true;
    role = "Type 1";
    hasrole = true;
    counter ++;
}
if (message.member.roles.cache.find(r => r.id === "736032822053175306")) {
    istype2 = true;
    role = "Type 2";
    hasrole = true;
    counter ++;
}
if (message.member.roles.cache.find(r => r.id === "736032670013980702")) {
    role = "Type 3";
    hasrole = true;
    counter++
    if (message.member.roles.cache.find(r => r.id === "736032716411371581")) {
        istype1 = true;
        subrole = "Type 1";
    } else if (message.member.roles.cache.find(r => r.id === "736032780122849340") {
        istype2 = true;
        subrole = "Type 2";
    } else {
        istype3 = true;
    }
}
if (message.member.roles.cache.find(r => r.id === "736032870703038534")) {
    istype4 = true;
    role = "Type 4";
    hasrole = true;
    counter ++;
}
if (message.member.roles.cache.find(r => r.id === "736033471474172025")) {
    istype2 = true;
    role = "Type 5";
    hasrole = true;
    counter ++;
}
if (counter >= 1) {
    message.channel.send("More than 1 main role, please have only 1");
    return;
} else if (hasrole == false) {
    message.channel.send("No main role please get one")
    return;
}

标签: javascriptdiscorddiscord.js

解决方案


好的,所以我假设您的代码工作正常,只需要一点优化。

我的 #1 建议是您使用数组并迭代您的类型。

我的 #2 建议是不要硬编码您的角色 ID。

我的#3 建议是通读您的代码并尝试理解它,因为它现在看起来很混乱。

您在类型 3 角色检查中的代码令人困惑,并且您的类型 5 角色检查验证了角色 2 值。

这是我的代码版本

const roles = ['736032207248031765', '736032822053175306', '736032670013980702', '736032870703038534', '736033471474172025'];
let userRoles = [];

roles.forEach(r => {
    if(message.member.roles.cache.has(r)){
        userRoles.push(r);
    }
});

if (userRoles.length >= 1) {
    message.channel.send("More than 1 main role, please have only 1");
    return;
} else if (userRoles.length == 0) {
    message.channel.send("No main role please get one")
    return;
}

如您所见,这比整个 ifs 链方便得多。


推荐阅读