请求编写Discord机器人代码:自动断开静音10分钟的VC用户
Discord机器人自动断开长时间静音用户实现方案
实现逻辑
- 监听用户语音状态变化,记录静音起始时间
- 为每个静音用户启动10分钟定时任务,到期后检查状态并执行断开
- 通过缓存跟踪用户状态,避免重复处理
可直接嵌入的代码(基于discord.js v14)
在你的index.js中添加以下代码:
// 全局缓存:存储用户ID与静音开始时间的映射 const mutedUsers = new Map(); client.on('voiceStateUpdate', (oldState, newState) => { const userId = newState.id; // 用户切换为静音状态(服务器静音/自我静音) if (!oldState.deaf && newState.deaf) { mutedUsers.set(userId, Date.now()); // 设置10分钟后执行检查 setTimeout(() => { // 获取用户当前的语音状态 const member = newState.guild.members.cache.get(userId); if (!member) return; const currentVoiceState = member.voice; // 确认用户仍在静音且处于语音频道 if (currentVoiceState.deaf && currentVoiceState.channel) { // 断开用户连接 currentVoiceState.disconnect(); console.log(`已断开用户 ${member.user.tag} 的语音连接,静音时长超10分钟`); // 可选:给用户发私信通知 member.send('你在语音频道静音已满10分钟,已被自动断开连接。') .catch(err => console.log(`无法通知用户 ${member.user.tag}:${err}`)); } // 清理缓存 mutedUsers.delete(userId); }, 10 * 60 * 1000); // 10分钟(转换为毫秒) } // 用户取消静音,清理缓存 if (oldState.deaf && !newState.deaf) { mutedUsers.delete(userId); } // 用户离开语音频道,清理缓存 if (oldState.channel && !newState.channel) { mutedUsers.delete(userId); } });
注意事项
- 确保机器人拥有移动成员的权限,否则无法执行断开操作
- 若使用discord.js v13及更早版本,需调整静音判断逻辑:
将oldState.deaf和newState.deaf替换为oldState.serverDeaf || oldState.selfDeaf、newState.serverDeaf || newState.selfDeaf - 机器人重启后,未处理的静音用户记录会清空,重启前的静音时长不会被计算
- 私信通知功能需要机器人与用户有共同服务器,且用户未关闭私信权限
内容的提问来源于stack exchange,提问作者bennys
相关产品推荐
相关产品推荐

