Ruby
bot
discord
暗号通貨
DiscordDay 18

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

はじめに

この記事は Discord Advent Calendar 2017 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に関してはこ↑こ↓を参照してください

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://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で実行する場合先にこ↑こ↓の作業を行ってから実行してください.
ご覧戴き、ありがとうございました!!

参考サイト