Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何检查我的机器人是否可以在discord.js v12中添加角色?_Node.js_Discord.js - Fatal编程技术网

Node.js 如何检查我的机器人是否可以在discord.js v12中添加角色?

Node.js 如何检查我的机器人是否可以在discord.js v12中添加角色?,node.js,discord.js,Node.js,Discord.js,我已经发出了一个warn命令,为提到的用户提供了一个warning角色,但是我遇到了一个问题。有时服务器所有者可能忘记将bot的角色移动到警告角色之上,这将导致bot无法将角色授予用户。我尝试使用role.editable,但即使角色低于bot的角色,它也会返回false。要发出警告的用户的角色也低于bot。这是我的密码: const { DiscordAPIError } = require("discord.js"); const Discord = require('d

我已经发出了一个warn命令,为提到的用户提供了一个warning角色,但是我遇到了一个问题。有时服务器所有者可能忘记将bot的角色移动到警告角色之上,这将导致bot无法将角色授予用户。我尝试使用role.editable,但即使角色低于bot的角色,它也会返回false。要发出警告的用户的角色也低于bot。这是我的密码:

const { DiscordAPIError } = require("discord.js");
const Discord = require('discord.js');
const fs = require("fs");
const ms = require("ms")
//let warnedRoleList = JSON.parse(fs.readFileSync("./roleIDs/warnedRole.json", "utf-8"));
var mongoPath = '../../mongo.js' //path.join(__dirname, '..', 'mongo.js');
const mongo = require(mongoPath)
const setWarnedSchema = require('../../schemas/setwarned-schema.js')
const mongoose = require('mongoose');
const cache = {}
const setup = require('../../util/setup')
const moderation = require('../../util/moderation')
const index = require('../../index.js')
//const commands = require("./commands");

module.exports = {
    commands: ['warn'],
    expectedArgs: ['{user ping/user ID} [reason]'],
    permissionError: ['you are missing the manage messages permissions'],
    minArgs: 1,
    maxArgs: null,
    permissions: ['MANAGE_MESSAGES'],
    requiredRoles: [],
    description: "The bot will warn the mentioned user",
    callback: async (message, args, text) => {
        const guild = message.guild
        let guildID = message.guild.id;
        var warnedRoleID = null
        warnedRoleID = await setup.getWarnedRoles(guildID)

        warnedRoleID = warnedRoleID.toString()
        var UserID = args[0]
        var member = index.getMention(args[0], message)

        var warnReason = args
        warnReason.shift()
        warnReason = warnReason.toString()
        warnReason = warnReason.replace(/,/g, ' ')
        if(!member) {
            return message.reply('please specify the user that should be warned')
        };

        if (!warnReason) {
            warnReason = 'no reason given'
        };
        var warnedRole = message.guild.roles.cache.get(warnedRoleID);
        var warnedOneHighestRoleID = member.roles.highest.id;
        var warningOneHighestRoleID = message.member.roles.highest.id;

        if(!warnedRole) {
            return message.reply('there is not a role set as the warned role, set it by doing &setwarnedrole (that requires manage server permissions)')
        };

        //let warnReason = args.join(" ").slice(18);
        if(member.id === message.author.id) {
            return message.reply('can not allow self-harm')
        }
        if (message.member.roles.highest.comparePositionTo(member.roles.highest) <= 0) { //warnedOneHighestRoleID === warningOneHighestRoleID
            return message.reply('you can not warn a user with the same (or higher) permissions as you')
        }
        if(!message.member.permissions.has('MANAGE_MESSAGES')){
            return message.reply(`you don't have manage messages permissions that are required to execute this command.`);
        }

        if (member.roles.cache.has(`${warnedRoleID}`)) {
            const logEmbed = new Discord.MessageEmbed()
            .setColor('#FF0000')
            .setTitle(`An attempt to warn an already warned member happened`)
            //.setAuthor(`${userinfoget.user.tag}`, userinfoget.user.displayAvatarURL())
            .setDescription(`**Warned member:** <@${member.user.id}>\n**Warned by:** <@${message.author.id}>\n**Warn reason:** ${warnReason}`)
            .setTimestamp()
    
            index.modLog(guildID, logEmbed)
            message.reply('this user is already warned!')
            return
        };
        console.log(warnedRole.editable)
        if(!warnedRole.editable) {
            message.reply(`failed to warn <@${member.id}> as the warned role is above my highest role. Try moving at least one of my roles above other ones`)
            return
        };
        member.roles.add(warnedRoleID)
        .then(memberAdded => {
         message.reply(`you have succesfully warned <@${member.id}> with the reason **${warnReason}**`);
        })
        .catch(error => {
        //console.log(error);
            if(message.member.permissions.has('ADMINISTRATOR')){
                message.reply('there is no role set as the warned role. Set it by doing `&setwarnedrole add {role ID}`')
            } else message.reply('there is no role set as the warned role. Ask an admin to set it by doing `&setwarnedrole add {role ID}`')
        });
        const embed = new Discord.MessageEmbed()

        .setColor('#FF0000')
        .setTitle(`You hev been warned in ${message.guild.name}`)
        //.setAuthor(`${userinfoget.user.tag}`, userinfoget.user.displayAvatarURL())
        .setDescription(`**Warned by:** <@${message.author.id}>\n**Warn reason:** ${warnReason}`)
        .setTimestamp()

        member.user.send(embed).catch(error => {
            message.channel.send(`Failed to DM <@${member.id}> the info about this action`)
            console.log(error)
        })

        const logEmbed = new Discord.MessageEmbed()
        .setColor('#FF0000')
        .setTitle(`A member has been warned`)
        //.setAuthor(`${userinfoget.user.tag}`, userinfoget.user.displayAvatarURL())
        .setDescription(`**Warned member:** <@${member.user.id}>\n**Warned by:** <@${message.author.id}>\n**Warn reason:** ${warnReason}`)
        .setTimestamp()

        index.modLog(guildID, logEmbed)
    }
}
const{DiscordAPIError}=require(“discord.js”);
const Discord=require('Discord.js');
常数fs=要求(“fs”);
常数ms=需要(“ms”)
//让warnedRoleList=JSON.parse(fs.readFileSync(“./roleIDs/warnedRole.JSON”,“utf-8”);
var mongoPath='../../mongo.js'//path.join(uu dirname,…,'mongo.js');
const mongo=require(mongoPath)
const setWarnedSchema=require('../../schemas/setWarnedSchema.js')
const mongoose=require('mongoose');
常量缓存={}
const setup=require(“../../util/setup”)
const moderation=require(“../../util/moderation”)
const index=require('../../index.js')
//常量命令=要求(“./命令”);
module.exports={
命令:['warn'],
expectedArgs:['{user ping/user ID}[原因]'],
permissionError:[“您缺少管理邮件权限”],
尖塔:1,
maxArgs:null,
权限:['MANAGE_MESSAGES'],
所需角色:[],
description:“bot将警告提到的用户”,
回调:异步(消息、参数、文本)=>{
const guild=message.guild
让guildID=message.guild.id;
var warnedRoleID=null
warnedRoleID=wait setup.getWarnedRoles(Guidid)
warnedRoleID=warnedRoleID.toString()
var UserID=args[0]
var member=index.getTitle(参数[0],消息)
var warnReason=args
warnReason.shift()
warnReason=warnReason.toString()
warnReason=warnReason.replace(/,/g',)
如果(!成员){
返回消息。回复('请指定应警告的用户')
};
如果(!原因){
warnReason='未给出理由'
};
var warnedRole=message.guild.roles.cache.get(warnedRoleID);
var warnedonehightestroleid=member.roles.highest.id;
var warningOneHighestRoleID=message.member.roles.highest.id;
如果(!warnedRole){
return message.reply('没有一个角色设置为警告角色,请通过执行&setwarnedrole(需要管理服务器权限)进行设置')
};
//让warnReason=args.join(“”).slice(18);
if(member.id==message.author.id){
返回消息。回复('不能允许自残')
}

如果(message.member.roles.highest.comparePosition(member.roles.highest)角色层次结构不是确定角色是否可编辑的唯一因素。例如,如果您的机器人没有
MANAGE\u roles
权限,那么无论机器人的最高角色有多高,
Role#editable
仍将返回false

您要做的是首先检查GuildMember是否可管理(通过
GuildMember#可管理
)。如果不可管理,您就不能期望能够向其添加角色。 然后,您要检查您的bot是否具有
MANAGE\u角色
权限。 最后,您要检查所述“警告角色”的位置是否高于bot的最高角色的位置

最后两个步骤应由
Role#editable
内部完成(请参阅)

所以你能做的就是

如果(!member.manageable | | |!warnedRole.editable)返回console.log(“否,无法向该成员添加角色”)