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

Code

はじまり

リサちゃん
リサちゃん

ふうう・・・、リファレンスを見ながら動作を確認するのって
しんどいよね・・・

135ml
135ml

確かに、UI絡みのものだったら

すぐに一覧を見れたら助かるよな

リサちゃん
リサちゃん

Pycordで入力できるUIをリストにしてほしいです!

135ml
135ml

うっす。

PycordのApplicationCommand

はい、ゲームを嗜む者であれば殆どの人が御用達である「Discord」。

そこでは、引数を取ってボットとやり取りできる機能があります。

それが「スラッシュコマンド」というものになります。

そして、PythonでDiscordのボットを動かすためのライブラリ「Pycord」にて、

そのスラッシュコマンドの引数を入力するための形式がいくつかあります。

Pycordのリファレンスのページはここですが・・・、

Application Commands
Command Permission Decorators: Commands: Shortcut Decorators: Objects: Attributes full_parent_name, qualified_id, qualif...

実際にどう動くのかは、文章だけじゃなかなか想像しにくいですよね。

それに、それを一つ一つどう動くのかを確認するのも骨が折れます。

そこで! 私めは、骨を折って、そのApplicationCommandで引数を入力できるUIを一覧にしてまとめました!

まあ、実のところ、分からない箇所もあったのですが、一助になれば良いかなと思います。

引数入力のUI一覧

先程貼ったリファレンス内にあるdiscord.Option.input_typeは、以下の値を取ります。

取り得るデータ型
Type[abc.GuildChannel]
Type[Thread]
Type[Member]
Type[User]
Type[Attachment]
Type[Role]
Type[abc.Mentionable]
SlashCommandOptionType
Type[ext.commands.Converter]
Type[enums.Enum], Type[Enum]

これから、こんな感じの関数を実行して確認していきます。

「タグ」という語句には何の意味もありません。僕のためのツールを作っている時に調べたコードなのでこうなっています。

intents = discord.Intents.default()
intents.message_content = True
bot = 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 instantiated

Type[enums.Enum], Type[Enum]

こちらは列挙型ですね。

今回、列挙型を特に宣言せずにスクリプトを動かしたので、案の定エラーになりました。

printされた結果はこんな感じ。

IndexError: list index out of range

おしまい

リサちゃん
リサちゃん

ははあ、まあ大体どんな風に動くのかは分かったよ。

135ml
135ml

色々な形で引数を持ってこれるから、

色々な処理が展開できそうですね。

以上になります!

コメント

タイトルとURLをコピーしました