Como faço para remover um comando escrito pelo usuário em discord.py após x segundos

Jan 19 2021

Então eu dei um comando $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 seja removido do chat.

Respostas

IPSDSILVA Jan 19 2021 at 19:08

Isso significaria que você teria que esperar de 5 a 10 segundos após o comando e, em seguida, excluí-lo. Apenas certifique-se de que seu bot tenha permissão para excluir mensagens:

@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()

O código acima dará ao usuário a Mutedfunção (qualquer que seja a função que você especificar por meio do id dessa função) e dará essa função ao membro. Em seguida, ele aguardará 5 segundos (você pode alterar para o que quiser) e, em seguida, excluirá a mensagem de comando.

Bagle Jan 19 2021 at 19:09

Aqui estão dois métodos que você pode usar.


A primeira forma seria usar await asyncio.sleepa asyncioimportação . A razão de não usarmos time.sleepseria porque isso seria um bloqueador. Um bloqueador significa que se você usar este comando em um lugar, você parará o bot inteiro e ninguém mais será capaz de usar os comandos até que isso seja feito. Um exemplo seria o seguinte:

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'

A segunda maneira seria delete_afterassumir que você está apenas excluindo a mensagem do bot. Não consegui obter o link direto para os documentos, mas eles dizem:

delete_after (float) - Se fornecido, o número de segundos de espera em segundo plano antes de excluir a mensagem que acabamos de enviar. Se a exclusão falhar, ela será ignorada silenciosamente.

O exemplo é o seguinte:

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

Alguns outros links de referência:

  • SO: Como fazer um bot deletar sua própria mensagem após 5 segundos
  • SO: Discord.py Como posso fazer um bot deletar mensagens após um determinado período de tempo
  • SO: Excluindo a mensagem de um bot em discord.py

Nota : Ambos os comandos foram testados e ambos os comandos funcionam conforme o esperado.