我有一个带有say
命令的机器人,我想将此命令公开给所有人,但是可能的风险是他们可以通过该机器人的消息ping“ @everyone”或“ @here”。
如果有人可以缓解这种情况并阻止该bot对所有人进行ping操作,请告诉我。
我的代码:
@bot.command()
@commands.has_guild_permissions(administrator=True)
async def say(ctx, *, message=None):
message = message or "Please say something to use the say command!"
await ctx.message.delete()
await ctx.send(message)
答案 0 :(得分:4)
您可以通过两种方法创建此方法,但是一种方法是在此处使用commands.check()
装饰器:
def not_everyone(ctx):
return not any(m in ctx.message.content for m in ["@here", "@everyone"])
@bot.command()
@commands.has_guild_permissions(administrator=True)
@commands.check(not_everyone) # Note you don't call the function - just pass it in
async def cmd(ctx):
# Do stuff
参考:
Message.mention_everyone
-还可用于检查消息中是否包含@everyone
/ @here
。取决于偏好。不过,请注意此属性:
“这不会检查消息本身中是否包含@everyone或@here文本。而是该布尔值指示消息中是否包含@everyone或@here文本,并且最终会提及。” / p>
答案 1 :(得分:1)
另一种选择是使用second(get());
。这样可以“将@everyone和@here提及转化为未提及的内容”,并将其他提及转化为它们的显示方式,但这似乎没有任何明显的效果。
Api参考:discord.Message.clean_content
您也可以将它与discord命令一起用作类型。 Advanced Converters using commands.clean_content
commands.clean_content
答案 2 :(得分:0)
您可以使用正则表达式查看字符串并确定是否有@everyone或@here。我的正则表达式非常生锈,因此建议您进一步研究该路线。
不需要正则表达式的另一种方法是将字符串分成其子字符串列表,并检查这些子字符串中的任何一个是@here还是@everyone。
@bot.command()
@commands.has_guild_permissions(administrator=True)
async def say(ctx, *, message=None):
message = message or "Please say something to use the say command!"
message_components = message.split()
if "@everyone" in message_components or "@here" in message_components:
await ctx.send("You cannot have @everyone or @here in your message!")
return
await ctx.message.delete()
await ctx.send(message)