You need to enable JavaScript to run this app. 如何实现Discord机器人带时间参数的VC定时断开dc命令
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Discord机器人带时间参数的VC定时断开dc命令

定时断开语音频道命令实现修正

原有代码的核心问题

  • 指令匹配逻辑失效:采用全等字符串判断message.content === "~dc (time)",完全无法识别带实际时间值的输入(比如~dc 20m永远匹配不上分支)
  • 缺少语音状态校验逻辑,未判断指令发起者的语音连接情况
  • 无时间格式解析、延时执行的核心流程
  • 存在语法错误:if分支内仅初始化了embed对象就闭合代码块,无实际执行逻辑

完整可运行实现代码

// 提前确认bot已申请权限:VIEW_CHANNEL、CONNECT、MOVE_MEMBERS
client.on('messageCreate', async (message) => {
  // 匹配合法指令格式:~dc + 数字 + 时间单位(秒s/分m/时h)
  const commandMatch = message.content.match(/^~dc (\d+[smh])$/i);
  if (!commandMatch) return;

  // 校验用户语音连接状态
  const userVoice = message.member.voice;
  if (!userVoice.channel) {
    return message.reply("you must be in a VC first");
  }

  // 解析时间为毫秒值
  const timeInput = commandMatch[1];
  const timeNum = parseInt(timeInput);
  const timeUnit = timeInput.slice(-1).toLowerCase();
  let delayDuration = 0;
  if (timeUnit === 's') delayDuration = timeNum * 1000;
  if (timeUnit === 'm') delayDuration = timeNum * 60 * 1000;
  if (timeUnit === 'h') delayDuration = timeNum * 60 * 60 * 1000;

  // 时间范围校验,避免异常值
  if (delayDuration < 1000 || delayDuration > 24 * 60 * 60 * 1000) {
    return message.reply("支持的时间范围为1秒~24小时,格式示例:~dc 30s / ~dc 20m / ~dc 2h");
  }

  // 延时执行断开操作
  setTimeout(() => {
    // 执行前二次校验状态,避免无效操作
    if (message.member.voice.channel) {
      message.member.voice.disconnect("触发定时断开指令");
    }
  }, delayDuration);

  // 反馈设置成功
  message.reply(`已设置${timeNum}${timeUnit}后自动断开你的语音频道连接`);
});

运行注意事项

  • 正则匹配规则严格限定了指令格式,可避免和其他普通消息触发误判
  • 延时断开前需要二次校验用户的语音状态,覆盖用户等待期间主动退语音、切换频道的场景
  • 必须为机器人开通*移动成员(MOVE_MEMBERS)*的服务器权限,否则会出现权限不足导致的断开失败
  • 原代码中冗余的embed初始化逻辑如果没有特殊展示需求可以直接删除,不需要保留无意义的空实例

注意:受单进程运行逻辑限制,机器人重启后未执行的延时任务会直接失效,不建议设置超过1小时的长延时。

内容的提问来源于stack exchange,提问作者david dos reis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 07:15:05