Discord.js v14临时语音频道:如何克隆分类角色权限至新频道
解决Discord.js v14中克隆分类角色权限到临时语音频道的问题
要将目标分类的角色权限完整克隆到新创建的临时语音频道,你需要先获取分类的权限覆盖设置,再将其与自定义频道权限(如创建者专属权限)合并,最终应用到新频道上。以下是修改后的代码及关键说明:
核心实现步骤
- 提取分类的所有权限覆盖规则
- 合并自定义权限(确保自定义规则优先覆盖分类中重复的设置)
- 将合并后的权限应用到新创建的频道
修改后的完整代码
const { Events, ChannelType, Collection, PermissionFlagsBits } = require('discord.js'); let voiceManager = new Collection(); module.exports = { name: Events.VoiceStateUpdate, async execute(oldState, newState) { const { member, guild } = oldState; const newChannel = newState.channel; const oldChannel = oldState.channel; if (oldChannel !== newChannel && newChannel && newChannel.id === '882632556372176937') { const sourceCategory = newChannel.parent; // 1. 获取分类的权限覆盖并转换为数组格式 const categoryPermissions = sourceCategory.permissionOverwrites.cache.map(overwrite => ({ id: overwrite.id, allow: overwrite.allow.toArray(), deny: overwrite.deny.toArray() })); // 2. 定义自定义权限规则 const customPermissions = [ // 频道创建者权限 { id: member.id, allow: [PermissionFlagsBits.Connect, PermissionFlagsBits.ReadMessageHistory], deny: [PermissionFlagsBits.ManageChannels], }, // @everyone权限(覆盖分类中的对应设置) { id: guild.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.Connect], }, ]; // 3. 合并权限:用自定义规则覆盖分类中重复的ID设置 const combinedPermissionsMap = new Map(); categoryPermissions.forEach(perm => combinedPermissionsMap.set(perm.id, perm)); customPermissions.forEach(perm => combinedPermissionsMap.set(perm.id, perm)); const finalPermissions = Array.from(combinedPermissionsMap.values()); // 4. 创建临时语音频道并应用合并后的权限 const voiceChannel = await guild.channels.create({ name: "Your Mom's Room", type: ChannelType.GuildVoice, parent: sourceCategory, permissionOverwrites: finalPermissions, userLimit: 5, bitrate: 96000 }); // 可选:自动将用户移动到新频道 await member.voice.setChannel(voiceChannel); } } };
关键细节说明
sourceCategory.permissionOverwrites.cache是Discord.js存储分类权限规则的集合,通过map转换为频道创建所需的对象格式- 使用
Map合并权限可以自动处理重复ID的冲突,确保自定义规则(如创建者、@everyone权限)优先生效 toArray()方法将Discord.js的PermissionBitField转换为数组,符合channel.create的参数要求
内容的提问来源于stack exchange,提问作者Tiago Dias
相关产品推荐
相关产品推荐

