discord.py Button,SelectMenu追加方法

## 更新
ソースがなかった為追加しました。

## 前書き
discord.py2.0ではボタンとセレクトメニューが追加され非常に豊かな表現が出来るようになりました。
本書執筆現在ではなかなか調べても情報が出てきませんので、備忘録として本書を執筆しました。

## この記事で出来ること
* コマンドから任意の文字の入ったボタンを複数件作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495476/8bfed163-f8e7-36f1-40da-a109023f2228.png)

* コマンドから複数要素が入ったセレクトメニューを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495476/72454d72-65dc-b4c5-a9b4-8412931a9532.png)

## 作者環境
* Python 3.8以降
* discord.py 2.0.1
      * 執筆時点の最新バージョンです。

```:discord.py 2.0インストール
pip install -U discord.py
```

## コマンドから任意の文字の入ったボタンを複数件作成する
コードは以下になります。

```python:Buttonサンプル
class HogeButton(discord.ui.View):
    def __init__(self,args):
        super().__init__()

        for txt in args:
            self.add_item(HugaButton(txt))
class HugaButton(discord.ui.Button):
    def __init__(self,txt:str):
        super().__init__(label=txt,style=discord.ButtonStyle.red)

    async def callback(self, interaction: discord.Interaction):
        await interaction.response.send_message(f'{interaction.user.display_name}は{self.label}を押しました')

@bot.command()
async def makeButton(ctx: commands.context,*args):
    await ctx.send('Press!', view=HogeButton(args))
```
***
makeButtonコマンドで任意の数ボタンを出すことが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495476/8bfed163-f8e7-36f1-40da-a109023f2228.png)

もちろん引数を増やせば要素を増やすことが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495476/56ed7a5f-4eb2-a81f-41b1-2a43ff2407b4.png)

```python
class HugaButton(discord.ui.Button):
    def __init__(self,txt:str):
        super().__init__(label=txt,style=discord.ButtonStyle.red)

    async def callback(self, interaction: discord.Interaction):
        await interaction.response.send_message(f'{interaction.user.display_name}は{self.label}を押しました')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495476/520cdd90-3b00-66f7-004b-a6dd006de156.png)

>注意する点としてこちらは処理はcallbackで定義すると動作しないと言う点です。
理由としてButtonクラスの上位クラスであるitemクラスにcallbackをオーバーライドしているからです。

## コマンドから複数要素が入ったセレクトメニューを作成する
コードは以下になります。

```python:SelectMenuサンプル
class HogeList(discord.ui.View):
    def __init__(self,args):
        super().__init__()
        self.add_item(HugaList(args))

class HugaList(discord.ui.Select):
    def __init__(self,args):
        options=[]
        for item in args:
            options.append(discord.SelectOption(label=item, description=''))
    
        super().__init__(placeholder='', min_values=1, max_values=1, options=options)

    async def callback(self, interaction: discord.Interaction):
        await interaction.response.send_message(f'{interaction.user.name}は{self.values[0]}を選択しました')
```
***
makeListコマンドで任意の数ボタンを出すことが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495476/72454d72-65dc-b4c5-a9b4-8412931a9532.png)

***

こちらについても要素数は自由に増やせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495476/ba7b0a13-601d-6a8a-b503-acd4170deb2b.png)

***

選択した際の処理についてはHugaListクラスのcallback内に記述することで動作します。

```python
class HugaList(discord.ui.Select):
    def __init__(self,args):
        options=[]
        for item in args:
            options.append(discord.SelectOption(label=item, description=''))
    
        super().__init__(placeholder='', min_values=1, max_values=1, options=options)

    async def callback(self, interaction: discord.Interaction):
        await interaction.response.send_message(f'{interaction.user.name}は{self.values[0]}を選択しました')
```
***
こちらも処理もcallbackで定義する必要があります。理由についてはButtonと同じです。

## 今回のソース

https://github.com/somakai-sumasi/discord.py2.0_button_select

## 参考ページ

https://github.com/Rapptz/discord.py/tree/master/examples/views