Есть ли способ запретить использование @everyone или @here в команде say - PullRequest
2 голосов
/ 18 июня 2020

У меня есть бот с командой say, и я хотел бы сделать эту команду publi c для всех, но возможен риск, что они могут пинговать «@everyone» или «@here» через сообщение бота. .

Если у кого-то есть способ смягчить это и запретить боту пинговать всех, сообщите мне.

Мой код:

@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 ]

3 голосов
/ 18 июня 2020

Вы можете создать это несколькими способами, но один из них - использовать здесь декоратор 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

Ссылки:

  • Проверки в d.py

  • any()

  • Message.content

  • Message.mention_everyone - Может также использоваться вместо проверки наличия в сообщении @everyone / @here. Все зависит от предпочтений. Однако небольшое примечание для этого атрибута:

    «Это не проверяет, присутствует ли текст @everyone или @here в самом сообщении. Скорее это логическое значение указывает, находится ли текст @everyone или @here в самом сообщении. сообщение, и в конечном итоге оно было упомянуто. "

1 голос
/ 18 июня 2020

Другой вариант - использовать commands.clean_content. Это заставит «преобразовать @everyone и @here упоминания в не-упоминания» и преобразовать другие упоминания в то, как они отображаются, но это не окажет какого-либо заметного эффекта.

Ссылка на API: discord .Message.clean_content

Вы также можете использовать это с командами discord в качестве типа. Расширенные преобразователи с использованием команд .clean_content

@commands.command()
async def say(self, ctx, message: commands.clean_content):
    ctx.send(message)
1 голос
/ 18 июня 2020

Вы можете использовать регулярное выражение, чтобы посмотреть на строку и определить, есть ли там @everyone или @here. Мое регулярное выражение очень ржавое, поэтому я бы посоветовал вам изучить этот маршрут дальше.

Другой вариант, который не требует регулярного выражения, - это разделить строку на список ее подстрок и проверить, были ли какие-либо из этих подстрок @here или @ every.

    @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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...