所以基本上发生了什么,当运行命令时此代码是否正在运行。如果用户的字符串(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,
};
答案 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;
}