forked from github/hubot-scripts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
dice.coffee
51 lines (47 loc) · 1.29 KB
/
dice.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# Description:
# Allows Hubot to roll dice
#
# Dependencies:
# None
#
# Configuration:
# None
#
# Commands:
# hubot roll (die|one) - Roll one six-sided dice
# hubot roll dice - Roll two six-sided dice
# hubot roll <x>d<y> - roll x dice, each of which has y sides
#
# Author:
# ab9
module.exports = (robot) ->
robot.respond /roll (die|one)/i, (msg) ->
msg.reply report [rollOne(6)]
robot.respond /roll dice/i, (msg) ->
msg.reply report roll 2, 6
robot.respond /roll (\d+)d(\d+)/i, (msg) ->
dice = parseInt msg.match[1]
sides = parseInt msg.match[2]
answer = if sides < 1
"I don't know how to roll a zero-sided die."
else if dice > 100
"I'm not going to roll more than 100 dice for you."
else
report roll dice, sides
msg.reply answer
report = (results) ->
if results?
switch results.length
when 0
"I didn't roll any dice."
when 1
"I rolled a #{results[0]}."
else
total = results.reduce (x, y) -> x + y
finalComma = if (results.length > 2) then "," else ""
last = results.pop()
"I rolled #{results.join(", ")}#{finalComma} and #{last}, making #{total}."
roll = (dice, sides) ->
rollOne(sides) for i in [0...dice]
rollOne = (sides) ->
1 + Math.floor(Math.random() * sides)