slack-ruby-botを使ってみる
SlackのXMPPゲートウェイが閉じるという話があり、近いうちにruboty-slack gem(現在xmppに依存している)が使えなくなるらしいので、 slack-ruby-botを試してみました。
Slack の XMPP ゲートウェイ対応終了について
今日時点で、内容はこちら https://my.slack.com/account/gateways で確認できます。以下内容抜粋。
これまで進化を続ける中で、Slack は、共有チャンネル、スレッドや絵文字リアクションといった IRC / XMPP ゲートウェイでは対応できない機能などのビルドを続けてきました。あらゆるプラットフォームを通じて安全で質の高いエクスペリエンスを提供することが Slack の使命です。そのため、このたび、これらのゲートウェイへの対応を終了することとしました。
ゲートウェイの対応終了予定は以下のとおりです :
2018年3月6日 : 新規作成されたワークスペースでの利用終了
2018年4月3日 : ゲートウェイが使用されていないã
2018年5月15日 : その他の全てのワークスペースでの利用終了
ちなみに: ruboty-slack_rtm gemについて
ruboty-slackは使えなくなるので、rubotyを使っている人は、ruboty-slack_rtm を試すと良いかもしれません。
私はまだ試していません。
今回はもうひとつの選択肢として、という話なので、rubotyのことは一旦忘れます。
slack-ruby-bot gemを使ってみる
2d6(サイコロを2個振る)に反応するbotを書いてみました。
hoshinotsuyoshi/dicebot
dicebot - slack-ruby-botの習作
# dicebot.rb
#
# ボットのクラス
require 'slack-ruby-bot'
require 'dicebot/dice'
class DiceBot < SlackRubyBot::Bot
command '2d6' do |client, data, _match|
client.say(text: "#{dice} #{dice}", channel: data.channel)
end
command '円周率を教えて!' do |client, data, _match|
pi = Math::PI
client.say(text: "#{pi}です", channel: data.channel)
end
end
# dicebot/dice.rb
#
# サイコロを振るメソッドをもつモジュール
class DiceBot < SlackRubyBot::Bot
module Dice
private
def dice
(rand * 6).to_i + 1
end
end
extend Dice
end
次にbotのintegrationを1つ作っておき、トークンを環境変数SLACK_API_TOKENにセットします。
あとは、手元のPCおもむろにで DiceBot.run
すれば動きます。
様子
その他の動かし方
rackアプリを書いて動かしたほうが安定する?みたいなことが書いてありましたが、試していません。
herokuで動かす時はこのほうが安定するのかな。
テストについて
READMEの下のほう にrspecのカスタムマッチャについて書かれています。
説明に従いspec/spec_helper.rbを書くと、
こんな感じで動かすことができました。
# vcr, rspec, webmock, rack-test が必要
# require 'slack-ruby-bot/rspec' が必要
describe DiceBot do
context 'given 2d6' do
it 'returns 2 dices' do
expect(message: 'rubybot 2d6')
.to respond_with_slack_message(/[1-6] [1-6]/)
end
end
context 'given "円周率を教えて"' do
it 'returns pi' do
stub_const('Math::PI', 3)
expect(message: 'rubybot 円周率を教えて!')
.to respond_with_slack_message(/\A3です\z/)
end
end
end
カスタムマッチャ(‘slack-ruby-bot/rspec’) については、日本語の記事があまり見つけられませんでした。
githubに公開されているいくつかのbotを参考にしたら一応動きました。
まだそれぞれのクラスの役割がよく分かってないので、本体のコード読んで理解するしか無さそうです。
✎まとめ
- bot自体はすぐ動くと思います。
- 本格利用はしてないのでrackアプリ化が必要なのかどうかはいまひとつわからない。
- なんとなくテストも動きました。
- カスタムマッチャは使いやすいかどうかはまだわからない。。