有没有办法禁止@everyone或@here在say命令中使用

时间:2020-06-18 17:54:32

标签: python python-3.x discord.py

我有一个带有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)

3 个答案:

答案 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

参考:

  • Checks in d.py

  • any()

  • Message.content

  • 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)