You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord.js设置30d超时禁言触发INVALID_COMMUNICATION_DISABLED_TIMESTAMP错误

解决Discord机器人mute命令30d超时禁言触发DiscordAPIError[50035]的问题

错误原因

Discord API对成员超时禁言(timeout)有强制最大时长限制:28天。当你传入30d时,ms包转换后的毫秒数对应的时间戳会超过「当前时间+28天」的上限,导致API返回INVALID_COMMUNICATION_DISABLED_TIMESTAMP错误(即DiscordAPIError[50035])。

解决办法

方案1:限制用户输入时长,超过则提示

在转换时长后添加判断逻辑,若用户输入的时长超过28天,直接返回错误提示,不执行禁言操作:

const target = message.mentions.members.first();
const time = args[2];
const reason = args.slice(3).join(' ');
const MAX_TIMEOUT = ms('28d'); // 定义Discord允许的最大超时时长
const convertedTime = ms(time);

if (!convertedTime) {
  const embed = new EmbedBuilder()
    .setColor(error)
    .setTitle(`${questionEmoji}`)
    .setDescription(`**Fehler**\nVerwende \`?mute @User Dauer Grund\``)
    .setFooter({
      text: 'Diese Nachricht löscht sich in 5 Sekunden',
    });
  await message.reply({ embeds: [embed] }).then(async (msg) => {
    setTimeout(async () => {
      msg.delete();
      message.delete();
    }, 5000);
  });
  return; // 补充return避免后续代码执行
}

// 新增:检查时长是否超过最大值
if (convertedTime > MAX_TIMEOUT) {
  const embed = new EmbedBuilder()
    .setColor(error)
    .setTitle(`${questionEmoji}`)
    .setDescription(`**Fehler**\n最大禁言时长不能超过28天。`)
    .setFooter({
      text: 'Diese Nachricht löscht sich in 5 Sekunden',
    });
  await message.reply({ embeds: [embed] }).then(async (msg) => {
    setTimeout(async () => {
      msg.delete();
      message.delete();
    }, 5000);
  });
  return;
}

if (target.isCommunicationDisabled()) {
  const embed = new EmbedBuilder()
    .setColor(error)
    .setTitle(`${questionEmoji}`)
    .setDescription(`**Fehler**\nDieser Spieler ist bereits gesperrt.`)
    .setFooter({
      text: 'Diese Nachricht löscht sich in 5 Sekunden',
    });
  await message.reply({ embeds: [embed] }).then(async (msg) => {
    setTimeout(async () => {
      msg.delete();
      message.delete();
    }, 5000);
  });
  return;
}

try {
  const embed = new EmbedBuilder()
    .setColor(success)
    .setTitle(`${checkReply}`)
    .setDescription(
      `**Erfolg**\n**${target}** wurde wegen **${reason}** für **${time}** gesperrt.`,
    );
  message.reply({ embeds: [embed] });
  const embed2 = new EmbedBuilder()
    .setColor(primary)
    .setTitle(`${emEmoji}`)
    .setDescription(
      `**Sperre**\n**${target}** wurde von **${message.author}** wegen **${reason}** für **${time}** gesperrt.`,
    );
  teamchat.send({ embeds: [embed2] });
  target.timeout(convertedTime, reason);
} catch (err) {
  console.log(err);
}

方案2:自动截断超时时长为最大值

如果希望允许用户输入超过28天的时长,但自动将其设置为Discord允许的最大值,并告知用户:

const target = message.mentions.members.first();
const time = args[2];
const reason = args.slice(3).join(' ');
const MAX_TIMEOUT = ms('28d');
let convertedTime = ms(time);
let displayTime = time; // 用于提示用户的时长文本

if (!convertedTime) {
  const embed = new EmbedBuilder()
    .setColor(error)
    .setTitle(`${questionEmoji}`)
    .setDescription(`**Fehler**\nVerwende \`?mute @User Dauer Grund\``)
    .setFooter({
      text: 'Diese Nachricht löscht sich in 5 Sekunden',
    });
  await message.reply({ embeds: [embed] }).then(async (msg) => {
    setTimeout(async () => {
      msg.delete();
      message.delete();
    }, 5000);
  });
  return;
}

// 自动截断超时时长
if (convertedTime > MAX_TIMEOUT) {
  convertedTime = MAX_TIMEOUT;
  displayTime = '28天'; // 更新提示文本为实际设置的时长
}

if (target.isCommunicationDisabled()) {
  const embed = new EmbedBuilder()
    .setColor(error)
    .setTitle(`${questionEmoji}`)
    .setDescription(`**Fehler**\nDieser Spieler ist bereits gesperrt.`)
    .setFooter({
      text: 'Diese Nachricht löscht sich in 5 Sekunden',
    });
  await message.reply({ embeds: [embed] }).then(async (msg) => {
    setTimeout(async () => {
      msg.delete();
      message.delete();
    }, 5000);
  });
  return;
}

try {
  const embed = new EmbedBuilder()
    .setColor(success)
    .setTitle(`${checkReply}`)
    .setDescription(
      `**Erfolg**\n**${target}** wurde wegen **${reason}** für **${displayTime}** gesperrt.`,
    );
  message.reply({ embeds: [embed] });
  const embed2 = new EmbedBuilder()
    .setColor(primary)
    .setTitle(`${emEmoji}`)
    .setDescription(
      `**Sperre**\n**${target}** wurde von **${message.author}** wegen **${reason}** für **${displayTime}** gesperrt.`,
    );
  teamchat.send({ embeds: [embed2] });
  target.timeout(convertedTime, reason);
} catch (err) {
  console.log(err);
}

注意事项

  • 原代码中!convertedTime判断块后未加return,会导致后续代码继续执行引发额外错误,上述修改已补充该语句。
  • Discord的28天限制是API层面的强制规则,需严格遵守。

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:15:35