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
相关产品推荐
相关产品推荐

