📝
私流d.pyでモーダルの作り方
超急ぎで書いてるので結構適当です
完成品
/オウム返し
でモーダルが出現、内容を入力し送信すると内容をそのまま返してくれるコードです。
モーダル画面
コマンドの同期と、オウム返し
コード全体
import discord
from discord import app_commands
intents = discord.Intents.all()
client = discord.Client(intents=intents)
guild = discord.Object(id=GUILD_ID)
tree = discord.app_commands.CommandTree(client)
class Parroting(discord.ui.Modal):
"""オウム返しするモーダル"""
text_input = discord.ui.TextInput(
label="オウム返しする文章を入力してください",
style=discord.TextStyle.short
)
def __init__(self):
super().__init__(title="オウム返し", timeout=None)
async def on_submit(self, interaction: discord.Interaction):
prompt = self.text_input.value
await interaction.response.send_message(f"{prompt}", ephemeral=True)
@client.event
async def on_ready():
"""起動を知らせる処理"""
print("起動したよ\nクライアント: "
+ str(client.user)
+ " , "
+ str(client.application_id))
@client.event
async def on_message(message: discord.Message):
"""syncするための処理"""
if message.author == client.user:
return
elif message.author.id == client.application.owner.id:
if message.content == "./ sync":
await tree.sync(guild=guild)
await message.reply("✅")
@tree.command(name="オウム返し", description="オウム返しするよ。")
@app_commands.guilds(guild)
async def parrot(interaction: discord.Interaction):
await interaction.response.send_modal(Parroting())
client.run("TOKEN")
モーダルの作り方
- モーダルはクラス内でdiscord.ui.Modalを指定して作成します。
class hogehoge(discord.ui.Modal):
...
- 質問の設定をする
discord.uiについてるtext_input
を使って、質問の設定をします。
text_input = discord.ui.TextInput(
label="オウム返しする文章を入力してください",
style=discord.TextStyle.short
)
よく使うattributes
label | style | placeholder | default | min / max_length |
---|---|---|---|---|
質問のタイトル | 回答欄の大きさ | 何も入力されてないときに薄く表示されるやつ | デフォルト値 | 文字制限 |
str |
discord.TextStyle |
str |
str |
int |
こちらのDocs でもattributes見れます
- titleとtimeoutの指定をする
def __init__(self):
super().__init__(title="オウム返し", timeout=None)
titleは左上のタイトルです
左上のタイトル
timeoutはモーダルが起動してから入力を受け付けなくなるまでの時間指定です
None
でタイムアウト無し、またこれはfloat型なので小数とかも可能
- 送信されたときの処理を書く
async def on_submit(self, interaction: discord.Interaction):
...
さっき書いたdef __init__
の下にon_submit
の処理を書いて、送信されたときの処理を書くことができます
また、質問への回答の取得は
...
question = discord.ui.TextInput()
...
async def on_submit(...):
hogehoge = self.question.value
で可能です。
- モーダルの送信
await interaction.response.send_modal(Parroting())
これで完了です✨✨✨
お疲れ様です✨✨✨これであなたもモーダルマスター✨✨✨
Discussion