discord.py开发Lock命令同频道提及目标频道时不生效问题
问题根因
- 权限判断逻辑存在遗漏:你当前仅判断了@everyone角色的频道权限覆写显式设置为True的场景,若频道没有单独配置@everyone的发消息权限(覆写值为
None,继承自所属分类的权限),overwrite.send_messages == True的判断会直接不成立,锁定逻辑不会执行。 - 执行顺序错误:你先调用接口锁定频道,再发送执行结果反馈。如果命令执行频道和目标频道是同一个,锁定后机器人会失去当前频道的发消息权限,后续的
await ctx.send会抛出权限拒绝异常,若无全局错误捕获,程序会直接终止,用户看不到反馈就会误以为锁定失败。
修复后的代码
@commands.command(case_insensitive = True) @commands.has_any_role(885434191783788564, 856071314740740096, 856061783722426378, 856465667296985108) async def lock(self, ctx, channel: discord.TextChannel = None, *, reason=None): channel = channel or ctx.channel # 读取@everyone在当前频道的实际生效权限,自动计算继承自分类的权限 default_perm = channel.permissions_for(ctx.guild.default_role) if default_perm.send_messages: # 先发送反馈再修改权限,避免同频道下锁定后无法发消息的问题 em_reason = discord.Embed(title="**Channel locked**", description=f":lock: {reason}",color=discord.Color.red()) embed = discord.Embed(description = f"<a:fl_check:874522235879186483> Locked channel <#{channel.id}>",color=discord.Color.green()) await ctx.send(embed=em_reason) await ctx.send(embed=embed) # 执行锁定操作 overwrite = channel.overwrites_for(ctx.guild.default_role) overwrite.send_messages = False await channel.set_permissions(ctx.guild.default_role, overwrite=overwrite) else: em = discord.Embed(description="<a:fl_no:874522273984442420> That channel is already locked.", color=discord.Color.red()) await ctx.send(embed=em)
主要修改点:
- 给
channel参数添加默认值None,避免不传目标频道时命令报错 - 改用
permissions_for方法读取实际生效权限,覆盖权限继承的场景 - 调整执行顺序,先发送成功反馈再修改频道权限,规避同频道下无法发消息的问题
内容的提问来源于stack exchange,提问作者user15609381
相关产品推荐
相关产品推荐

