LoginSignup
50

More than 5 years have passed since last update.

Slappy - 簡単にslackのbotを作れるgemを作った

Last updated at Posted at 2015-11-09

概要

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をそのまま使う場合

slack_api_sample.rb
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の場合

slappy_sample.rb
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 というディレクトリがあるので、コードを書きます。
ファイルは複数設置できて、ファイルごとにスコープは独立してます。

sample.rb
# 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してます。

slappy_config.rb
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に渡されるパラメータのデフォルト値になります。
パラメータは公式ドキュメントを参考にしてください。

今後の拡張とか

  • スケジューラ
    • botなら必須で欲しい機能かなと思うので入れたい
    • wheneverとか使ってもいいんですが、herokuだとcron使えない
    • rubotyでも使われてるchronoあたりを使えば良さそう
  • 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歓迎してます。
特に英語が壊滅的なのでそちらチェックして欲しい

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50