Come rimuovo un comando scritto dall'utente in discord.py dopo x secondi

Jan 19 2021

Quindi ho eseguito 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 viene rimosso dalla chat.

Risposte

IPSDSILVA Jan 19 2021 at 19:08

Ciò significherebbe che dovresti attendere 5-10 secondi dopo il comando, quindi eliminarlo. Assicurati solo che il tuo bot abbia le autorizzazioni per eliminare i messaggi:

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

Il codice sopra darà all'utente il Mutedruolo (qualunque ruolo tu specifichi tramite l'ID di quel ruolo) e darà quel ruolo al membro. Quindi aspetterà 5 secondi (puoi cambiarlo in quello che desideri) e quindi eliminare il messaggio di comando.

Bagle Jan 19 2021 at 19:09

Ecco due metodi che potresti usare.


Il primo modo sarebbe usare await asyncio.sleepusando l' asyncioimportazione . Il motivo per cui non utilizziamo time.sleepsarebbe perché questo sarebbe un blocco. Un blocco significa che se usi questo comando in un posto, interromperesti l'intero bot e nessun altro sarebbe in grado di usare i comandi fino a quando non ha finito. Un esempio potrebbe essere il seguente:

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'

Il secondo modo sarebbe quello di utilizzare delete_aftersupponendo che tu stia eliminando solo il messaggio del bot. Non sono riuscito a ottenere il collegamento diretto ai documenti, ma dicono:

delete_after (float) - Se fornito, il numero di secondi da attendere in background prima di eliminare il messaggio che abbiamo appena inviato. Se l'eliminazione non riesce, viene silenziosamente ignorata.

L'esempio è il seguente:

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

Alcuni altri link di riferimento:

  • COSÌ: Come fare in modo che un bot cancelli il proprio messaggio dopo 5 secondi
  • SO: Discord.py Come posso fare in modo che un bot elimini i messaggi dopo un determinato periodo di tempo
  • COSÌ: eliminazione del messaggio di un bot in discord.py

Nota : entrambi questi comandi sono stati testati ed entrambi funzionano come previsto.