KAIKETSU Developer's Diary

株式会社KAIKETSU エンジニアチームのブログです

出退勤管理システムをSlackに移植した

背景

社内Slackが導入されたので下記記事で紹介した出退勤管理システムをSlackに移植することにしました。

dev-kk2.hatenablog.com

dev-kk2.hatenablog.com

実装

従来のLINEの機能は残しつつ機能追加という形で実装を行うことにします。

Slackの設定

incoming webhookとoutgoing webhookを設定する。それぞれカードがタッチされた時と確認を行うときのための機能です。

incoming webhook

f:id:kk2dev:20180202181856p:plain

上記のWebhook URLに以下の形式のJSONをPOSTします。

{
    "text": "message"
}

outgoing webhook

f:id:kk2dev:20180202182501p:plain

上記の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と連携することができました。