如何让Discord.py机器人不响应私信仅在服务器频道生效?
当然有更简便的实现方式!全局检查就是你要找的最优解
你现在的方法虽然能生效,但每个命令都要重复写判断逻辑,确实有点繁琐。用全局检查的话,只需要配置一次,所有命令就会自动拒绝私信场景,非常省心。
步骤1:添加全局检查函数
用@client.check装饰一个异步函数,判断当前上下文的guild(新版本Discord.py已替代旧版的server)是否不为None——私信场景下ctx.guild会是None,服务器频道则会返回对应的服务器对象。
from discord.ext import commands # 初始化机器人 client = commands.Bot(command_prefix="你的命令前缀") # 全局检查:仅允许在服务器频道执行命令 @client.check async def only_allow_in_guild(ctx): return ctx.guild is not None
步骤2:添加友好的错误提示(可选但推荐)
默认情况下,用户在私信触发命令会静默失败,体验不太好。你可以添加错误处理逻辑,给用户明确的提示:
@client.event async def on_command_error(ctx, error): # 捕获检查失败的异常 if isinstance(error, commands.CheckFailure): await ctx.send("抱歉,这个命令只能在服务器频道中使用哦!") # 其他类型的错误可以按需处理,比如打印日志或者抛出 else: raise error
额外说明
- 配置完成后,所有用
@client.command装饰的命令都会自动应用这个检查,不用再逐个命令写if判断了。 - 如果有个别命令需要允许私信使用,可以给该命令单独添加检查,比如用
@commands.check装饰器覆盖全局规则,或者用@commands.check_any同时满足多个检查条件。
内容的提问来源于stack exchange,提问作者haruyuki
相关产品推荐
相关产品推荐

