概要
slack apiでbotを作ってみたを見て、 slack-api
gemを使ったら便利だったけれど、いくつか不便な点があったのでgemを作ってみました。
動機としては、rubyとdsl使ってhubotぐらいのノリでさくっとbot script書きたかったから。
rubotyとかlitaとかも見ましたがコードが長くなりそうで、もっとカジュアルに書けるものが欲しいなと。
Slappy?
slack-apiでbotを作る際に不便な点
-
slack-api
の仕様の問題で、slackから返ってくるパラメータがJSONそのまんま返ってくる - イベントハンドラが1つしか登録できない
slack-apiをそのまま使う場合
require 'slack'
Slack.configure {|config| config.token = ENV['SLACK_TOKEN'] }
client = Slack.realtime
client.on :message do |data|
# data['channel']はIDで返ってくる
# data.key?('text')にしているのは、textのキーがないJSONが返ってくることがあってそこでbotがしぬため
if data.key?('text')
# イベントハンドラが1つしか登録できないのでcase文で分岐する
case data['text']
when 'hoge'
params = {
channel: data['channel'],
username: "botname",
text: "message!"
}
Slack.chat_postMessage params
end
end
end
client.start
コードが長くなって面倒でした。
(slack-api
はSlack APIのwrapperなので仕方ないですが)
Slappyの場合
hear '^hoge$' do |event|
say 'message!', channel: event.channel, username: "botname"
end
このぐらい短くなります。
Slappy Quick Start
1. SlackのAPI TOKENを取得する
ここで作成。
2. 環境変数SLACK_TOKENにAPI TOKENを設定
デフォルトで ENV['SLACK_TOKEN']
を見るように鳴ってます。
dotenv使ってもいいですね。dotenv使う場合は slappy_config.rb
の中で Dotenv.load
を呼んでください。
3. generatorでテンプレート作成
rails new
みたいなノリで作れます。
$ slappy new project-name
カレントディレクトリを対象にする場合は下記で。
$ slappy new
4. コードを書く
生成されたディレクトリに slappy-scripts
というディレクトリがあるので、コードを書きます。
ファイルは複数設置できて、ファイルごとにスコープは独立してます。
# catch pattern
hear '^hello, slappy!' do |event|
say 'hello!!', channel: event.channel #=> respond message to channel
end
hear
に渡す文字列を正規表現に変換してパターンマッチして、マッチしたらブロックを実行します。
5. 起動
$ slappy start
で起動します。
その他
slappy_config.rb
でconfigureしてます。
require 'slappy/dsl'
Slappy.configure do |config|
config.token = 'foobar'
config.robot.username = 'slappy'
config.robot.channel = '#general'
config.robot.icon_emoji = ':slappy:'
end
ここの config.robot
で設定した値が say
でSlackのAPIに渡されるパラメータのデフォルト値になります。
パラメータは公式ドキュメントを参考にしてください。
今後の拡張とか
- スケジューラ
- private channelへの投稿
- 現状private channelはチャンネル名で投稿できない(IDならできるので、replyには使えます)
- Incomming webhook使うなりAPI叩くなりでchannel list取ってこれればいけそう
- hubotでいうrespond
- bot nameをprefixにつけたやつだけ反応する機能
- shellでの実行
- testableにするために欲しい
-
hear
へのオプション-
here 'hoge', channel: 'foo'
でfooチャンネルにだけ反応するとか
-
- メッセージ以外への反応
- 誰かがjoinしたときとか、メッセージ投稿以外のイベントを拾って反応するハンドラ
- 画像アップロードなど
-
slack-api
が対応してるので、そちらに委譲すれば楽に出来そう
-
最後に
初めてgem作ったのでいろいろ勉強になりました。
Pull Request歓迎してます。
特に英語が壊滅的なのでそちらチェックして欲しい