hubot에서 태스크 추적 bot을 구현
14998 단어 HubotCoffeeScript
이 기사에 쓰여진 것
처음으로 Hubot 스크립트를 썼을 때 조사한 일( Hubot 문서 에 쓰지 않았던 것)을 정리했습니다.
CoffeeScript는 접한 적이 없지만 뭔가 만들어보고 싶다는 분의 등을 살짝 누르면 다행입니다.
※ 거의 거의 같은 내용을 당사 블로그에도 투고하고 있습니다
만든 것과 그 동기
간단한 작업 추적이 가능한 bot를 만들었습니다.
now hogehoge
라고 발언하면, 발언 내용 hogehoge
로 시각과 발언자를 기록 hubot today
라고 발언하면, 오늘 분의 발언 내용과 시각을 모두 출력이런 사양입니다. 간단하네요.
사용감은 이런 느낌. 하루 종일 블로그 밖에하지 않는 녀석
만든 동기이지만,
당사 에서는 일보 작성시에, 그 날 1일의 작업 내용과 시각을 보고하고 있습니다.
적당한 타임 트래킹 툴 등을 이용해도 좋았지만,
그리고,
라고 하는 부차적 효과도 노리고 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}"
잡감
robot.hear /^now (.*)/i, (msg) ->
user = msg.message.user.name
robot.hear /^now (.*)/i, (msg) ->
date = new Date
# keyを設定
key = "timeTracker"
# 要素の保存
tasks = robot.brain.get(key) ? [] # keyを元に全要素を持ってくる。なければ空配列をセット
task = { text:"文字列" } # 追加要素を作成
tasks.push task # 全要素の末尾に追加
robot.brain.set key, tasks # すべての要素を保存
# 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}"
잡감
Reference
이 문제에 관하여(hubot에서 태스크 추적 bot을 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/smd8122/items/0da94ce5ee5d12a57813텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)