¿Cómo elimino un comando escrito por el usuario en discord.py después de x segundos?

Jan 19 2021

Así que hice un 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 se elimina del chat.

Respuestas

IPSDSILVA Jan 19 2021 at 19:08

Eso significaría que tendría que esperar de 5 a 10 segundos después del comando y luego eliminarlo. Solo asegúrese de que su bot tenga permisos para eliminar mensajes:

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

El código anterior le dará al usuario el Mutedrol (cualquier rol que especifique a través de la identificación de ese rol) y le dará ese rol al miembro. Luego esperará 5 segundos (puede cambiar esto a lo que desee) y luego eliminará el mensaje de comando.

Bagle Jan 19 2021 at 19:09

Aquí hay dos métodos que puede utilizar.


La primera forma sería utilizar await asyncio.sleepla asyncioimportación . La razón por la que no lo usamos time.sleepsería porque sería un bloqueador. Un bloqueador significa que si usa este comando en un lugar, detendrá todo el bot y nadie más podrá usar los comandos hasta que esté listo. Un ejemplo sería el siguiente:

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'

La segunda forma sería usarlo delete_afterasumiendo que solo está eliminando el mensaje del bot. No pude obtener el enlace directo a los documentos, pero dicen:

delete_after (float): si se proporciona, la cantidad de segundos de espera en segundo plano antes de eliminar el mensaje que acabamos de enviar. Si la eliminación falla, se ignora en silencio.

El ejemplo es el siguiente:

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

Algunos otros enlaces de referencia:

  • SO: Cómo hacer que un bot elimine su propio mensaje después de 5 segundos
  • SO: Discord.py ¿Cómo puedo hacer que un bot elimine mensajes después de un período de tiempo específico?
  • SO: Eliminar el mensaje de un bot en discord.py

Nota : Ambos comandos se han probado y ambos funcionan como se esperaba.