出退勤管理システムをSlackに移植した
背景
社内Slackが導入されたので下記記事で紹介した出退勤管理システムをSlackに移植することにしました。
実装
従来のLINEの機能は残しつつ機能追加という形で実装を行うことにします。
Slackの設定
incoming webhookとoutgoing webhookを設定する。それぞれカードがタッチされた時と確認を行うときのための機能です。
incoming webhook
上記のWebhook URLに以下の形式のJSONをPOSTします。
{ "text": "message" }
outgoing webhook
上記のURL(s)の欄にエンドポイントのURLを記入する。複数行に記述することで複数の宛先に送ることが可能です。
Trigger Word(s)には検出したい文字列を設定します。こちらにも複数の条件を設定することが可能で、カンマ区切りで行います。
受け取ったリクエストに対してResponse bodyに以下のJSONを設定することで投稿できます。
{ "text": "message" }
ソースの追記
以下のようなコードを追記しました。
main.cr nfcpush()の末尾に追記
HTTP::Client.post(Params::SLACK_WEBHOOK_URL, headers: HTTP::Headers{ "Content-Type" => "application/json", }
ICカードのタッチに発火してSlackのincoming webhookに投げます。
def whoishere(request : HTTP::Request, list : Hash) list = list.select {|k, v| v == true} text = list.size != 0 ? "#{list.size}人がオフィスにいます\n" : "オフィスには誰もいません" cardNames = Response::CardNames.from_json(File.read(Params::PATH_TO_CARDNAMES_JSON)).cardNames list.map {|k, v| cardNames.select {|c| c.idm == k}.size != 0 ? cardNames.select {|c| c.idm == k}[0].name : "未登録のユーザー"}.each {|e| text += "#{e} "} return {200, "{\"text\": \"#{text}\"}"} end
Slackのoutgoing webhookに発火してResponseを返します。
まとめ
無事Slackと連携することができました。