Discord.py'de x saniye sonra kullanıcı tarafından yazılan bir komutu nasıl kaldırırım

Jan 19 2021

Bu yüzden bir emir verdim $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 sohbetten kaldırılır.

Yanıtlar

IPSDSILVA Jan 19 2021 at 19:08

Bu, komuttan sonra 5-10 saniye beklemeniz ve ardından silmeniz gerektiği anlamına gelir. Botunuzun mesajları silme izinlerine sahip olduğundan emin olun:

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

Yukarıdaki kod, kullanıcıya Mutedrolü (bu rolün kimliği aracılığıyla hangi rolü belirtirseniz) verecek ve o rolü üyeye verecektir. Ardından 5 saniye bekleyecek (bunu istediğiniz gibi değiştirebilirsiniz) ve ardından komut mesajını silecektir.

Bagle Jan 19 2021 at 19:09

İşte kullanabileceğiniz iki yöntem.


İlk yol await asyncio.sleep, asyncioiçe aktarmayı kullanmak olacaktır . Kullanmamamızın nedeni time.sleepbunun bir engelleyici olması olabilir. Engelleyici, bu komutu tek bir yerde kullanırsanız, botun tamamını durduracağınız ve bu işlem tamamlanana kadar hiç kimsenin komutları kullanamayacağı anlamına gelir. Bir örnek aşağıdaki gibi olacaktır:

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'

İkinci yol, delete_afteryalnızca botun mesajını sildiğinizi varsaymaktır. Dokümanlara doğrudan bağlantı kuramadım ama diyorlar ki:

delete_after (float) - Verilmişse, az önce gönderdiğimiz mesajı silmeden önce arka planda beklenecek saniye sayısı. Silme başarısız olursa sessizce yok sayılır.

Örnek aşağıdaki gibidir:

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

Diğer bazı yönlendirme bağlantıları:

  • SO: Bir bot 5 saniye sonra kendi mesajını nasıl silebilir?
  • SO: Discord.py Belirli bir süre sonra bot silme mesajlarını nasıl yapabilirim
  • SO: discord.py'de botun mesajını silme

Not : Bu komutların her ikisi de test edilmiştir ve her iki komut da beklendiği gibi çalışmaktadır.