discord.py如何让!say命令不@everyone/here?新手求助
问题分析
你的代码存在几个关键问题,导致无法拦截@everyone/@here:
- 变量未定义:代码里使用了
message变量,但该变量从未被定义,应使用函数参数中的msg - 条件判断逻辑错误:
if message == "@everyone" or "@here"是错误写法,这个逻辑等价于if (message == "@everyone") or True,永远为真;且你需要的是检查消息是否包含这两个关键词,而非完全等于 - 执行顺序颠倒:当前是先发送消息再检查违规内容,就算消息里有
@everyone也已经发出去了,完全起不到拦截作用 - 语法错误:
break只能用在循环/switch结构里,这里用错了位置,同时代码缩进和冒号的写法也不符合Python规范
修正后的代码
async def say(ctx, *, msg=None): if msg is None: await ctx.send("请输入要发送的内容") return # 检查消息是否包含违规提及 if "@everyone" in msg or "@here" in msg: await ctx.send("不能发送@everyone或@here的消息") await ctx.message.delete() return # 无违规内容则发送消息并删除原命令 await ctx.send(msg) await ctx.message.delete()
额外说明
- 把参数改成
*, msg=None是为了让命令能接收带空格的完整内容,否则只能接收第一个单词 - 先检查违规内容,确认没问题再发送,这样就能彻底拦截违规提及
- 增加了无输入时的提示,提升使用体验
内容的提问来源于stack exchange,提问作者Happy Deer
相关产品推荐
相关产品推荐

