event_chain - Earthquakeのユーザーストリームで流れてくるイベントに応じて任意のコマンドを実行できるプラグインを作った

チョリ〜〜〜〜ッス!ブログ記事は遅れてるけど一応1日1リリース継続中。

先日のfav_machineは、①favイベントだけに反応し、②画像を保存するだけ、だったのですが、①は全てのイベントに、②は任意のコマンド(勝手プラグインコマンドも含む)に対応して、汎用性を持たせてみました。

前の記事のsave_imageと組み合わせるとfav_machine相当のことができます。

あと名前はお弁当チェーンみたいでいいかな?と思ってこれにしました。

インストール

⚡ :plugin_install https://gist.github.com/babie/7215590

設定

Earthquake.config[:event_chain] = {
  :favorite => [':retweet %{id}', ':save_image %{id}'],
  :favorited => [':update @%{him} thx 4 ur fav!', ':follow %{him}'],
}

例は、自分がfavったらついでにリツイートも実行するのと、自分がfavられたらその相手に返事をしfollowする、という意味になります。

ハッシュで設定します。keyがイベント名で、valueがイベントの際に実行するコマンドの配列になります。配列の中の順番は特に意味はないですが、内部的にはeachで順番に回してます。ので途中で例外が上がると止まる。

イベント名は、

  • block
  • unblock
  • favorite
  • favorited
  • unfavorite
  • unfavorited
  • follow
  • followed
  • unfollow

などが使えます。ストリーミングAPIのイベントを元としていて、自分がしたか・されたかによって能動態・受動態に分けました。そのままだとめっちゃややこしかったので。

コマンドは文字列で書きます。頭の:を忘れないようにしてください。例に%{him}というのが含まれてますが、よく使う変数を埋め込めます。変数には、 * me : 自分 * him : 相手 * her : himと同じ * it : himと同じ * id : ツイートエイリアス($xx) があります。コマンドに応じて埋め込んでください。
また、コマンド文字列はevalされるので、式や上記にない変数を埋め込めます。例えば':retweet #{id2var(item["id"])}'という風にも書けます。設定ファイルを読み込むときに評価されないようシングルクォート相当(%q)で囲んでください。ダブルクォート相当だと読み込み時に解釈されるので死ぬ。

使い方

一度設定したら自動です。

コード

ちょっとcallerのとこがちょっとおもろかった。コマンドにはconfirmメソッドを使ってyesかnoを問い合わせるものがありますので、このプラグインから呼ばれた時は常時trueにして手動入力なしでいけるようにしています。最初 Readline::HISTORY[-1](最後の入力履歴)を見ようかなと想ったんですが、inputに渡されるテキストをconfirmまで持ってくるのがダルいなということで、こういう風にしました。あと、prependを使ったほうがお作法的によろしいのでしょうが、Earthquakeがどのバージョンで使われるか知らないのと、元々ActiveSupportを組み込んであるのでalias_method_chainを使いました。便利。

passiviseは単語の受動態を作るメソッドです。こんな単語知らないけど適当に。ActiveSupport風にStringクラスをオープンして拡張しても良かったけどダルかった。

今後

リツイートはイベントとして流れてこないので、対応した方がいいかもなー。要望があれば。

次回予告

Earthquakeでちょっと考えてることがあって、調査していいソフトウェアがあったらその使い方、なかったら作って記事書きます。どちらにしても、Earthquakeについては次回で最後になると思います。