Discord bot備忘録 ①ボット作成編

# はじめに
Discord bot を作成した備忘録

とある事情でDiscord bot を作成したいと思ったので、bot作成から様々なアクションの備忘録
slackbot以外にも手を出してみたかった

お品書きは以下の通り

* Discord とは
* Discord bot の作成方法
* モジュール，ディレクトリ構造など
* いろいろ作ってみた

# Discord とは
> Discord(ディスコード)とは、～～～ 音声通話・VoIPフリーソフトウェアである。
> （Wikipediaより）

私は今までSlackみたいに使ったことが何度かあった

SlackにボットがあるんだからDiscordも…と思って調べてみたらdiscordにもあったので作ってみようと

# Discord bot の作成方法

<a href="https://discordapp.com/developers/applications/" rel="nofollow noopener" target="_blank">discord developer</a>から作成

Applications ページの New Applicationをクリック
![cut1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/90f3e497-6c53-b644-6109-f30f94ea690b.png)

ボット名を聞かれるので好きなボット名をつける

Bot ページを開き、Add Botボタンをクリック
Yes, do it!もクリック
![cut2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/104abc6c-5fba-8b41-5c79-6d5a3056bca5.png)

作成されたボットが表示される
アイコンや名前も変更可能

**TOKEN名をコピーしておく**
![cut3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/6a3c9825-536c-5a2b-2cc7-ffa89759e60e.png)

OAuth2を以下のように設定する
（とりあえずTEXT系はすべてONにしてみた）
![cut4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/ea307953-f5c7-d318-ac28-d8daa15587c2.png)
![cut5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/4d4abdaf-c67b-345c-4563-2ee2cb461f3b.png)

OAuth2設定画面にあるURLに接続するとどこのDiscordルームにBotを招待するか聞かれる
正体が完了されれば、見事Botがルームに入ってくる

![cut6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/9613ada1-49a2-dd41-0e61-e9d2fd6e2210.png)

# モジュール，ディレクトリ構造など
### モジュール
モジュールは以下の通り
必要があればインストールしてください

```
pip install discord   # discordを使用する際に必要
```

### ディレクトリ構造
ディレクトリ構造は以下の通り

```
- dis_python
  - img
    - good.png
  -dis_test.py
```

# いろいろ作ってみた

### 公式さん
<a href="https://discordpy.readthedocs.io/ja/latest/index.html" rel="nofollow noopener" target="_blank">discord.py</a>さんいろんなことが書いてあります。
やってみたいことを徹底的に調べると楽しい

### プログラム

```python:dis_test.py
import discord

TOKEN = "BotのTOKENを張り付ける"
client = discord.Client()

GOOD_IMG = "./img/good.PNG"

### イベントハンドラ一覧 #################################################
# async def の後を変えるだけで実行されるイベンドが変わる
# メッセージ受信時に実行：   on_message(message)
# Bot起動時に実行：      on_ready(message)
# リアクション追加時に実行:  on_reaction_add(reaction, user)
# 新規メンバー参加時に実行： on_member_join(member)
# ボイスチャンネル出入に実行： on_voice_state_update(member, before, after)
###################################################################


# bot起動時処理
@client.event
async def on_ready():
    channel = client.get_channel(チャンネルIDを張り付ける)
    await channel.send("やぁ！元気かい？")

# message を受け取ったとき
@client.event
async def on_message(message):
    # 送り手がボットの場合、無視
    if message.author.bot:
        return
    
    if message.content.startswith("こんにちは"):
        await message.channel.send("こんにちは！")
    
    if len(message.attachments) > 0:
        await message.channel.send("何かファイルを送ったね？？？")

@client.event
async def on_reaction_add(reaction, user):
    await reaction.message.channel.send('{}を押したね？？'.format(reaction.emoji), file=discord.File(GOOD_IMG))


client.run(TOKEN)
```

細かい説明は次回にまとめることとします…

### 少し解説
TOKEN と チャンネルIDは自分が使用しているものを使ってください
チャンネルIDはURLの一番後ろの「数字たち２」です

> ://discordapp.com/channels/数字たち１/数字たち２

イベントハンドラ一覧には使いそうなものをまとめてあります
特にon_message()は良く使いますねー

### 出力結果
コマンドライン
![cut7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/2272767f-d2da-827c-9416-35bb149b91dc.png)

botとの戯れ
![cut8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/1bfb9c5e-6b92-8a06-55bc-89d945a6ad64.png)
![cut9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/7f0ebb2e-3f21-d1d7-9018-5d24d802ea14.png)


とりあえずざっとまとめてみた

ドキュメントに関しては内容が濃いので、次回に回したいと思います
特にon_messageでのファイル操作などが意外と面倒だったのでそのあたりの備忘録を( ˘ω˘ )