LoginSignup
13
14

More than 5 years have passed since last update.

Slack上でタイムレコーダーをするbot作った。

Posted at

なぜやったか

複数のプロジェクトにまたがると、工数管理が大変なので、
Slack上でbotに管理してもらうことにしました。

何をしたか

こちらを参考にさせて頂きました。

Slackにハッシュタグ的な「ゆるく情報をまとめる方法」が欲しかった話

Slackでらくらく工数管理

  • #___ のPrefixを付けたタスクを登録すると、botがそれを待ち受けてオウム返しします。

  • @botの名前 集計して と入力するとbotが発言した履歴から時間を計算して返します。

  • 同じタスク名は合算します。

スクリーンショット 2017-10-02 22.16.26.png

どうやったか

  • botのFrameWorkはHubot
  • 名前はpigbot
  • お家はHeroku
  • 時間管理用のチャンネルを作成しました。
  • APIに必要な情報は環境変数で渡しました。

SlackとHubotの連携

こちらを参考にさせて頂きました。

履歴を取得するSlackAPI

channels.history

コード

  • Prefixを待ち受ける所
robot.hear /#___/, (msg) ->  
   msg.send msg.message.text 
  • 時間を集計する所
robot.respond /集計して/i, (msg) ->
    today = new Date()
    oldestMilliSec = new Date(today.getFullYear(), today.getMonth(), today.getDate()).getTime() / 1000
    # 当日0時以降の履歴のみ取得する。
    request = msg.http('https://slack.com/api/channels.history')
                  .query(token: process.env.HUBOT_SLACK_TOKEN, channel:process.env.CHANNEL_ID, oldest:oldestMilliSec)
                  .post()    

    request (err, res, body) ->
      json = JSON.parse body
      contents = json.messages
                .filter((v) -> v.user == process.env.USER_ID)
                .filter((z) -> z.text.startsWith("#___"))
                .reverse()

      if contents.length == 0
         msg.send "ないやで"
         return

      formatTime = (seconds) ->
        result = ''
        #時間計算
        hour = Math.floor(seconds / 60 / 60)
        min = Math.floor(seconds / 60 % 60)
        sec = Math.floor(seconds % 60)
        #フォーマット
        if hour > 0
          result += hour + '時'
        if min > 0
          result += min + '分'
        if sec > 0
          result += sec + '秒'
        result  

      tasks = contents.map((val,i)->
        if i == contents.length-1
          obj = {}
          task = val.text.slice(4)
          cost = (Date.now()/ 1000 - val.ts)
          obj[task] = cost
          return obj

        if (i + 1 < contents.length)
          obj = {}          
          task = val.text.slice(4)
          cost = (contents[i+1].ts - val.ts)
          obj[task] = cost 
          return obj         
      )
  • 同じタスク名の時間を合算する所
resultList = []

      hasSameTask = (list,taskName,result) ->
        if list.length == 0
          return false
        for obj in list
          taskInList = Object.keys(obj)[0]
          if taskName == taskInList
            obj[taskInList] += result[taskName]
            return true
        return false

      for result in tasks
        task = Object.keys(result)[0]

        if not hasSameTask(resultList, task, result)
          resultList.push(result)

感想

botかわいい🐷
色んなAPI用意されているので、工夫して使ったらより捗りそうだと思いました。

13
14
0

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
13
14