x秒後にdiscord.pyのユーザー作成コマンドを削除するにはどうすればよいですか?

Jan 19 2021

だから私はコマンドを作成しました $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 $ミュート@nameはチャットから削除されます。

回答

IPSDSILVA Jan 19 2021 at 19:08

つまり、コマンドの後に5〜10秒待ってから、コマンドを削除する必要があります。ボットにメッセージを削除する権限があることを確認してください。

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

上記のコードは、ユーザーにMutedロール(そのロールのIDを介して指定したロール)を与え、そのロールをメンバーに与えます。次に、5秒待ってから(これは好きなように変更できます)、コマンドメッセージを削除します。

Bagle Jan 19 2021 at 19:09

使用できる2つの方法を次に示します。


最初の方法はawait asyncio.sleep、asyncioimportを使用して使用することです。私たちが使用しない理由はtime.sleep、これがブロッカーになるためです。ブロッカーとは、このコマンドを1つの場所で使用すると、ボット全体が停止し、完了するまで他のユーザーがコマンドを使用できないことを意味します。例は次のとおりです。

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'

2番目の方法はdelete_after、ボットのメッセージのみを削除することを想定して使用することです。ドキュメントへの直接リンクを取得できませんでしたが、次のように述べています。

delete_after(float)–指定されている場合、送信したメッセージを削除する前にバックグラウンドで待機する秒数。削除が失敗した場合、それは黙って無視されます。

例は次のとおりです。

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

その他の紹介リンク:

  • SO:ボットに5秒後に自分のメッセージを削除させる方法
  • SO:Discord.py特定の時間が経過した後にボットにメッセージを削除させるにはどうすればよいですか?
  • SO:discord.pyでボットのメッセージを削除する

:これらのコマンドは両方ともテスト済みであり、両方のコマンドは期待どおりに機能します。