DiscordBotをGoogleHomeで音声操作してみる

#[Discord Advent Calendar 2017](https://qiita.com/advent-calendar/2017/discord) 5日目

空いてたので滑り込みで来ました。
Discordの記事増えろ！！！

#はじめに
GoogleHomeをスプラトゥーンというか、ゲームライフのアシスタントとして使えるよう
色々やっていました。まあスプラトゥーンなんですけど。
[GoogleHomeをDialogflow(旧:API.ai)でスプラトゥーンアシスタントにする](https://qiita.com/kotatu_km/items/c06f45c6692dceb9258d)
[GoogleHomeをスプラトゥーンアシスタントにする #2 Twitterからステージ情報の取得](https://qiita.com/kotatu_km/items/c340027914d690095b66)

Discordはゲームのボイスチャットにとても使いやすいのでスプラの身内等で僕も使って居るんですが、ゲーム中のBotの操作についてちょっと不満があります。
それは**キーボードを打たなければいけない**こと！
`!bot hoge`みたいな奴ですね

コマンド入力するんだから当たり前だろという話ですが、
コントローラー🎮を握っているのにキーボード⌨️なんて打ってる暇ない！
訳です。
音声認識をしてくれてwebhookでDiscordと繋がる夢のような機器があればなあ・・・

<img src="https://qiita-image-store.s3.amazonaws.com/0/54085/4dda18c9-c918-b88f-527e-7ea4b8a7b963.jpeg" width=80%>
ありました。
こいつを使おう！

完成品を見たい人はこちら↓
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/4ghVHpK8Yf8/0.jpg)](http://www.youtube.com/watch?v=4ghVHpK8Yf8)

という訳で、DiscordのBotへのコマンド入力をGoogleHomeを介して音声入力でやってみようという記事です。
#使用ツール・環境
- Google Home
- [IFTTT](https://ifttt.com/)
- ruby 2.1.5p273
- [discordrb](https://github.com/meew0/discordrb)


#DiscordBotの作成
導入やらBotの作り方は他のアドカレの方が書いてくれると信じているので、ソースコードをいきなり載せます。
僕は[こちら](https://qiita.com/deneola213/items/efaeb0f5c20d44608a71)を参考にしました。
[イチからDiscord Bot 。for Ruby](https://qiita.com/deneola213/items/efaeb0f5c20d44608a71)

```rb:discord_bot.rb
require 'discordrb'
require "csv"

#client_idはbotに設定されているものを入力 prefixはコマンドの呼び出しの時の記号(!play 等の!部分 ?とかでも可)
bot = Discordrb::Commands::CommandBot.new token: '自分のトークン', client_id: 000000000000, prefix: '!'
#スプラトゥーンの武器名が入っているcsvファイルを読み込み
data = CSV.read('buki.csv')

#"!random_buki"とチャットに入力があった場合反応
bot.command :random_buki do |event|
  #botの居るサーバー
  server = bot.servers.first[1]
  for num in 0..server.channels.length do
    　#チャンネル名で検索
    if server.channels[num].name == "test_ch" then
      #チャンネル内に居るユーザー取得
      users = server.channels[num].users
      for num in 0..users.length do
        　#ユーザー名とランダムに選んだブキ名をチャット欄に返す
        event.respond "#{users[num].name}:#{data[rand(0..data.length)][0]}"
      end
    end
  end
end

bot.run
```
読み込むCSVはrubyファイルと同じ所に置きます。
<img width="160" alt="スクリーンショット 2017-12-05 19.59.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/54085/56f9fa5f-c57e-7b58-f5da-81b0916f70ce.png">
csvはこんなんです。~~カンマがないのにcsvとは~~
武器名を書いただけ。ここにブキの種類書いて種類毎にブキ選出とかできそうですね~~誰かやって~~


後はターミナルでこれをRUN!
`ruby discord_bot.rb`
するとチャンネルにBotが出て来ます。(名前違うのは気にしないで)
<img width="162" alt="スクリーンショット 2017-12-05 20.01.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/54085/65173ea6-2ba1-79b8-a0c4-217c77e5139e.png">

この時点でチャット欄にコマンドを打てばもう反応します。
<img width="329" alt="スクリーンショット 2017-12-05 21.59.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/54085/ba4e3860-e69a-1461-1bb1-f40306d8e5bf.png">
コマンドを打った人と同じチャンネルに居る人へブキを配布してくれます。これでBot部分は完成！次はこのコマンドを音声入力でGoogleHomeにやってもらいましょう。

#IFTTTの作成
みんな大好き[IFTTT](https://ifttt.com)でDiscordにコマンドを打つ…んですが、IFTTTがまだDiscordと連携していないので、webhook経由でDiscordと繋ぎましょう。

[Twitter投稿をDiscordにWebhookを使って流す方法(IFTTT使用)](http://nta8blog.blogspot.jp/2017/02/discordtwitterifttt.html)
こちらの記事でははTwitter投稿→Didcordへ投稿を解説してくれていますが、このTwitter部分をGoogleHomeのGoogleAssistantへ変えればOKです。

チャンネルを右クリックし、チャンネルの編集
<img width="227" alt="スクリーンショット 2017-12-05 20.24.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/54085/6ea6e186-af3b-f12a-414a-7a463cd4cc8b.png">
webhooksからwebhookを作成。
<img width="926" alt="スクリーンショット 2017-12-05 20.25.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/54085/f01906d0-1f70-5d57-77ab-3306132079fd.png">
ここからIFTTTの作業になります。

**NewApplet**から**If**は**GoogleAssistant**の"Say a simple phrase"でDiscordBotを呼び出しするフレーズを設定します。今回は`「ディスコード 武器」`にしました。
他にも`「discord 武器」` `「ディスコード ぶき」`などを設定しておいて認識ズレを減らしておきます。
**That**は**webhook**を選択します。

<img width="600" alt="ifttt.png" src="https://qiita-image-store.s3.amazonaws.com/0/54085/2a5af146-5f34-b11f-e79a-8ed3f49d307c.png">
webhook側では、画像の通りURL,Method,ContentType,そして**Body**を入力します。
このBodyの**content**がチャット欄に入力される部分なので、ここへBotの呼び出しのコマンドを入れればOKです。
username(発言者の名前となる部分)は分かりやすく"GoogleHome"とし,contentを`!random_buki`とします。

#完成
以上でセッティングは完了！早速呼び出してみましょう。
>OK,Google！　ディスコード、ブキ！

GoogleHome「ディスコードに投稿しました。」
<img width="300" alt="FullSizeRender 2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/54085/537953d2-871f-6c64-5d12-b1c3a53b07fa.jpeg">
IFTTTが発火！
<img width="300" alt="FullSizeRender 1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/54085/7ebb56f5-11df-5225-d726-16dd584e3e26.jpeg">
Discordに来てみると・・・(動画のキャプで荒くてすいません)
![FullSizeRender 4.jpg](https://qiita-image-store.s3.amazonaws.com/0/54085/aad64ce4-7f40-63cb-c3b9-66148110e063.jpeg)
チャンネル内に居る人へ
![FullSizeRender 3.jpg](https://qiita-image-store.s3.amazonaws.com/0/54085/bc46aad8-b785-a823-86fa-e6ab23922deb.jpeg)
<img width="364" alt="スクリーンショット 2017-12-05 21.38.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/54085/e8092504-9cc0-7ede-9fff-1587746ad6b5.png">

Botがブキを指定してくれました！

動画は[こちら](http://www.youtube.com/watch?v=4ghVHpK8Yf8)
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/4ghVHpK8Yf8/0.jpg)](http://www.youtube.com/watch?v=4ghVHpK8Yf8)

#まとめ
DiscordのBotを音声で操作できるようになりました。DiscordのBotは有志の方々が[色々](https://discordbots.org/)作っているので、ハンズフリーなBot操作で楽しんで見てはいかがでしょうか！
Discordの技術的な記事が中々無いので僕も頑張っていきたい所ですね。
駆け込みでしたが[Discord アドベントカレンダー](https://qiita.com/advent-calendar/2017/discord)、楽しみにしています。

ではスプラトゥーンで会いましょう！

#参考
[イチからDiscord Bot 。for Ruby - Qiita](https://qiita.com/deneola213/items/efaeb0f5c20d44608a71)
[Twitter投稿をDiscordにWebhookを使って流す方法(IFTTT使用)](http://nta8blog.blogspot.jp/2017/02/discordtwitterifttt.html)