Как добавить роль с идентификатором, сохраненным в файле JSON discord.js версия 12?

#javascript #node.js #json #discord.js

#javascript #node.js #json #discord.js

Вопрос:

Я выполняю команду warn и столкнулся с проблемой с предоставлением роли. Во-первых, у меня есть команда, которая устанавливает предупрежденную роль для гильдии. Он реагирует на amp;setwarnedrole {идентификатор роли}. Идентификатор роли сохраняется в файле JSON рядом с идентификатором гильдии. Затем команда warn считывает файл и получает идентификатор роли, который был сохранен с идентификатором гильдии, в которой выполняется команда. Вы используете amp;warn {user ping / идентификатор пользователя}, чтобы предупреждать людей. Но когда я это делаю, это выдает мне ошибку:

 TypeError [INVALID_TYPE]: Supplied roles is not a Role, Snowflake or Array or Collection of Roles or Snowflakes.
  

Мой код для amp;setwarnedrole:

 const { DiscordAPIError } = require("discord.js");
const Discord = require('discord.js');
const fs = require("fs");
let warnedRoleList = JSON.parse(fs.readFileSync("./roleIDs/warnedRole.json", "utf-8"));

module.exports = {
    name: 'setwarnedrole',
    description: "Set the warned role for your guild with this command",
    execute(message, args){
        const fs = require("fs");
        let warnedRoleList = JSON.parse(fs.readFileSync("./roleIDs/warnedRole.json", "utf-8"));
        if (!message.member.hasPermission("MANAGE_GUILD")) return message.reply("you are missing the manage server permissions")
        let guildID = message.guild.id;
        const warnedRole = message.guild.roles.cache.get(args[0]);
        const warnedRoleID = warnedRole.id
        if (!warnedRole) {
            return message.reply('invalid role ID')
        };

        message.reply(`warned role succesfully set to ${warnedRole}`)

        if(!warnedRoleList[guildID])warnedRoleList[guildID] = {
            warnedRoleList: warnedRoleID
        };
    
        fs.writeFile("./roleIDs/warnedRole.json", JSON.stringify(warnedRoleList), err => {
            if (err) console.log(err)
        });

        console.log(`Warned role ID = ${warnedRoleID}`)
        console.log(`Guild ID = ${guildID}`)
    }
}
  

Мой код для amp;warn:

 const { DiscordAPIError } = require("discord.js");
const Discord = require('discord.js');
const fs = require("fs");
let warnedRoleList = JSON.parse(fs.readFileSync("./roleIDs/warnedRole.json", "utf-8"));
const commands = require("./commands");

module.exports = {
    name: 'warn',
    description: "The bot will warn the mentioned user",
    execute(message, args){
        let warnedRoleList = JSON.parse(fs.readFileSync("./roleIDs/warnedRole.json", "utf-8"));
        let guildID = message.guild.id;
        if(message.member.permissions.has('MANAGE_MESSAGES')){
            var role = message.guild.roles.cache.get(`${warnedRoleList[guildID]}`);
            var member = message.mentions.members.first() || message.guild.members.cache.get(args[0]);
            if(!member) {
                message.reply('please specify the user that should be warned')
                return
            }
            if(!role) {
                message.reply('there is not a role set as the warned role, set it by doing amp;setwarnedrole (that requires manage server permissions)')
            }
            if (member.roles.cache.has(`${warnedRoleList[guildID]}`)) {
                message.reply('this user is already warned!')
            } else
            member.roles.add(role)
            .then(memberAdded => {
             message.channel.send(`${member.displayName} was succesfully warned by ${message.author.tag}`);
            })
            .catch(error => {
            console.log(error);
            });    
        } else message.reply(`you don't have permissions to execute this command.`);
        console.log(`${role}`)
        console.log(`${warnedRoleList[guildID]}`)
    }
}
  

и, наконец, вот как идентификатор роли сохраняется с идентификатором гильдии в файле JSON:

 {"745376827324760245":{"warnedRoleList":"751119465868951643"}}
  

где первое число является идентификатором гильдии, а второе число — идентификатором предупрежденной роли. Но даже если я удалю знак «», что сделает его:

 {"745376827324760245":{"warnedRoleList":751119465868951643}}
  

это все еще не работает. Команда warn работает, если я задаю role определенное число. Кроме того, ведение журнала role сообщает об этом role = undefined . Попытка войти warnedRoleList[guildID] приводит к получению [objectObject] . Что я сделал не так? Спасибо 🙂

Ответ №1:

Хорошо, я нашел ошибку. Я устанавливал role в amp; warn значение message.guild.roles.cache.get(`${warnedRoleList[guildID]}`); , но оно должно быть message.guild.roles.cache.get(`${warnedRoleList[guildID].warnedRoleList}`); . Дело закрыто.