You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord.js v14临时语音频道:如何克隆分类角色权限至新频道

解决Discord.js v14中克隆分类角色权限到临时语音频道的问题

要将目标分类的角色权限完整克隆到新创建的临时语音频道,你需要先获取分类的权限覆盖设置,再将其与自定义频道权限(如创建者专属权限)合并,最终应用到新频道上。以下是修改后的代码及关键说明:

核心实现步骤

  1. 提取分类的所有权限覆盖规则
  2. 合并自定义权限(确保自定义规则优先覆盖分类中重复的设置)
  3. 将合并后的权限应用到新创建的频道

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:42:54