Discord.py cog中实现非管理员say命令禁用@everyone功能咨询
问题原因
你的代码存在3处核心错误,导致逻辑不生效:
- 重复执行删除原消息逻辑:函数开头已经调用了一次
await ctx.message.delete(),else分支又重复调用了一次,属于多余逻辑,极端情况会触发消息不存在的异常。 - 错误地给字符串添加反应:你定义的
antiping是普通文本字符串,不是Discord消息对象,无法调用add_reaction方法,必须接收ctx.send()返回的消息对象才能添加反应。 - 自定义表情格式错误:添加自定义表情反应时,需要使用完整的
<:表情名:表情ID>格式,你缺少了开头的<和结尾的>。
修复后代码
import discord from discord.ext import commands @commands.command() async def say(self, ctx, *, message): # 仅执行一次原消息删除操作 await ctx.message.delete() # 非管理员权限校验 if not ctx.author.guild_permissions.administrator: if "@everyone" in message or "@here" in message: tip_msg = await ctx.send("你不能通过我艾特全体成员!") # 使用正确格式添加自定义反应 await tip_msg.add_reaction(emoji='<:Canteveryone:890319257534103603>') return # 非管理员发送普通内容时主动禁用全体艾特,避免绕过检测 await ctx.send(message, allowed_mentions=discord.AllowedMentions(everyone=False, here=False)) return # 管理员直接发送内容 await ctx.send(message)
可选优化
通过allowed_mentions参数可以彻底屏蔽全体艾特的触发,即使用户用零宽空格等方式绕过文本检测,也不会真的触发@everyone、@here的提醒,进一步降低滥用风险。
内容的提问来源于stack exchange,提问作者Red
相关产品推荐
相关产品推荐

