role.forEach не функция - PullRequest
0 голосов
/ 31 мая 2019

Итак, в основном происходит то, что этот код выполняется при выполнении команды.Если строка пользователя (UserID) вписывается в массив, он отвечает как true и устанавливает уровень доступа равным 6. Если это false, он проверяет наличие ролей и устанавливает уровень доступа, если у них есть определенные роли по именам ролей.Однако часть имен ролей не работает.Например, пользователь с ролью модератора (обычно уровень доступа 3 / perms.three) отображается как уровень доступа 0, и я не могу понять, почему.

Способ, которым это должно работать, состоит в том, что онпроверяет идентификатор пользователя.Если этот идентификатор находится в предопределенном массиве, расположенном в файле .json, он переопределяет все другие уровни доступа, предоставляя уровень доступа 6. Если массив не существует, он перемещается к функции ролей и ищет, чтобы увидеть,Роль существует в списке лиц.

Это то, что я использую для проверки ролей / ИД пользователя.

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 голосов
/ 01 июня 2019

В вашей функции getAccess() вы устанавливаете переменную access, но фактически не возвращаете значение.Попробуйте эту исправленную версию.

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;
}
0 голосов
/ 31 мая 2019

В первом операторе 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;
}
...