如何实现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
相关产品推荐
相关产品推荐

