Как удалить написанную пользователем команду в discord.py после x секунд

Jan 19 2021

Итак, я сделал команду $mute @name which basically mutes a player when typed. But what i want is when i type the command , after 5 or 10 seconds the command input line that is $mute @name удаляется из чата.

Ответы

IPSDSILVA Jan 19 2021 at 19:08

Это будет означать, что вам придется подождать 5-10 секунд после команды, а затем удалить ее. Просто убедитесь, что у вашего бота есть права на удаление сообщений:

@client.command()
async def mute(ctx, member: discord.Member):
    muted_role = ctx.guild.get_role(YOUR_ROLE_ID)  # Make sure not to put it in a string
    await member.add_roles(muted_role)
    await asyncio.sleep(5)  # Make sure you import asyncio, also change the 5 to whatever seconds you would like
    await ctx.message.delete()

Приведенный выше код предоставит пользователю Mutedроль (какую бы роль вы не указали через идентификатор этой роли) и передаст эту роль участнику. Затем он подождет 5 секунд (вы можете изменить это как хотите), а затем удалите командное сообщение.

Bagle Jan 19 2021 at 19:09

Вот два метода, которые вы можете использовать.


Первый способ заключается в использовании с await asyncio.sleepпомощью asyncioимпорта . Причина, по которой мы не используем, time.sleepзаключается в том, что это будет блокировщик. Блокировщик означает, что если вы используете эту команду в одном месте, вы остановите всего бота, и никто другой не сможет использовать команды, пока это не будет выполнено. Пример будет таким:

import asyncio

@client.command()
async def test(ctx):
    await ctx.message.delete() # deletes message sent by user
    # do some things here
    msg = await ctx.send("done")
    await asyncio.sleep(5) # waits for 5 seconds
    await msg.delete() # deletes message sent by bot, aka 'done'

Второй способ - использовать delete_afterпри условии, что вы удаляете только сообщение бота. Мне не удалось получить прямую ссылку на документы, но они говорят:

delete_after (float) - если указано, количество секунд ожидания в фоновом режиме перед удалением только что отправленного сообщения. Если удаление не удается, оно игнорируется.

Пример выглядит следующим образом:

@client.command()
async def test2(ctx):
    await ctx.send("done", delete_after=5)

Некоторые другие реферальные ссылки:

  • ТАК: Как заставить бота удалить собственное сообщение через 5 секунд
  • SO: Discord.py Как заставить бота удалять сообщения через определенное время
  • ТАК: Удаление сообщения бота в discord.py

Примечание : Обе эти команды были протестированы, и обе команды работают должным образом.