#はじめに
この記事は 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
以上ですね.
#雛形を書いてみる
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.command(:コマンド名, description: "説明文(あってもなくても良い)") do |event,変数|
# 全チャンネルで反応
event.respond "返す文字"
# 特定のチャンネルで反応
bot.send_message(channel_id=ChannelID, "返す文字列")
end
説明文に関してはデフォルトで!help コマンド名 でそのコマンドの説明が見れます.
そこに書かれる説明文のことです.
チャンネルIDに関してはこ↑こ↓を参照してください.
#Botを登録する
- https://discordapp.com/developers/applications/me にアクセスする
- NewAppをクリック
- APP NAMEを入力しCreate Appをクリック
- Client IDとclick to revealをクリックして出てきたClient Secretを控える
- https://discordapp.com/oauth2/authorize?client_id=ClientID&scope=bot&permissions=0 のClientIDを控えた18文字くらいの数字に置き換えアクセス
- Botを入れたいサーバを選択しBotを入れる
これでBotの登録は終わりました.
#パパっと書いて起動!
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形式で暗号通貨の日本円レートが取得できるのでそれをパースしているだけです.
#ソースの全貌
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://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