Discord.JS 实现加入创建临时VC自动更名、离开自动删除的方法
实现方案调整
核心修改点
- 频道命名替换为对应用户的
用户名#识别码 - 用户ID格式 - 增加临时频道分类判断,避免误删服务器普通语音频道
- 新增用户离开语音频道的监听逻辑,当临时频道成员数为0时自动删除
注意:以下代码默认适配Discord.js v13+版本,如果你使用v12版本,需要将代码中
channelId改为channelID、parentId改为parentID、type: 'GUILD_VOICE'改为type: 'voice'
// 提前定义配置项,后续修改更方便 const TRIGGER_CHANNEL_ID = '替换为你的触发频道ID'; // 用户加入这个频道就会触发创建临时VC const TEMP_CATEGORY_ID = '替换为存放临时VC的分类ID'; // 所有临时VC都会放在这个分类下 client.on('voiceStateUpdate', (oldState, newState) => { const targetUser = newState.member?.user; // 1. 处理用户加入触发频道的逻辑 if (newState.channelId === TRIGGER_CHANNEL_ID && targetUser) { // 拼接要求的频道名称格式,user.tag原生就是 用户名#识别码 的格式 const vcName = `${targetUser.tag} - ${targetUser.id}`; // 创建临时语音频道 newState.guild.channels.create(vcName, { type: 'GUILD_VOICE', parent: TEMP_CATEGORY_ID, // 可选配置:给创建者开放频道管理权限,可自行调整或删除该配置 permissionOverwrites: [ { id: targetUser.id, allow: ['MANAGE_CHANNELS', 'MUTE_MEMBERS', 'DEAFEN_MEMBERS'] } ] }).then(newVc => { // 创建完成后自动把用户移到新的临时频道 newState.setChannel(newVc); }).catch(err => console.log('创建临时频道失败:', err)); } // 2. 处理用户离开频道后的清理逻辑 const leftChannel = oldState.channel; // 只判断属于临时VC分类、且当前没有任何成员的语音频道 if (leftChannel && leftChannel.parentId === TEMP_CATEGORY_ID && leftChannel.members.size === 0) { // 加1秒延迟+二次判断,避免用户临时切频道导致误删 setTimeout(() => { if (leftChannel.members.size === 0) { leftChannel.delete().catch(err => console.log('删除临时频道失败:', err)); } }, 1000); } });
补充说明
如果不需要给创建者开放频道管理权限,直接删除permissionOverwrites相关配置即可。所有异步操作都加了错误捕获,不会因为权限不足、频道已被删除等异常情况导致bot崩溃。
内容的提问来源于stack exchange,提问作者tanaallen
相关产品推荐
相关产品推荐

