Jak usunąć polecenie napisane przez użytkownika w discord.py po x sekundach

Jan 19 2021

Więc wydałem polecenie $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 zostanie usunięte z czatu.

Odpowiedzi

IPSDSILVA Jan 19 2021 at 19:08

Oznaczałoby to, że musiałbyś poczekać 5-10 sekund po wydaniu polecenia, a następnie je usunąć. Po prostu upewnij się, że Twój bot ma uprawnienia do usuwania wiadomości:

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

Powyższy kod nada użytkownikowi Mutedrolę (niezależnie od roli, którą określisz za pomocą identyfikatora tej roli) i nada tę rolę członkowi. Następnie odczeka 5 sekund (możesz to zmienić na dowolne), a następnie usunie komunikat polecenia.

Bagle Jan 19 2021 at 19:09

Oto dwie metody, których możesz użyć.


Pierwszym sposobem byłoby wykorzystanie await asyncio.sleeppomocą asyncioimportu . Powodem, dla którego nie używamy, time.sleepbyłoby to, że byłby to bloker. Blokowanie oznacza, że ​​jeśli użyjesz tego polecenia w jednym miejscu, zatrzymasz całego bota i nikt inny nie będzie mógł używać poleceń, dopóki nie zostanie to zrobione. Przykład może wyglądać jak poniżej:

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'

Drugim sposobem byłoby użycie delete_afterprzy założeniu, że usuwasz tylko wiadomość bota. Nie udało mi się uzyskać bezpośredniego linku do dokumentów, ale mówią:

delete_after (float) - jeśli podano, liczba sekund oczekiwania w tle przed usunięciem właśnie wysłanej wiadomości. Jeśli usunięcie nie powiedzie się, zostanie po cichu zignorowane.

Przykład jest następujący:

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

Inne linki polecające:

  • SO: Jak zmusić bota do usunięcia własnej wiadomości po 5 sekundach
  • SO: Discord.py Jak mogę zmusić bota do usuwania wiadomości po określonym czasie
  • SO: Usuwanie wiadomości od bota w discord.py

Uwaga : Oba te polecenia zostały przetestowane i oba działają zgodnie z oczekiwaniami.