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

Discord.py lock命令运行后私有频道意外转为公开问题问询

问题原因

该问题由discord.py中set_permissions方法的默认逻辑导致:调用该方法修改角色权限时,未显式传入的权限字段会自动清除原有覆写值,重置为「继承上级权限」的默认状态。
你操作的私有频道原本对@everyone角色设置了view_channel=False的覆写权限,调用set_permissions时仅传入了send_messages=False和add_reactions=False两个参数,未保留原有的view_channel覆写值,导致该权限的自定义设置被清除,@everyone角色继承了服务器默认的可查看频道权限,频道因此变为公开状态。

解决方案

调整set_permissions的调用逻辑,先获取@everyone角色在目标频道的现有权限覆写,仅修改需要限制的字段后再提交,即可保留原有其他权限的设置。修改后的代码如下:

@commands.command()
async def lock(self, ctx, channel: discord.TextChannel = None, reason: str = None):
    channel = channel or ctx.channel
    # 获取@everyone角色在当前频道的现有权限覆写
    default_overwrite = channel.overwrites_for(ctx.guild.default_role)
    # 仅修改需要限制的两个权限,其余权限保持原有设置
    default_overwrite.send_messages = False
    default_overwrite.add_reactions = False
    # 提交修改后的权限覆写
    await channel.set_permissions(ctx.guild.default_role, overwrite=default_overwrite)

    await ctx.send(f"{success} | **{ctx.author.name}**, successfully locked <#{channel.id}>",
                   ephemeral=True)

    embed = discord.Embed(
        title="Channel locked",
        description=f"This channel was locked by {ctx.author.mention} 🔒",
        color=embed_color
    )
    # 兼容reason为空的情况,避免调用capitalize时报错
    embed.add_field(name="Reason", value=reason.capitalize() if reason else "未提供")
    embed.add_field(name=":warning: | Important", value="**Users with Administrator perms won't be affected**",
                    inline=False)
    embed.timestamp = datetime.datetime.utcnow()
    await channel.send(embed=embed)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:45:08