提问者:小点点

discord.js v12静音命令


我在discord.jsv12中执行了一个静音命令。每当我运行该命令时,我都会收到一个错误。我对编码有点陌生,所以我无法理解当我运行命令时出现错误的原因。下面是我的代码:

module.exports = {
    name: "mute",
    description: "Mutesd a member for a given time",

    async run (client, message, args) {

    const muteRoleId = message.guild.roles.cache.get('762199219074367508')
    let muteRole;

    const member = message.mentions.members.first() || message.guild.members.cache.get(args[0]);
    if (!member) 
      return message.channel.send('Please mention a user or provide a valid user ID');
    if (member === message.member)
      return message.channel.send('You cannot mute yourself');
    if (member === message.guild.me) return message.channel.send(message, 0, 'You cannot mute me');
    if (member.roles.highest.position >= message.member.roles.highest.position)
      return message.channel.send('You cannot mute someone with an equal or higher role');
    if (!args[1])
      return message.channel.send('Please enter a length of time of 14 days or less (1s/m/h/d)');
    let time = ms(args[1]);
    if (!time || time > 1209600000) // Cap at 14 days, larger than 24.8 days causes integer overflow
      return message.channel.send('Please enter a length of time of 14 days or less (1s/m/h/d)');

    let reason = args.slice(2).join(' ');
    if (!reason) reason = '`None Provided`';
    if (reason.length > 1024) reason = reason.slice(0, 1021) + '...';

    if (member.roles.cache.has(muteRoleId))
      return message.channel.send('Provided member is already muted');

    // Mute member
    try {
      await member.roles.add(muteRole);
    } catch (err) {
      console.log(err)
      return message.channel.send('Please check the role hierarchy', err.message);
    }
    const muteEmbed = new MessageEmbed()
      .setTitle('Mute Member')
      .setDescription(`${member} has now been muted for **${ms(time, { long: true })}**.`)
      .addField('Moderator', message.member, true)
      .addField('Member', member, true)
      .addField('Time', `\`${ms(time)}\``, true)
      .addField('Reason', reason)
      .setFooter(message.member.displayName,  message.author.displayAvatarURL({ dynamic: true }))
      .setTimestamp()
      .setColor(message.guild.me.displayHexColor);
    message.channel.send(muteEmbed);

    // Unmute member
    member.timeout = message.client.setTimeout(async () => {
      try {
        await member.roles.remove(muteRole);
        const unmuteEmbed = new MessageEmbed()
          .setTitle('Unmute Member')
          .setDescription(`${member} has been unmuted.`)
          .setTimestamp()
          .setColor(message.guild.me.displayHexColor);
        message.channel.send(unmuteEmbed);
      } catch (err) {
        console.log(err)
        return message.channel.send('Please check the role hierarchy', err.message);
      }
    }, time);
  }
};

正如我前面提到的,每当我运行这个命令时,都会出现以下错误:

TypeError [INVALID_TYPE]: Supplied roles is not a Role, Snowflake or Array or Collection of Roles or Snowflakes.
    at GuildMemberRoleManager.add (/home/runner/Utki-the-bot/node_modules/discord.js/src/managers/GuildMemberRoleManager.js:93:15)
    at Object.run (/home/runner/Utki-the-bot/commands/mute.js:37:26)
    at Client.<anonymous> (/home/runner/Utki-the-bot/index.js:71:42)
    at Client.emit (events.js:315:20)
    at Client.EventEmitter.emit (domain.js:483:12)
    at MessageCreateAction.handle (/home/runner/Utki-the-bot/node_modules/discord.js/src/client/actions/MessageCreate.js:31:14)
    at Object.module.exports [as MESSAGE_CREATE] (/home/runner/Utki-the-bot/node_modules/discord.js/src/client/websocket/handlers/MESSAGE_CREATE.js:4:32)
    at WebSocketManager.handlePacket (/home/runner/Utki-the-bot/node_modules/discord.js/src/client/websocket/WebSocketManager.js:384:31)
    at WebSocketShard.onPacket (/home/runner/Utki-the-bot/node_modules/discord.js/src/client/websocket/WebSocketShard.js:444:22)
    at WebSocketShard.onMessage (/home/runner/Utki-the-bot/node_modules/discord.js/src/client/websocket/WebSocketShard.js:301:10) {
  [Symbol(code)]: 'INVALID_TYPE'
}

我无法解决这个错误。你能帮我解决这个错误吗?提前谢谢你。


共1个答案

匿名用户

这是一个非常简单的错误和修复。错误声明提供的角色对方法Member.Roles.Add(muteRole);无效。因此,这告诉我们muterole不是一个有效的角色对象,当查看您的代码时,我们发现这是真的。

在代码的开头,您有以下内容:

const muteRoleId = message.guild.roles.cache.get('762199219074367508')
let muteRole;

定义两个变量,设置muteroleid的值,但不设置muterole的值。则在不更改这些值的情况下,您拥有member.roles.add(muteRole);,但muteRole将解析为undefined,因为它从未设置过。

要解决这个问题,只需将member.roles.add(muteRole);更改为member.roles.add(muteRoleId);,所有这些都将按预期工作。