実現したいこと
・@bot.tree.commandというデコレータを使い、スラッシュコマンドを実装したい
・コマンドの実行があった場合、メッセージを返したい
・そのメッセージをX秒後に削除したい
・そのメッセージのIDを取得したい
前提
はじめたての初心者です。
discord.pyでbotを作っています。
・質問内容
質問内容は、[実現したいこと]の通りです。
以下のソースコードを実行しましたが、28行目が書けず困っています。
該当のソースコード
python
1import os 2from dotenv import load_dotenv 3import asyncio 4 5import discord 6from discord.ext import commands 7from discord import app_commands 8 9load_dotenv() 10token = os.getenv('DISCORD_BOT_TOKEN') 11 12bot = commands.Bot(command_prefix="!", intents=discord.Intents.all()) 13 14 15# コマンドの同期 16@bot.event 17async def on_ready(): 18 await bot.tree.sync() 19 print(f'{bot.user} is UP and READY') 20 21 22# ギルドコマンドとして登録 23@app_commands.guilds(discord.Object(id='サーバーid')) 24# 問題のコード 25@bot.tree.command(name="ping", description="pongと返します") 26async def ping(interaction: discord.Interaction): 27 await interaction.response.send_message('pong\nこのメッセージは5秒後に削除されます') # このメッセージのid入手したい 28 message = await interaction.channel.fetch_message() # ここが書けずに困っています 29 await asyncio.sleep(5) 30 await message.delete() 31 32 33bot.run(token) 34
検討したこと
①interaction.channel.last_message_idで直近のメッセージIDを取得し、これを削除する方法
または
➁interaction.channel.history()でメッセージIDを取得してこれを削除する方法
python
1@bot.tree.command(name="ping", description="pongと返します") 2async def ping(interaction: discord.Interaction): 3 await interaction.response.send_message('pong\nこのメッセージは5秒後に削除されます') 4 5 channel = interaction.channel 6 async for mes in channel.history(limit=30): 7 if mes.author == bot.user: 8 if f'{mes.content}' == 'pong\nこのメッセージは5秒後に削除されます': 9 mes_id = mes.id 10 break 11 12 message = await channel.fetch_message(mes_id) 13 await asyncio.sleep(5) 14 await message.delete()
この二つを考えましたが、遅延などにより取得するメッセージがズレてしまわないか心配しています。
(後者は異なるユーザーが、同一のメッセージIDを取得するケースを考えました)
そこで、より確実で簡潔な方法がないか探しています。
拙い質問ですが、よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
Python 3.11.2
discord.py 2.2.2
powershellで実行しています
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/03/10 05:43