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
相关产品推荐
相关产品推荐

