📝

私流d.pyでモーダルの作り方

2024/10/22に公開

超急ぎで書いてるので結構適当です

完成品

/オウム返し でモーダルが出現、内容を入力し送信すると内容をそのまま返してくれるコードです。

モーダル画面

コマンドの同期と、オウム返し

コード全体

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")

モーダルの作り方

  1. モーダルはクラス内でdiscord.ui.Modalを指定して作成します。
class hogehoge(discord.ui.Modal):
    ...
  1. 質問の設定をする
    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見れます

  1. titleとtimeoutの指定をする
def __init__(self):
    super().__init__(title="オウム返し", timeout=None)

titleは左上のタイトルです

左上のタイトル
timeoutはモーダルが起動してから入力を受け付けなくなるまでの時間指定です
Noneでタイムアウト無し、またこれはfloat型なので小数とかも可能

  1. 送信されたときの処理を書く
async def on_submit(self, interaction: discord.Interaction):
    ...

さっき書いたdef __init__の下にon_submitの処理を書いて、送信されたときの処理を書くことができます
また、質問への回答の取得は

...
question = discord.ui.TextInput()
...
async def on_submit(...):
    hogehoge = self.question.value

で可能です。

  1. モーダルの送信
await interaction.response.send_modal(Parroting())

これで完了です✨✨✨
お疲れ様です✨✨✨これであなたもモーダルマスター✨✨✨

Discussion