Rubyで定期的に暗号通貨のレートをつぶやくDiscordのBotを作ろう! 

#はじめに
この記事は [Discord Advent Calendar 2017](https://qiita.com/advent-calendar/2017/discord) 18日目の記事です.
また、私のQiita初投稿記事でもあります.
間違った知識や、言葉遣いはコメント等で教えていただけると幸いです.
纏まりのない文章ですがそれでもよければ、どうぞ.

#Discordとは  
>Discord(ディスコード)はMicrosoft Windows, macOS, Android, iOS, Linux、Webブラウザで動作する、ゲーミング用に開発された無料のVoIPアプリケーション。
wikipediaより引用

簡単に言えばマルチプラットフォームな音声,ビデオ通話付きチャットツール
ゲーマー向けに言えば Skype + TeamSpeak
エンジニア向けに言えば 通話機能付きのslackですね.
公式サイト: <https://discordapp.com/>

#事前準備
* Rubyの開発,実行環境の構築(gemも含む)
* Rubyの基本的な構文の学習
* Discordのアカウントの取得
* Discordの基本操作習得

#必要なライブラリのインストール
dircordrbというライブラリを使用します.
GitHub: <https://github.com/meew0/discordrb>
RubyDoc: <http://www.rubydoc.info/gems/discordrb/>
Discord: <https://discord.gg/3Trm6FW>
```
$ gem install discordrb
```
以上ですね.

#雛形を書いてみる
```bot.rb
require "discordrb"
require "json"
require "open-uri"
require 'net/http'
require "date"

bot = Discordrb::Commands::CommandBot.new token: "TOKEN", client_id:  CLIENTID, prefix: "!"

# 指定したsecごとに処理を実行する
# http://tbpgr.hatenablog.com/entry/20120624/1340549187 より引用
def execute_each_sec(sleep_sec)
  yield
  sleep sleep_sec
end

# コマンドボット等
bot.command(:hello, description: "hello Worldを返す") do |event|
  event.respond "Hello World"
end

bot.run :async
  loop do
    execute_each_sec(3600) do ||
      # こ↑こ↓の処理を3600秒毎に定期実行
    end
  end
bot.sync

```
TOKENとCLIENTIDは次の項で説明します。
```prefix:'!'```ここの''の中見でコマンドボットの呼び出し方が変わります
この場合!helloと打つとBotがHello Worldと返してくれます

チャットボットは下のような形で書くことができます

```bot.rb
bot.command(:コマンド名, description: "説明文(あってもなくても良い)") do |event,変数|
　# 全チャンネルで反応
  event.respond "返す文字"
 # 特定のチャンネルで反応
  bot.send_message(channel_id=ChannelID, "返す文字列")
end
```

説明文に関してはデフォルトで!help コマンド名 でそのコマンドの説明が見れます.
そこに書かれる説明文のことです.
チャンネルIDに関しては[こ↑こ↓](https://support.discordapp.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID-)を参照してください.

#Botを登録する
1. https://discordapp.com/developers/applications/me にアクセスする
2. NewAppをクリック
3. APP NAMEを入力しCreate Appをクリック
4. Client IDとclick to revealをクリックして出てきたClient Secretを控える
5. https://discordapp.com/oauth2/authorize?client_id=ClientID&scope=bot&permissions=0 のClientIDを控えた18文字くらいの数字に置き換えアクセス
6. Botを入れたいサーバを選択しBotを入れる

これでBotの登録は終わりました.

#パパっと書いて起動!
```bot.rb
bot = Discordrb::Commands::CommandBot.new token: "TOKEN", client_id:  CLIENTID, prefix: "!"
# TOKENをClient Secretに置き換える
# ClientIDを控えた18文字くらいの数字に置き換える

execute_each_sec(3600) do ||
  # こ↑こ↓の処理を3600秒毎に定期実行
  mona = JSON.parse(Net::HTTP.get(URI.parse('https://api.zaif.jp/api/1/last_price/mona_jpy')))
  btc = JSON.parse(Net::HTTP.get(URI.parse('https://api.zaif.jp/api/1/last_price/btc_jpy')))

  time = Time.now + (3600 * 2)
  day = time.strftime("%Y/%m/%d:%A:")
  time = Time.now
  hms = time.strftime("%H:%M:%S")

  bot.send_message(channel_id=ChannelID,"#{day} #{hms} 現在")
  bot.send_message(channel_id=ChannelID,"モナコインの現在のレートは1monaあたり #{mona['last_price']} 円なり")
  bot.send_message(channel_id=ChannelID,"ビットコインの現在のレートは1btcあたり #{btc['last_price']} 円なり")
end
```
暗号通貨のレートはZaif: <https://zaif.jp/>より取得します.
[ZaifAPI](https://techbureau-api-document.readthedocs.io/ja/latest/index.html)より https://api.zaif.jp/api/1/last_price/通貨名_jpy の形でjson形式で暗号通貨の日本円レートが取得できるのでそれをパースしているだけです.

#ソースの全貌
```bot.rb
require "discordrb"
require "json"
require "open-uri"
require 'net/http'
require "date"

bot = Discordrb::Commands::CommandBot.new token: "TOKEN", client_id:  CLIENTID, prefix: "!"

def execute_each_sec(sleep_sec)
  yield
  sleep sleep_sec
end

bot.command(:hello, description: "hello Worldを返す") do |event|
  event.respond "Hello World"
end

bot.run :async
  loop do
    execute_each_sec(3600) do ||
       mona = JSON.parse(Net::HTTP.get(URI.parse('https://api.zaif.jp/api/1/last_price/mona_jpy')))
       btc = JSON.parse(Net::HTTP.get(URI.parse('https://api.zaif.jp/api/1/last_price/btc_jpy')))

      time = Time.now + (3600 * 2)
      day = time.strftime("%Y/%m/%d:%A:")
      time = Time.now
      hms = time.strftime("%H:%M:%S")

      bot.send_message(channel_id=ChannelID,"#{day} #{hms} 現在")
      bot.send_message(channel_id=ChannelID,"モナコインの現在のレートは1monaあたり #{mona['last_price']} 円なり")
      bot.send_message(channel_id=ChannelID,"ビットコインの現在のレートは1btcあたり #{btc['last_price']} 円なり")
    end
  end
bot.sync

```

あとは```$ ruby bot.rb```して起動すれば完成です.
また、Windowsで実行する場合先に[こ↑こ↓](https://qiita.com/whiteleaf7@github/items/4504b208ad2eec1f9357)の作業を行ってから実行してください.
ご覧戴き、ありがとうございました!!

#参考サイト
* https://discordapp.com/
* https://github.com/meew0/discordrb
* http://www.rubydoc.info/gems/discordrb/
* http://tbpgr.hatenablog.com/entry/20120624/1340549187
* https://zaif.jp/
* https://techbureau-api-document.readthedocs.io/ja/latest/index.html
* https://qiita.com/whiteleaf7@github/items/4504b208ad2eec1f9357