#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}`);
. Дело закрыто.