ClojureではRTMを利用した便利なSlackBotフレームワークがありません(あったら教えてください)。そこで、ClojureでRTMを利用するためにclj-slack-clientを利用しました。本家サイトには使い方がのっていないので、ちょっと動かしてみたので紹介します。
SlackのRTMとは
RTMとはReal Time Messaging APIのことで、SlackのWebSocketベースAPIです。RTMを使うことでSlackのイベントを監視し、メッセージの受信や送信をリアルタイムで行うことができます。
ClojureでRTMを利用
準備
Slack側
ここを参考に以下のリンクからslackBotを作成し、トークンそ取得します。
https://my.slack.com/services/new/bot
Clojure側
まず、プロジェクトを作ります。
lein new project_name
次に、project.cljを変更します。
:dependencies [[org.clojure/clojure "1.8.0"]
[aleph "0.4.1"]
[clj-slack-client "0.1.6-SNAPSHOT"]]
:main project_name.core
:dependencies
にaleph
とclj-slack-client
を追加します。aleph
はclj-slack-client
の中で利用されていますが、clj-slack-client
でのバージョンにバグがあるので、追加しています。
また、エントリーポイントを設定するために:main
を追加します。
RTMの利用
以下のコードでRTMを試すことができます。
(ns project_name.core
(:require
[clj-slack-client.core :as slack]))
(defn handle-slack-event
[event]
(println "event:" event))
(defn -main
[& args]
(slack/connect "API Token" handle-slack-event)
(println "bot running...")
(loop []
(println "...")
(Thread/sleep 5000)
(recur)))
(slack/connect "API Token" handle-slack-event)
とすことでslackでイベントが起きたときhandle-slack-event
を呼び出すようになります。また、引数にはslackでのイベント内容が入力されます。
実行
$ lein run
で実行します。
botがいるチャンネルに'test'と入力すると以下のよう':text test'が含まれた出力がされます。
bot running...
...
{:type user_typing, :channel xxxxxx, :user xxxxxx}
event: {:type user_typing, :channel xxxxxx, :user xxxxxx}
{:type message, :channel xxxxxx, :user xxxxxx, :text test, :ts 1498385185.596441, :source_team xxxxxx, :team xxxxxx}
event: {:type message, :channel xxxxxx, :user xxxxxx, :text test, :ts 1498385185.596441, :source_team xxxxxx, :team xxxxxx}
まとめ
clj-slack-clientを利用することでRTMが簡単に利用できました。今回は動かすことが目的なのでトークンをハードコーディングしていますが、ちゃんと作るときはちゃんと隠蔽してください。
便利なRTMが使えるClojureの便利なSlackBotフレームワークが欲しいですね。あったら教えて下さい。作る???