Skip to content

Instantly share code, notes, and snippets.

@MakoTano
Created August 31, 2016 08:12
Show Gist options
  • Save MakoTano/949906804cc1375811146b17653f7134 to your computer and use it in GitHub Desktop.
Save MakoTano/949906804cc1375811146b17653f7134 to your computer and use it in GitHub Desktop.
プルリクエストのランダムアサイン
# Description:
# Pull Request Assign
#
# Commands:
# hubot review <url> - choose someone to review <url> pull requests.
# hubot review2 <url> - choose two members to review <url> pull requests.
MEMBER = {}
# 選出対象者としてslackの@を除いたユーザー名を半角スペースで区切ります
MEMBER.DEV = "taro jiro saburo shiro goro"
class Members
# 選出対象者の配列
members: []
# 本人の除外・既に選出された人の配列
choosed: []
constructor: (str) ->
@members = this.member_convert str if @members.length == 0
# 半角スペース区切りのユーザーリストを配列membersへ変換します
member_convert: (str) -> str.split " "
# members から特定indexの人を削除します(本人の除外や2名以上の選出時に重複を防ぐためです)
member_delete: (index) -> @members.splice index, 1 unless index < 0
# members から特定の1名をランダム選出します。
random_index: () -> Math.floor Math.random()*@members.length
# slackのユーザー名からmembers配列上のインデックスを取ります
get_member_index: (name) -> @members.indexOf name
# members配列上のインデックスからslackのユーザー名を取ります
get_member_name: (index) -> @members[index]
# 本人の除外・既に選出された人の配列choosedに人を追加します
add_choosed: (name) -> @choosed.push name
# choosed配列の内容を、members配列から削除します
exclude_choosed: () ->
for name in @choosed
index = this.get_member_index name
this.member_delete index
# members配列から1名選出します
choose: () ->
this.exclude_choosed
index = this.random_index()
name = this.get_member_name index
this.member_delete index
return name
# 実行プログラム本体
module.exports = (robot) ->
# 1名にコードレビューを依頼
robot.respond /review\s(.*)/, (res) ->
m = new Members MEMBER.DEV
m.add_choosed get_user_name res
res.send "<@#{m.choose()}> コードレビューお願いします!\n#{get_url res}"
# 2名にコードレビューを依頼
robot.respond /review2\s(.*)/, (res) ->
m = new Members MEMBER.DEV
m.add_choosed get_user_name res
res.send "<@#{m.choose()}> <@#{m.choose()}> コードレビューお願いします!\n#{get_url res}"
get_url = (msg) -> msg.match[1]
get_user_name = (msg) -> msg.message.user.name
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment