hubot에서 태스크 추적 bot을 구현

14998 단어 HubotCoffeeScript

이 기사에 쓰여진 것



처음으로 Hubot 스크립트를 썼을 때 조사한 일( Hubot 문서 에 쓰지 않았던 것)을 정리했습니다.
  • 발언자 이름 얻기
  • 발언 시간 취득
  • KVS에 배열로 요소 추가/추출하고 싶을 때

  • CoffeeScript는 접한 적이 없지만 뭔가 만들어보고 싶다는 분의 등을 살짝 누르면 다행입니다.

    ※ 거의 거의 같은 내용을 당사 블로그에도 투고하고 있습니다

    만든 것과 그 동기



    간단한 작업 추적이 가능한 bot를 만들었습니다.
  • now hogehoge 라고 발언하면, 발언 내용 hogehoge 로 시각과 발언자를 기록
  • hubot today 라고 발언하면, 오늘 분의 발언 내용과 시각을 모두 출력

    이런 사양입니다. 간단하네요.



    사용감은 이런 느낌. 하루 종일 블로그 밖에하지 않는 녀석

    만든 동기이지만,
    당사 에서는 일보 작성시에, 그 날 1일의 작업 내용과 시각을 보고하고 있습니다.

    적당한 타임 트래킹 툴 등을 이용해도 좋았지만,
  • 그다지 크지 않아도 좋지만 발견되지 않았습니다
  • hubot 스크립트를 만들고 싶다는 자신의 동기 부여

  • 그리고,
  • 누가 지금 무엇을 다루고 있는지, 팀에 느슨하게 공유 할 수 있으면 편리하지 않은가

  • 라고 하는 부차적 효과도 노리고 slack 경유로 타임 트래킹 시키기로 했습니다.

    그래서 구현입니다.

    "이 데이터를 원할 때 어떻게 쓰는가"집



    주로 Hubot 문서을 읽으면 나름대로 할 수 있게 됩니다만,
    상기의 사양을 실현할 때에, 문서만으로는 부족했던 지식을 정리합니다.
    「javascript, CoffeeScript는 평상시 거의 쓰지 않지만 뭔가 만들고 싶다―」정도의 방향입니다.

    덧붙여 환경 구축 주위의 내용은 포함하지 않습니다.

    발언자 이름 얻기


    msg 로 받은 경우, msg.message.user.name 로 취득할 수 있습니다.
      robot.hear /^now (.*)/i, (msg) ->
        user = msg.message.user.name
    

    이런 느낌.
    이에 한정되지는 않지만 한 번은 console.log 로 내용을 들여다 보는 것을 추천합니다.

    발언 시간 획득



    발언 시간은 어디에 저장되어 있을까? 어쩌면 찾아 버렸습니다만, 보통으로 new Date 하면 좋을 뿐의 이야기였습니다.
      robot.hear /^now (.*)/i, (msg) ->
        date = new Date
    

    단, 미검증입니다만 아마 서버의 내부 시계의 시각이 반영되어 버리므로, 일본 시간으로 움직이고 있지 않은 경우는 별도 조정이 필요합니다.

    KVS에 배열로 요소 추가/추출하고 싶을 때



    이것은 hubot 云々보다는 KVS의 사용법? 가까운 이야기라고 생각하지만,
    발언 내용의 기록 부분을 구현함에 있어서, 처음에는 연상 배열과 같은 형태로 레코드를 보존하고,
    발언 일시를 키로 하여 레코드를 끌어오는 디자인을 이미지하고 있었습니다만, 도중에 막혀 버렸습니다.
    그래서 json으로 전부 취득→말미에 요소 추가→전부 보존이라고 하는 형태로 실장했습니다.
      # keyを設定
      key = "timeTracker"
    
      # 要素の保存
      tasks = robot.brain.get(key) ? [] # keyを元に全要素を持ってくる。なければ空配列をセット 
      task = { text:"文字列" } # 追加要素を作成
      tasks.push task # 全要素の末尾に追加
      robot.brain.set key, tasks # すべての要素を保存
    

    특정 발언일시의 요소를 취득하는 경우는 filter 로 추출하면 OK였습니다.
      # keyを設定
      key = "timeTracker"
    
      tasks = robot.brain.get(key) ? [] # keyを元に全要素を持ってくる。なければ空配列をセット
      message = tasks.filter (task) ->
        task.date == '日時' # 日時で抽出
      .map (task) ->
          "#{task.text}" # 発言内容を組み立てる
      .join '\n'
    

    완성



    후에는 일시의 성형용의 함수라든지 발언 내용의 보존하고 싶은 내용이라든지 여러가지를 덧붙여, 최종적으로 완성된 것이 이쪽입니다.
    
    # Description:
    #   simple time tracker.
    #
    # Commands:
    #   now <text> - save datetime, <text>
    #   hubot today - export all todays datetime, <text>
    
    # 時刻を受け取ってYYYY-mm-dd形式で返す
    toYmdDate = (date) ->
      Y = date.getFullYear()
      m = ('0' + (date.getMonth() + 1)).slice(-2)
      d = ('0' + date.getDate()).slice(-2)
      return "#{Y}-#{m}-#{d}"
    
    # 時刻を受け取ってhh:mm形式で返す
    tohhmmTime = (date) ->
      hh = ('0' + date.getHours()).slice(-2)
      mm = ('0' + date.getMinutes()).slice(-2)
      return "#{hh}:#{mm}"
    
    module.exports = (robot) ->
      # keyを設定
      key = "timeTracker"
    
      # hubot now <test> に反応させる
      robot.hear /^now (.*)/i, (msg) ->
        # 発言から内容を取得。date,text,userの3つ
        date = new Date
        text = msg.match[1]
        user = msg.message.user.name
    
        tasks = robot.brain.get(key) ? []
        task = { user: user, date: toYmdDate(date), time: tohhmmTime(date), task: text }
        tasks.push task
        robot.brain.set key, tasks
        msg.reply "task saved! #{tohhmmTime(date)} #{text}"
    
      robot.respond /today$/, (msg) ->
        date = new Date
        user = msg.message.user.name
        tasks = robot.brain.get(key) ? []
        message = tasks.filter (task) ->
          task.date == toYmdDate(date)
        .filter (task) ->
          task.user == user
        .map (task) ->
          "#{task.time} #{task.task}"
        .join '\n'
        msg.reply "#{message}"
    

    잡감


  • 대략적으로 하루를 되돌아 보려면 딱 좋은 사용감
  • 스스로 만든 것은 역시 애착이 솟기 때문에, 삼일 보주가 되어 있지 않습니다. 지금은.
  • 느슨하게 선언하고 작업을 시작하기 때문에 집중 모드로 머리를 전환하는 스위치 역할을하는 기쁜 부작용도있었습니다.
  • 좋은 웹페이지 즐겨찾기