TypeError: Не удается прочитать свойство «наивысшее» из неопределенных — команда Mute

Итак, привет, сообщество Stackoverflow, я немного озадачен тем, почему это внезапно перестало работать, и я получаю сообщение об ошибке, указанное в заголовке.

По сути, он проверяет, имеет ли пользователь, пытающийся отключить звук пользователя, более высокую роль, чем другой пользователь, и если да, то он отключает его, а если нет, выдает ошибку.

Но теперь все, что он делает, это просто снова выдает ошибку, указанную в заголовке, и я не могу найти исправление в документах?

Кроме того, когда я убираю highest.position из чека, это позволяет любому, у кого есть права, отключать звук любого выше или ниже него.

Итак, вот я и прошу помощи/понимания того, почему этот метод отключения звука пользователей неожиданно перестал работать.

const { MessageEmbed } = require("discord.js");
const db = require("quick.db");
const ms = require("ms");
const modSchema = require("../../models/modLogs");

module.exports = {
  name: "mute",
  description: "Mutes a user in a server",
  usage: "[name | nickname | mention | ID] (reason)",
  run: async (client, message, args) => {
    try {
      if (!message.member.permissions.has('MANAGE_ROLES')) return message.reply('You do not have perms to mute users. - `[MANAGE_ROLES]`')
      if (!message.guild.me.permissions.has('MANAGE_ROLES')) return message.reply('I do not have perms to mute users. - `[MANAGE_ROLES]`');
        
      if (!args[0]) return message.reply("```Usage: c!mute <user>```");
        
      var mutedMember = message.mentions.members.first() || message.guild.members.cache.get(args[0]) || message.guild.members.cache.find(r => r.user.username.toLowerCase() === args[0].toLocaleLowerCase()) || message.guild.members.cache.find(ro => ro.displayName.toLowerCase() === args[0].toLocaleLowerCase());
        
      if (!mutedMember) return message.reply("Please provide a valid user to mute.");
      if (mutedMember === message.member) return message.reply("I'm afraid you cannot mute yourself, Captain.");
      if (message.author.roles.highest.position <= mutedMember.roles.highest.position) return message.reply("<a:CL_No:909440866622517318> You cannot mute that user because they have the same or higher role than you.");

      let reason = args.slice(1).join(" ");
      if (mutedMember.user.bot) return message.reply("<a:CL_No:909440866622517318> I am unable to mute other bots.");

      const userRoles = mutedMember.roles.cache.filter(role => role.id !== message.guild.id).map(role => role.id);

      let muterole;
      let dbmute = await db.fetch(`muterole_${message.guild.id}`);
      let muteerole = message.guild.roles.cache.find(role => role.name === "Muted");

      if (!message.guild.roles.cache.has(dbmute)) {
        muterole = muteerole;
      } else {
        muterole = message.guild.roles.cache.get(dbmute);
      }

      if (!muterole) {
        try {
          message.reply("<a:CL_No:909440866622517318> I was unable to find the `Muted` role, attempting to create one now...");

          muterole = await message.guild.roles.create({
            name: "Muted",
            color: "#010101",
            permissions: []
          });
        
          message.guild.channels.cache.forEach(async channel => {
            await channel.permissionOverwrites.create(muterole, {
              SEND_MESSAGES: false,
              ADD_REACTIONS: false,
              SPEAK: false,
              CONNECT: false
            });
          });
          message.reply("<a:CL_CheckMark:858853559940808724> Successfully created the \`Muted\` role.");
        } catch (err) {
      message.reply(`\`${err}\``)
        }
      }

      if (mutedMember.roles.cache.has(muterole.id)) return message.reply(`\`${mutedMember.user.tag}\` is already muted.`);

      db.set(`muteeid_${message.guild.id}_${mutedMember.id}`, userRoles);
        
      try {
        mutedMember.roles.set([muterole.id]).then(() => {
          const muteEmbed1 = new MessageEmbed()
            .setColor("RED")
            .setAuthor({ name: message.guild.name, iconURL: message.guild.iconURL() })
            .setDescription(`${mutedMember.user.tag}, You were muted in \`${message.guild.name}\``)
            .addField("Reason:", `${reason || "No Reason Specified."}`)
            .setTimestamp()
            .setFooter({ text: `Moderator: ${message.author.tag}` });
          mutedMember.send({ embeds: [muteEmbed1] });
        });
      } catch {
        mutedMember.roles.set([muterole.id]);
      }
      
      if (reason) {
        const muteEmbed2 = new MessageEmbed()
          .setColor("RED")
          .setAuthor({ name: message.guild.name, iconURL: message.guild.iconURL() })
          .setDescription(`\`${mutedMember.user.tag}\` has been muted.`)
          .addField("User Roles:", "<a:CL_CheckMark:858853559940808724> | Removed all user roles.")
          .setTimestamp();
        message.reply({ embeds: [muteEmbed2] });
      } else {
        const muteEmbed3 = new MessageEmbed()
          .setColor("RED")
          .setAuthor({ name: message.guild.name, iconURL: message.guild.iconURL() })
          .setDescription(`\`${mutedMember.user.tag}\` has been muted.`)
          .addField("User Roles:", "<a:CL_CheckMark:858853559940808724> | Removed all user roles.")
          .setTimestamp();
        message.reply({ embeds: [muteEmbed3] });
      }
      
      modSchema.findOne({ Guild: message.guild.id }, async (err, data) => {
      if (!data) return;
                
      const logschannel = message.guild.channels.cache.get(data.Channel);
      if (logschannel) {
         const muteMemberEmbed = new MessageEmbed()
             .setTitle('User Muted')
               .addField('User', `${mutedMember.user.username} (${mutedMember.user.id})`)
             .addField('Moderator', `${message.author.tag}`)
             .addField('Reason', `${reason || 'No Reason Specified'}`)
             .addField('Muted', `<t:${Math.floor(Date.now() / 1000)}:R>`)
             .setColor('ORANGE')
             .setThumbnail(mutedMember.user.displayAvatarURL({ dynamic: true }))
         logschannel.send({ embeds: [muteMemberEmbed] });
      }
    });
    } catch (err) {
      return message.reply(`\`\`\`${err}\`\`\``);
    }
  }
};

Также ошибка возникает отсюда: if (message.author.roles.highest.position <= mutedMember.roles.highest.position) return message.reply("...")

Roman Beard 22.03.2022 21:10

Ну вот. Если ваша среда позволяет это, не могли бы вы отладить message.author и mutedMember, чтобы увидеть, почему/когда свойство roles не определено? Если нет, проверьте документацию по API дискорда, возможно, они что-то изменили?

user6118986 22.03.2022 21:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что message.author возвращает User, а User не имеют ролей; есть только у GuildMember. В то время как User является глобальным пользователем Discord, GuildMember — это пользователь на определенном сервере, и у этого участника есть роли на этом сервере.

Итак, вместо message.author вы должны использовать message.member, который возвращает GuildMember:

if (message.member.roles.highest.position <= mutedMember.roles.highest.position)
  return message.reply(
    "<a:CL_No:909440866622517318> You cannot mute that user because they have the same or higher role than you."
  );

Кажется, это сработало, я не понимал, что использую message.author вместо message.member. Благодарю вас!

Roman Beard 22.03.2022 22:50

Вы также можете использовать .moderatable, если вы можете добавить роль самому высокому человеку.

新Acesyyy 23.03.2022 01:42

Другие вопросы по теме