Wie entferne ich einen vom Benutzer geschriebenen Befehl in discord.py nach x Sekunden?

Jan 19 2021

Also habe ich einen Befehl gegeben $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 wird aus dem Chat entfernt.

Antworten

IPSDSILVA Jan 19 2021 at 19:08

Das würde bedeuten, dass Sie nach dem Befehl 5-10 Sekunden warten und ihn dann löschen müssten. Stellen Sie einfach sicher, dass Ihr Bot die Berechtigung zum Löschen von Nachrichten hat:

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

Der obige Code gibt dem Benutzer die MutedRolle (unabhängig davon, welche Rolle Sie über die ID dieser Rolle angeben) und gibt diese Rolle dem Mitglied. Dann wartet es 5 Sekunden (Sie können dies nach Belieben ändern) und löscht dann die Befehlsnachricht.

Bagle Jan 19 2021 at 19:09

Hier sind zwei Methoden, die Sie verwenden können.


Der erste Weg wäre die await asyncio.sleepVerwendung des asyncioImports . Der Grund, den wir nicht verwenden, time.sleepwäre, dass dies ein Blocker wäre. Ein Blocker bedeutet, dass Sie, wenn Sie diesen Befehl an einer Stelle verwenden, den gesamten Bot stoppen und niemand anderes Befehle verwenden kann, bis er fertig ist. Ein Beispiel wäre wie folgt:

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'

Die zweite Möglichkeit wäre die delete_afterAnnahme, dass Sie nur die Nachricht des Bots löschen. Ich konnte den direkten Link zu den Dokumenten nicht bekommen, aber sie sagen:

delete_after (float) - Falls angegeben, die Anzahl der Sekunden, die im Hintergrund gewartet werden muss, bevor die gerade gesendete Nachricht gelöscht wird. Wenn das Löschen fehlschlägt, wird es stillschweigend ignoriert.

Das Beispiel lautet wie folgt:

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

Einige andere Empfehlungslinks:

  • SO: Wie man einen Bot dazu bringt, seine eigene Nachricht nach 5 Sekunden zu löschen
  • SO: Discord.py Wie kann ich einen Bot dazu bringen, Nachrichten nach einer bestimmten Zeit zu löschen?
  • SO: Löschen der Nachricht eines Bots in discord.py

Hinweis : Beide Befehle wurden getestet und funktionieren wie erwartet.