【Pycord】ApplicationCommandで入力できるUI形式を画像イメージ付きで紹介する
はじまり




PycordのApplicationCommand
はい、ゲームを嗜む者であれば殆どの人が御用達である「Discord」。 そこでは、引数を取ってボットとやり取りできる機能があります。 それが「スラッシュコマンド」というものになります。
そして、PythonでDiscordのボットを動かすためのライブラリ「Pycord」にて、 そのスラッシュコマンドの引数を入力するための形式がいくつかあります。
Pycordのリファレンスのページはここですが・・・、

実際にどう動くのかは、文章だけじゃなかなか想像しにくいですよね。 それに、それを一つ一つどう動くのかを確認するのも骨が折れます。
そこで! 私めは、骨を折って、そのApplicationCommandで引数を入力できるUIを一覧にしてまとめました! まあ、実のところ、分からない箇所もあったのですが、一助になれば良いかなと思います。
引数入力のUI一覧
先程貼ったリファレンス内にあるdiscord.Option.input_typeは、以下の値を取ります。
取り得るデータ型
Type[abc.GuildChannel]Type[Thread]Type[Member]Type[User]Type[Attachment]Type[Role]Type[abc.Mentionable]SlashCommandOptionTypeType[ext.commands.Converter]Type[enums.Enum],Type[Enum]
これから、こんな感じの関数を実行して確認していきます。 「タグ」という語句には何の意味もありません。僕のためのツールを作っている時に調べたコードなのでこうなっています。
intents = discord.Intents.default()intents.message_content = Truebot = discord.Bot(intents=intents)
webclippings = bot.create_group( name="webclippings" , description="Manage web-clippings" , guild_ids=guild_ids , guild_only=True)
@webclippings.command(name="search", description="入力したタグからシートに在る記事を探します", guild_ids=guild_ids)async def search( ctx: discord.ApplicationContext # ↓ この行のstrだけを変えて調べていきます。 ↓ , tag_required: Option(str, name="タグ1", description=config_obj["statement_for_search_by_tag_1"]) # ↑ これだけ ↑ , condition: Option(str, name="検索条件", description=config_obj["statement_for_search_by_tag_2"], choices=["and", "or"]) , tag_2: Option(str, name="タグ2", description=config_obj["statement_for_search_by_tag_1"], required=False) , tag_3: Option(str, name="タグ3", description=config_obj["statement_for_search_by_tag_1"], required=False) , tag_4: Option(str, name="タグ4", description=config_obj["statement_for_search_by_tag_1"], required=False) , tag_5: Option(str, name="タグ5", description=config_obj["statement_for_search_by_tag_1"], required=False) , tag_6: Option(str, name="タグ6", description=config_obj["statement_for_search_by_tag_1"], required=False)): ctx.defer() print(tag_required) print(type(tag_required))
if __name__ == "__main__": bot.run(config.BOT_TOKEN)Type[abc.GuildChannel]
まずは、引数にチャンネルを指定できる入力型です。 自分が参加している既存のチャンネル名から選択できます。

print された結果はこんな感じでした。
webclip2<class 'discord.channel.TextChannel'>Type[Thread]
次に、スレッドを選択できるデータ型です。

特にスレッドを配置していないので、今回は選択できません。

Type[Member]
これは、トークに参加しているメンバーの中から、引数に選択できます。

printされた結果はこんな感じ。
kinkinbeer135ml#5065<class 'discord.member.Member'>Type[User]
これに関しても、挙動は Type[Member] と同じに見えます。

printされた結果はこんな感じ。Type[Member] と同じデータ型ですね。
Webclip あゆ#3192<class 'discord.member.Member'>Type[Attachment]
これは、ファイルを添付できるデータ型です。

printされた結果はこんな感じ。CDNに上がった画像のURLが取得できます。
https://cdn.discordapp.com/ephemeral-attachments/XXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXX/discord_Member.png<class 'discord.message.Attachment'>Type[Role]
ロールを引数に持ってこれます。

printされた結果はこんな感じ。
@everyone<class 'discord.role.Role'>Type[abc.Mentionable]
メンバーとチャンネルを含めて、メンションできるものを引数に設定できます。

printされた結果はこんな感じ。
bot-searching-webclip<class 'discord.role.Role'>SlashCommandOptionType
これは特に調べませんでした。
Type[ext.commands.Converter]
特に選択肢などは出てこず。 適当に文字列を打ち込んでメッセージを送信すると、エラーになりました。

printされた結果はこんな感じ。よく分からなかったので飛ばします。
Application Command raised an exception: TypeError: Protocols cannot be instantiatedType[enums.Enum], Type[Enum]
こちらは列挙型ですね。 今回、列挙型を特に宣言せずにスクリプトを動かしたので、案の定エラーになりました。 printされた結果はこんな感じ。
IndexError: list index out of rangeおしまい


以上になります!
記事を共有
この記事が役に立ったなら、ぜひ他の人と共有してください!