DiscordのBotをPythonで作ってみた

# はじめに
友達とゲームをするときにボイスチャットって重要ですよね．ボイチャアプリを色々ネットで探してたら**[Discord](https://discordapp.com/)が強い**ということを小耳にはさみました．せっかくDiscordを使うならBotを使って便利にしてみようと思いました．

## 今回作るもの
友達がDiscordのサーバに接続(≒ゲームを開始)したら「○○さんがonlineになりました！」みたいな投稿するBotがあれば便利そうなので作ってみます．

## 下準備
DiscordのBotを作るには以下のことをしておく必要があります．
1. Discordのアカウントを作成
2. Botのトークンキー取得
3. [discord.py](https://github.com/Rapptz/discord.py)のダウンロード

1.はアカウントを作るだけなので省略します．以下で，2-3について述べていきます．

### Botのトークンキー取得
[Discordの開発者用のページ](https://discordapp.com/developers/applications)で新しいBotを登録します．

1. マイアプリの新しいアプリをクリック
<img src="https://qiita-image-store.s3.amazonaws.com/0/264085/fe50d795-c9b6-0737-3524-3671a5183b78.png" width=80%>
Discordのこういうところ好き
<img src="https://qiita-image-store.s3.amazonaws.com/0/264085/12ecf2c6-477e-2a1d-862c-be8c7ae9ae73.png" width=80%>

2. アプリケーション名のところにBotの名前を記入
<img src="https://qiita-image-store.s3.amazonaws.com/0/264085/3bb851af-1618-69ef-2888-ac13b239257d.png" width=80%>

3. Botユーザを作成をクリック
<img src="https://qiita-image-store.s3.amazonaws.com/0/264085/5c267c8a-8d3c-3745-4ec7-684b04043f20.png" width=80%>

4. トークンキーを確認（後で使います）
<img src="https://qiita-image-store.s3.amazonaws.com/0/264085/844bf893-f9f6-a8f8-4a49-7526d7035a12.png" width=80%>

5. Generate OAuth2 URLをクリック
![キャプチャ6.PNG](https://qiita-image-store.s3.amazonaws.com/0/264085/7bc4cb51-3fb2-b990-0564-1a046130720a.png)

6. 表示されたURLに飛ぶ
<img src="https://qiita-image-store.s3.amazonaws.com/0/264085/6127db0e-6998-d7b6-0f50-57192da42c3e.png" width=80%>

7. 自分のサーバにBotを追加
<img src="https://qiita-image-store.s3.amazonaws.com/0/264085/85c8b4d3-c06b-d42c-8bc5-0fd6f9d02ca9.png" width=50%>

こんな感じに追加できていたら準備完了です．
![キャプチャ9.PNG](https://qiita-image-store.s3.amazonaws.com/0/264085/698d926c-e1d9-5b4f-a14a-fc4072cf8261.png)

### discord.pyのダウンロード
pipを使ってインストールします．

```shell

$ pip install discord.py
```

## Bot作成
discord.pyをインポートし，トークンキーとテキストチャットのチャンネルIDを書いておきます．

```python

import discord

TOKEN = "**************************" # トークンキー
TEXT_CHANNEL = **************************** # テキストチャットのチャンネルID
 
client = discord.Client()
 
text_chat = discord.Object(id=TEXT_CHANNEL)
```
チャンネルIDは詳細設定の開発者モードをオンにした後，
<img src="https://qiita-image-store.s3.amazonaws.com/0/264085/4dc7cf53-55b0-6b43-966d-320e0b0ffb3e.png" width=80%>
チャンネルを右クリックすると，IDをコピーできます．
![キャプチャ11.PNG](https://qiita-image-store.s3.amazonaws.com/0/264085/b5c56c5d-609c-0494-80c0-3643c37767f9.png)

今回は，「Botがログインしたら」，「こんにちはメッセージが送られてきたら」，「メンバのステータスが変更されたら」の3つの機能を実装してみました．

```python

# Botがログインしたら
@client.event
async def on_ready():
    msg = "やあ！TEST Botです．よろしくね！"
    await client.send_message(text_chat,msg)
 
# こんにちはメッセージ
@client.event
async def on_message(message):
    if message.content.startswith("こんにちは"):
        if client.user != message.author:
            msg = "こんにちは " + message.author.name + "さん！"
            await client.send_message(message.channel, msg)
 
# メンバのステータスが変更されたら
@client.event
async def on_member_update(before, after):
    if before.status != after.status:
        msg = after.display_name + " さんが " + str(after.status) + " になりました"
        await client.send_message(text_chat,msg)

# Bot起動
client.run(TOKEN)
```
[on_ready](http://discordpy.readthedocs.io/en/latest/api.html#discord.on_ready)，[on_message](http://discordpy.readthedocs.io/en/latest/api.html#discord.on_message)，[on_member_update](http://discordpy.readthedocs.io/en/latest/api.html#discord.on_member_update)などの使い方は[APIリファレンス](http://discordpy.readthedocs.io/en/latest/api.html)を参考にしました．
基本的に`send_message(CHANNEL,MESSAGE)`で，任意のチャンネルにメッセージを送信できます．

## 実行結果
```
$ python3 test.py
```
Botがあいさつしてくれます．
![キャプチャ14.PNG](https://qiita-image-store.s3.amazonaws.com/0/264085/ca14c572-dfaf-ec00-653b-8861cd6dd008.png)

ユーザが接続，切断するたびに通知が飛びます．
<img src="https://qiita-image-store.s3.amazonaws.com/0/264085/2915de38-afa3-d8e1-08de-b9ab9f57146a.png" witdh=50%>

最初のほうはよかったんですが，通知が飛びまくるのでだんだんうざく感じるようになりました．．．
（友達から通知がうるさいと苦情が来たので，この機能はお蔵入りになりました．．．．．）

## 今回参考にしたページ
[意外と簡単だったからDiscordのBOTを作ってみるよ](https://foolean.net/p/1657)
[Pythonで実用Discord bot(discord.py解説)](https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f)
[Pythonで簡単なDiscord Botの作り方](https://qiita.com/PinappleHunter/items/af4ccdbb04727437477f)
[API Reference - discord.py 0.16.12 documentation](http://discordpy.readthedocs.io/en/latest/api.html)