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

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)

主要修改点:

  1. 给channel参数添加默认值None,避免不传目标频道时命令报错
  2. 改用permissions_for方法读取实际生效权限,覆盖权限继承的场景
  3. 调整执行顺序,先发送成功反馈再修改频道权限,规避同频道下无法发消息的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:27:01