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

如何在Discord.py中复制整个分类并删除原分类?

实现Discord分类频道的批量刷新(克隆+替换)

由于Discord API没有直接克隆整个分类的方法,我们可以通过先克隆分类本身,再逐个克隆分类下的所有子频道的方式实现需求,具体步骤和代码如下:

核心思路

  1. 定位目标分类(可基于命令上下文自动获取,或允许用户指定)
  2. 克隆原分类,保留其名称、权限、位置等核心设置
  3. 按原顺序遍历原分类下的所有频道,逐个克隆到新分类中,保留频道的类型、权限、顺序等属性
  4. 确认所有频道克隆完成后,删除原分类(原分类下的子频道会被一并删除)

代码实现

基础版本(基于上下文自动获取分类)

@bot.command(name="refresh-category", aliases=["rc"])
@commands.has_permissions(manage_channels=True)
async def refresh_category(ctx):
    # 获取当前命令所在频道的父分类
    original_category = ctx.channel.category
    if not original_category:
        await ctx.send("当前频道不属于任何分类,无法执行刷新操作!")
        return

    # 克隆原分类,保留原配置
    new_category = await original_category.clone(reason="执行分类刷新命令")

    # 按原顺序克隆所有子频道到新分类
    for channel in original_category.channels:
        await channel.clone(
            reason="分类刷新同步频道",
            category=new_category,
            position=channel.position  # 保持频道顺序与原分类一致
        )

    # 删除原分类,完成替换
    await original_category.delete(reason="分类刷新完成,删除原分类")
    await ctx.send(f"分类「{original_category.name}」已成功刷新!")

进阶版本(支持指定分类名称)

如果需要在任意频道执行命令并指定目标分类,可以添加分类名称参数:

@bot.command(name="refresh-category", aliases=["rc"])
@commands.has_permissions(manage_channels=True)
async def refresh_category(ctx, *, category_name: str=None):
    # 处理用户指定分类的情况
    if category_name:
        original_category = discord.utils.get(ctx.guild.categories, name=category_name)
        if not original_category:
            await ctx.send(f"服务器内找不到名为「{category_name}」的分类!")
            return
    # 未指定分类时,使用当前频道的父分类
    else:
        original_category = ctx.channel.category
        if not original_category:
            await ctx.send("当前频道不属于任何分类,请指定要刷新的分类名称!")
            return

    # 克隆分类与频道的逻辑和基础版本一致
    new_category = await original_category.clone(reason="执行分类刷新命令")
    for channel in original_category.channels:
        await channel.clone(
            reason="分类刷新同步频道",
            category=new_category,
            position=channel.position
        )
    
    await original_category.delete(reason="分类刷新完成,删除原分类")
    await ctx.send(f"分类「{original_category.name}」已成功刷新!")

注意事项

  • 权限要求:执行命令的用户需要拥有manage_channels权限(比原命令的manage_messages更贴合频道管理场景)
  • 频道属性保留:clone方法会自动保留频道的类型(文本/语音/公告)、权限设置、名称、主题等属性
  • 顺序一致性:通过指定position参数,确保新分类内的频道顺序与原分类完全一致
  • 删除逻辑:删除原分类时,其下所有子频道会被Discord自动删除,无需单独处理

内容的提问来源于stack exchange,提问作者TheShadowKnows

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:10:55