커밋 수 순위를 발표하는 봇을 만들었습니다.
경위
이번 사내에서 Slack을 사용하고 있어, 무료 플랜이라면 10000건의 메시지까지 밖에 남길 수 없어, 요전날 드디어 상한에 도달해 버렸습니다. 거기서 위의 사람에게 유료 플랜을 부탁해 과금해 주었으므로, 유효 이용하지 않으면 죄송하다고 하는 것으로 봇을 만들기 시작했습니다.
대부분의 엔지니어의 사람들은 레거시 PHP와 jQuery 밖에 괴롭힌 적이 없기 때문에,이 봇 개발을 통해 사내 엔지니어의 사람에게 조금이라도 새로운 것을 만져 주길 바란다는 것도 목표입니다.
제1탄으로서 동기 부여에 연결될 것 같은 리포지토리명을 입력하면 1주간의 커밋수를 랭킹 표시하는 봇을 만들었습니다.
코드
commend.coffeetoken = 'your token'
apiUrl = "https://api.github.com/repos/Organization名"
module.exports = (robot) ->
robot.respond(/commend (.*)/i, (msg) ->
repository = msg.match[1]
oneWeekAgo = new Date()
oneWeekAgo.setDate(oneWeekAgo.getDate() - 7)
year = oneWeekAgo.getFullYear()
month = ("0" + (oneWeekAgo.getMonth() + 1)).substr(-2)
day = ("0" + oneWeekAgo.getDate()).substr(-2)
since = "#{year}-#{month}-#{day}T00:00:00Z"
request = robot.http("#{apiUrl}/#{repository}/commits")
.query(since: since)
.query(access_token: token)
.get()
committers = {}
request((err, res, body) ->
if err
msg.send("何かエラーになっちゃいました...")
return
commits = JSON.parse body
if commits.message == "Not Found"
msg.send("#{repository}が見つかりませんでした...")
return
for commit, index in commits
committer = commit.committer.login
if committers[committer] == undefined
committers[committer] = 0
++committers[committer]
respond = "発表します!\n\n#{since}から今までで\n\n"
commended = []
for i in [0..Object.keys(committers).length - 1]
max = 0
nextCommitter = ''
for committer, count of committers
if (commended.indexOf(committer) == -1)
if count >= max
nextCommitter = committer
max = count
commended.push(nextCommitter)
respond += "#{i + 1}位: #{nextCommitter} #{max} commits\n"
msg.send(respond)
)
)
평소 JavaScript를 전혀 그리지 않기 때문에 보다 효율적으로 정렬하는 방법이 있다고 생각합니다만, 여기에서는 버블 소트를 써 버렸습니다 웃음. githubot이라는 것이있는 것 같습니다만, 본 느낌 거기까지 편리하게 된 느낌이 없었기 때문에 보통 API를 호출하고 있습니다.
수행한 느낌
이것으로 뭔가 동기 부여가 오르는 것 같네요! 웃음
Reference
이 문제에 관하여(커밋 수 순위를 발표하는 봇을 만들었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/takuseno/items/f7d4588fa0311d8e9cae
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
commend.coffee
token = 'your token'
apiUrl = "https://api.github.com/repos/Organization名"
module.exports = (robot) ->
robot.respond(/commend (.*)/i, (msg) ->
repository = msg.match[1]
oneWeekAgo = new Date()
oneWeekAgo.setDate(oneWeekAgo.getDate() - 7)
year = oneWeekAgo.getFullYear()
month = ("0" + (oneWeekAgo.getMonth() + 1)).substr(-2)
day = ("0" + oneWeekAgo.getDate()).substr(-2)
since = "#{year}-#{month}-#{day}T00:00:00Z"
request = robot.http("#{apiUrl}/#{repository}/commits")
.query(since: since)
.query(access_token: token)
.get()
committers = {}
request((err, res, body) ->
if err
msg.send("何かエラーになっちゃいました...")
return
commits = JSON.parse body
if commits.message == "Not Found"
msg.send("#{repository}が見つかりませんでした...")
return
for commit, index in commits
committer = commit.committer.login
if committers[committer] == undefined
committers[committer] = 0
++committers[committer]
respond = "発表します!\n\n#{since}から今までで\n\n"
commended = []
for i in [0..Object.keys(committers).length - 1]
max = 0
nextCommitter = ''
for committer, count of committers
if (commended.indexOf(committer) == -1)
if count >= max
nextCommitter = committer
max = count
commended.push(nextCommitter)
respond += "#{i + 1}位: #{nextCommitter} #{max} commits\n"
msg.send(respond)
)
)
평소 JavaScript를 전혀 그리지 않기 때문에 보다 효율적으로 정렬하는 방법이 있다고 생각합니다만, 여기에서는 버블 소트를 써 버렸습니다 웃음. githubot이라는 것이있는 것 같습니다만, 본 느낌 거기까지 편리하게 된 느낌이 없었기 때문에 보통 API를 호출하고 있습니다.
수행한 느낌
이것으로 뭔가 동기 부여가 오르는 것 같네요! 웃음
Reference
이 문제에 관하여(커밋 수 순위를 발표하는 봇을 만들었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/takuseno/items/f7d4588fa0311d8e9cae
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(커밋 수 순위를 발표하는 봇을 만들었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takuseno/items/f7d4588fa0311d8e9cae텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)