cinch-dicebag 1.0.4 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/cinch/plugins/dicebag.rb +24 -11
- data/lib/cinch/plugins/dicebag/version.rb +1 -1
- data/spec/cinch-dicebag_spec.rb +41 -32
- metadata +2 -2
@@ -56,7 +56,9 @@ module Cinch::Plugins
|
|
56
56
|
|
57
57
|
result = roll_dice(dice.split(' '))
|
58
58
|
|
59
|
-
|
59
|
+
if result.is_a?(String)
|
60
|
+
m.reply result
|
61
|
+
elsif result.is_a?(Integer)
|
60
62
|
m.reply "#{m.user.nick} rolls #{dice} totalling #{result}"
|
61
63
|
end
|
62
64
|
end
|
@@ -70,28 +72,39 @@ module Cinch::Plugins
|
|
70
72
|
# Clean out anything invalid
|
71
73
|
dice.delete_if { |d| d.match(/\d*d\d+/).nil? }
|
72
74
|
|
75
|
+
return roll_check?(dice) if roll_check?(dice)
|
76
|
+
|
73
77
|
total = 0
|
74
78
|
|
75
79
|
# Roll each group and total up the returned value
|
76
80
|
dice.each do |die|
|
77
|
-
|
78
|
-
sides = die[/\d?d(\d+)/, 1]
|
79
|
-
unless count.nil? || sides.nil?
|
80
|
-
total += roll_die(sides.to_i, count.to_i)
|
81
|
-
end
|
81
|
+
total += roll_die(die)
|
82
82
|
end
|
83
83
|
|
84
|
-
return total unless total.zero?
|
84
|
+
return total.to_i unless total.zero?
|
85
|
+
end
|
86
|
+
|
87
|
+
# Takes an array of rolls and does sanity on it.
|
88
|
+
# @param [Array] dice Array of strings that correspond to valid die rolls.
|
89
|
+
# (i.e. ['4d6', '6d10']
|
90
|
+
# @return [Fixnum] The total from rolling all of the dice.
|
91
|
+
def roll_check?(dice)
|
92
|
+
# Check to make sure it's not a stupid large roll, they clog threads.
|
93
|
+
count = dice.map { |die| die[/(\d+)d\d+/, 1].to_i || 1 }.inject(0, :+)
|
94
|
+
return 'I don\'t have that many dice in my bag!' unless count <= 10_000
|
95
|
+
false
|
85
96
|
end
|
86
97
|
|
87
98
|
# Rolls an n-sided die a given amount of times and returns the total
|
88
|
-
# @param [
|
89
|
-
# @param [Fixnum] count Number of times to roll the die.
|
99
|
+
# @param [Fixn] count Number of times to roll the die.
|
90
100
|
# @return [Fixnum] The total from rolling the die.
|
91
|
-
def roll_die(
|
92
|
-
|
101
|
+
def roll_die(die)
|
102
|
+
count = (die[/(\d+)d\d+/, 1] || 1).to_i
|
103
|
+
sides = die[/\d?d(\d+)/, 1].to_i
|
104
|
+
return 0 if count.nil? || sides.nil? || sides < 1 || count < 1
|
93
105
|
total = 0
|
94
106
|
count.times { total += rand(sides) + 1 }
|
107
|
+
|
95
108
|
total
|
96
109
|
end
|
97
110
|
|
data/spec/cinch-dicebag_spec.rb
CHANGED
@@ -8,61 +8,71 @@ describe Cinch::Plugins::Dicebag do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
describe 'rolling specific dice' do
|
11
|
-
it
|
11
|
+
it 'should return a roll from rolling dice' do
|
12
12
|
get_replies(make_message(@bot, '!roll 3d3', { nick: 'ted' })).first.
|
13
13
|
should_not be_nil
|
14
14
|
end
|
15
15
|
|
16
|
-
it
|
16
|
+
it 'should return a roll in bounds from rolling dice' do
|
17
17
|
roll = get_replies(make_message(@bot, '!roll 3d3', { nick: 'ted' })).first.text
|
18
18
|
roll = roll[/totalling (\d+)/, 1]
|
19
|
-
(3..9).should include
|
19
|
+
(3..9).should include roll.to_i
|
20
20
|
end
|
21
21
|
|
22
|
-
it
|
22
|
+
it 'should disallow rolling stupid numbers of dice' do
|
23
|
+
get_replies(make_message(@bot, '!roll 100001d20', { nick: 'ted' })).first.
|
24
|
+
should include 'I don\'t have that many dice in my bag!'
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should disallow rolling stupid numbers of dice (multiple dice types)' do
|
28
|
+
get_replies(make_message(@bot, '!roll 5000d3 5000d20 1d30', { nick: 'ted' })).first.
|
29
|
+
should include 'I don\'t have that many dice in my bag!'
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should return a roll from rolling mixes of dice' do
|
23
33
|
get_replies(make_message(@bot, '!roll 3d3 d7 3d21', { nick: 'ted' })).first.
|
24
34
|
should_not be_nil
|
25
35
|
end
|
26
36
|
|
27
|
-
it
|
37
|
+
it 'should return a roll in bounds from rolling mixes of dice' do
|
28
38
|
roll = get_replies(make_message(@bot, '!roll 3d3 d7 3d21', { nick: 'ted' })).first.text
|
29
39
|
roll = roll[/totalling (\d+)/, 1]
|
30
|
-
(7..79).should include
|
40
|
+
(7..79).should include roll.to_i
|
31
41
|
end
|
32
42
|
|
33
|
-
it
|
43
|
+
it 'should return a roll from rolling a single die' do
|
34
44
|
get_replies(make_message(@bot, '!roll d3', { nick: 'ted' })).first.
|
35
45
|
should_not be_nil
|
36
46
|
end
|
37
47
|
|
38
|
-
it
|
48
|
+
it 'should not return a string from rolling dice without a name' do
|
39
49
|
get_replies(make_message(@bot, '!roll .' , { nick: 'ted' })).first.
|
40
50
|
should be_nil
|
41
51
|
end
|
42
52
|
|
43
|
-
it
|
53
|
+
it 'should return a string describing the dice that were rolled' do
|
44
54
|
text = get_replies(make_message(@bot, '!roll 3d3', { nick: 'ted' })).first.text
|
45
55
|
text.should match(/rolls\s3d3\stotalling\s\d+/)
|
46
56
|
end
|
47
57
|
end
|
48
58
|
|
49
59
|
describe 'roll_dicebag' do
|
50
|
-
it
|
60
|
+
it 'should return a string' do
|
51
61
|
get_replies(make_message(@bot, '!dicebag' , { nick: 'ted', channel: '#bar' })).first.
|
52
62
|
should_not be_nil
|
53
63
|
end
|
54
64
|
|
55
|
-
it
|
65
|
+
it 'should return an error if the user is not in a channel' do
|
56
66
|
get_replies(make_message(@bot, '!dicebag' , { nick: 'ted' })).first.text.
|
57
67
|
should be_eql("You must use that command in the main channel")
|
58
68
|
end
|
59
69
|
|
60
|
-
it
|
70
|
+
it 'should return a string describing the user\'s bag roll' do
|
61
71
|
get_replies(make_message(@bot, '!dicebag' , { nick: 'ted', channel: '#bar' })).first.text.
|
62
72
|
should match(/ted rolls a [a-z]+ bag of dice totalling \d+/)
|
63
73
|
end
|
64
74
|
|
65
|
-
it
|
75
|
+
it 'should announce a high score if the old score is higher' do
|
66
76
|
get_replies(make_message(@bot, '!dicebag' , { nick: 'brian', channel: '#foo' }))
|
67
77
|
@bot.plugins.first.storage.data['#foo']['brian'] = { score: 1, time: Time.now }
|
68
78
|
text = get_replies(make_message(@bot, '!dicebag' , { nick: 'brian', channel: '#foo' })).first.text
|
@@ -73,68 +83,67 @@ describe Cinch::Plugins::Dicebag do
|
|
73
83
|
end
|
74
84
|
|
75
85
|
describe 'roll_dice' do
|
76
|
-
it
|
86
|
+
it 'should return nil if the dice list is empty' do
|
77
87
|
@bot.plugins.first.roll_dice([]).should be_nil
|
78
88
|
end
|
79
89
|
|
80
|
-
it
|
90
|
+
it 'should return a non zero total on a normal dice list' do
|
81
91
|
@bot.plugins.first.roll_dice(['3d3', '4d5']).should_not be_zero
|
82
92
|
end
|
83
93
|
|
84
|
-
it
|
94
|
+
it 'should clear out any invalid dice rolls' do
|
85
95
|
@bot.plugins.first.roll_dice(['33']).should be_nil
|
86
96
|
end
|
87
97
|
end
|
88
98
|
|
89
|
-
describe
|
90
|
-
it
|
91
|
-
@bot.plugins.first.roll_die(
|
92
|
-
(5..15).should include(@bot.plugins.first.roll_die(
|
99
|
+
describe 'roll_die' do
|
100
|
+
it 'should return an acceptable value for a given roll' do
|
101
|
+
@bot.plugins.first.roll_die('1d1').should == 1
|
102
|
+
(5..15).should include(@bot.plugins.first.roll_die('3d5'))
|
93
103
|
end
|
94
104
|
|
95
|
-
it
|
96
|
-
@bot.plugins.first.roll_die(-1
|
97
|
-
@bot.plugins.first.roll_die(
|
98
|
-
@bot.plugins.first.roll_die(-1, -1).should == 0
|
105
|
+
it 'should return 0 for any negetive values' do
|
106
|
+
@bot.plugins.first.roll_die('1d-1').should == 0
|
107
|
+
@bot.plugins.first.roll_die('-1d-1').should == 0
|
99
108
|
end
|
100
109
|
end
|
101
110
|
|
102
|
-
describe
|
103
|
-
it
|
111
|
+
describe 'get_bag_size' do
|
112
|
+
it 'should return \'huge\' for out of bounds queries' do
|
104
113
|
@bot.plugins.first.get_bag_size(50000).should == 'huge'
|
105
114
|
end
|
106
115
|
|
107
|
-
it
|
116
|
+
it 'should return the proper size for tiny range' do
|
108
117
|
@bot.plugins.first.get_bag_size(0).should == 'tiny'
|
109
118
|
@bot.plugins.first.get_bag_size(rand(100)).should == 'tiny'
|
110
119
|
@bot.plugins.first.get_bag_size(100).should == 'tiny'
|
111
120
|
end
|
112
121
|
|
113
|
-
it
|
122
|
+
it 'should return the proper size for small range' do
|
114
123
|
@bot.plugins.first.get_bag_size(101).should == 'small'
|
115
124
|
@bot.plugins.first.get_bag_size(rand(399) + 101).should == 'small'
|
116
125
|
@bot.plugins.first.get_bag_size(500).should == 'small'
|
117
126
|
end
|
118
127
|
|
119
|
-
it
|
128
|
+
it 'should return the proper size for medium range' do
|
120
129
|
@bot.plugins.first.get_bag_size(501).should == 'medium'
|
121
130
|
@bot.plugins.first.get_bag_size(rand(499) + 501).should == 'medium'
|
122
131
|
@bot.plugins.first.get_bag_size(1000).should == 'medium'
|
123
132
|
end
|
124
133
|
|
125
|
-
it
|
134
|
+
it 'should return the proper size for large range' do
|
126
135
|
@bot.plugins.first.get_bag_size(1001).should == 'large'
|
127
136
|
@bot.plugins.first.get_bag_size(rand(499) + 1001).should == 'large'
|
128
137
|
@bot.plugins.first.get_bag_size(1500).should == 'large'
|
129
138
|
end
|
130
139
|
|
131
|
-
it
|
140
|
+
it 'should return the proper size for hefty range' do
|
132
141
|
@bot.plugins.first.get_bag_size(1501).should == 'hefty'
|
133
142
|
@bot.plugins.first.get_bag_size(rand(499) + 1501).should == 'hefty'
|
134
143
|
@bot.plugins.first.get_bag_size(2000).should == 'hefty'
|
135
144
|
end
|
136
145
|
|
137
|
-
it
|
146
|
+
it 'should return the proper size for huge range' do
|
138
147
|
@bot.plugins.first.get_bag_size(2001).should == 'huge'
|
139
148
|
@bot.plugins.first.get_bag_size(20001).should == 'huge'
|
140
149
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cinch-dicebag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-01-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|