role.forEach不是功能

时间:2019-05-31 19:52:58

标签: node.js discord discord.js

所以基本上发生了什么,当运行命令时此代码是否正在运行。如果用户的字符串(UserID)适合该数组,则响应为true,并将访问级别设置为6。如果为false,则检查角色,并根据角色名称设置访问级别(如果他们具有某些角色)。但是,角色名称部分不起作用。例如,具有主持人角色(通常是3级访问权限/ perms.three)的用户显示为0级访问权限,我无法弄清原因。

这应该起作用的方式是它检查用户的ID。如果该ID位于.json文件中的预定义数组中,则通过将访问级别设置为6来覆盖所有其他访问级别。如果该数组不存在,它将移至Roles函数并搜索以查看是否存在该ID。角色在人员列表中。

这就是我用来检查角色/用户ID的内容。

if (command.accessLevel > perms.getAccess(message.member.roles) || command.accessLevel > perms.getAccess(message.member.id)){
      return message.channel.send("``Error: Access Denied.``");
    }

这是Permissions.js文件:

const bot = require('./bot').skynet;
const config = require('./config.json');
const perms = require('./permissions.json').access;

function arrayHas(arr, val){
    var result = false;

    for (var item in arr){
        if (arr[item] == val){
            result = true;
            break;
        }
    }

    return result;
}

function getAccess(user){
    var access = 0;

    if (typeof(user) == 'string'){
        if (arrayHas(perms.six, user)){
            return 6;
        }
    }

    var roles = user;
    roles.forEach(function(role){
        if (arrayHas(perms.five, role.name)){
            access = 5;
            return;
        }
        else if (arrayHas(perms.four, role.name)){
            access = 4;
            return;
        }
        else if (arrayHas(perms.three, role.name)){
            access = 3;
            return;
        }
        else if (arrayHas(perms.two, role.name)){
            access = 2;
            return;
        }
        else if (arrayHas(perms.one, role.name)){
            access = 1;
            return;
        }
    });

    return access;
}

bot.on('message', message => {
    console.log(getAccess(message.member.id));
    console.log(getAccess(message.member.roles));
})

module.exports = {
    arrayHas: arrayHas,
    getAccess: getAccess,
};

2 个答案:

答案 0 :(得分:0)

在第一个if语句中,您应该在内部if语句之后返回一个值。否则,您将继续执行以下代码roles.forEach,以获取失败的字符串(roles.forEach is not a function

或将非字符串逻辑放在else语句中:

function getAccess(user){
    var access = 0;

    if (typeof(user) == 'string'){
        if (arrayHas(perms.six, user)){
            return 6;
        }
    } else {

        var roles = user;

        roles.forEach(function(role){
            if (arrayHas(perms.five, role.name)){
                access = 5;
                return;
            }
            else if (arrayHas(perms.four, role.name)){
                access = 4;
                return;
            }
            else if (arrayHas(perms.three, role.name)){
                access = 3;
                return;
            }
            else if (arrayHas(perms.two, role.name)){
                access = 2;
                return;
            }
            else if (arrayHas(perms.one, role.name)){
                access = 1;
                return;
            }
        });
    }

    return access;
}

答案 1 :(得分:0)

In your function getAccess(), you're setting the access variable but never actually returning the value. Try this revised version.

const Discord = require('discord.js');
const { skynet: bot } = require('./bot');
const config = require('./config.json');
const { access: perms } = require('./permissions.json');

/**
 * Return the access level of a member.
 * @param {Discord.GuildMember} member
*/
function getAccess(member) {
  if (!(member instanceof Discord.GuildMember)) return new TypeError('Expected a GuildMember.');

  if (arrayHas(perms.six, member.user.id)) return 6;

  const roles = member.roles;

  for (const role of roles) {
    if (arrayHas(perms.five, role.name)) return 5;
    if (arrayHas(perms.four, role.name)) return 4;
    if (arrayHas(perms.three, role.name)) return 3;
    if (arrayHas(perms.two, role.name)) return 2;
    if (arrayHas(perms.one, role.name)) return 1;
  }

  return 0;
}