lita-resistance 0.2.2 → 1.0.0
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.
- checksums.yaml +4 -4
- data/README.md +38 -6
- data/lib/lita/handlers/resistance.rb +115 -36
- data/lita-resistance.gemspec +1 -1
- data/spec/lita/handlers/resistance_spec.rb +84 -0
- data/templates/help.erb +26 -0
- data/templates/resistance.erb +24 -0
- data/templates/spy.erb +24 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4363c72dc88d6f40ca3ab0d35797401f1c556852
|
4
|
+
data.tar.gz: 7d4cd10706c1e6180c44506a6e47a5b4ae310d4d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 469066210687fa7d82e1a7ba7ede2e51a878a557f83506d04d611b78c02d2f7b8214f7401c1f22630d5314270009565b55facab225ade8cf9bd1010ee1831d5b
|
7
|
+
data.tar.gz: 0d299ad027f0f07813fb61b092dcd88550d8fe0b9b2ea84a6cb4556ed849eed59e575f2f358bfbb323eb032a8a10c4f01565cf0fecfff36dd123dae9c3d848f4
|
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
[](https://travis-ci.org/DeonHua/lita-resistance)
|
4
4
|
[](https://badge.fury.io/rb/lita-resistance)
|
5
|
+
[](https://coveralls.io/github/DeonHua/lita-resistance?branch=master)
|
6
|
+
[](https://codeclimate.com/github/DeonHua/lita-resistance)
|
5
7
|
|
6
8
|
Plays a game of resistance by assigning roles to users you mention in chat.
|
7
9
|
|
@@ -15,18 +17,48 @@ gem "lita-resistance"
|
|
15
17
|
|
16
18
|
## Usage
|
17
19
|
|
18
|
-
`lita resistance
|
20
|
+
`lita resistance help` - Provides detailed help (this readme file)
|
19
21
|
|
20
|
-
|
22
|
+
`lita resistance N [users]` - Assigns the roles of spy/resistance to users you mention, with no special characters.
|
21
23
|
|
22
|
-
`lita resistance
|
24
|
+
`lita resistance [CBSAFD] [users]` - Assigns special characters to the users mentioned, the remainder (if any) will receive 'vanilla' spy/resistance roles.
|
25
|
+
|
26
|
+
### Special Characters
|
27
|
+
**Note:** The number of special characters chosen for each team must be less than the number of characters on that team.
|
28
|
+
|
29
|
+
The number of spies is always (Players + 2)/3 **rounded down**.
|
30
|
+
|
31
|
+
#### Resistance (Good)
|
32
|
+
Commander (**C**) - Knows all spies except Deep Cover.
|
33
|
+
|
34
|
+
Body Guard (**B**) - Knows Commander and False Commander.
|
35
|
+
|
36
|
+
#### Spies (Bad)
|
37
|
+
|
38
|
+
Blind Spy (**S**) - Doesn't know the other spies. The other spies don't know Blind Spy.
|
39
|
+
|
40
|
+
Assassin (**A**) - If Resistance successfully completes 3 missions, Assassin can guess Commander. If Assassin is correct, Spies win.
|
41
|
+
|
42
|
+
False Commander (**F**) - Appears as Commander to Bodyguard.
|
43
|
+
|
44
|
+
Deep Cover (**D**) - Does not appear as spy to Commander. If played with Commander and without Assassin, can take Assassin's role.
|
45
|
+
|
46
|
+
### Examples (No Special Characters)
|
47
|
+
|
48
|
+
`lita resistance N @player1 @player2 @player3 @player4 @player5`
|
23
49
|
|
24
50
|
You don't need to include the `@` symbol:
|
25
51
|
|
26
|
-
`lita resistance player1 player2 player3 player4 player5`
|
52
|
+
`lita resistance N player1 player2 player3 player4 player5`
|
27
53
|
|
28
54
|
You can also do a combination of both:
|
29
55
|
|
30
|
-
`lita resistance @player1 @player2 player3 player4 player5`
|
56
|
+
`lita resistance N @player1 @player2 player3 player4 player5`
|
57
|
+
|
58
|
+
#### Special Characters
|
59
|
+
|
60
|
+
Assigns Assassin and Commander:
|
61
|
+
|
62
|
+
`lita resistance CA @player1 @player2 @player3 @player4 @player5`
|
31
63
|
|
32
|
-
[](http://forthebadge.com)
|
64
|
+
[](http://forthebadge.com)
|
@@ -2,26 +2,56 @@ module Lita
|
|
2
2
|
module Handlers
|
3
3
|
class Resistance < Handler
|
4
4
|
|
5
|
-
route(/resistance
|
6
|
-
def play(response)
|
7
|
-
all_users = response.args.uniq
|
5
|
+
route(/resistance help/, :help, command: true, help: {'resistance help' => 'Provides detailed help with Resistance commands.'})
|
8
6
|
|
9
|
-
|
10
|
-
response.reply('You need at least 5 players for Resistance.')
|
11
|
-
return
|
12
|
-
elsif all_users.length > 10
|
13
|
-
response.reply('You cannot play a game of Resistance with more than 10 players.')
|
14
|
-
return
|
15
|
-
end
|
7
|
+
route(/resistance [NCBSAFD]+ .+/, :play, command: true, help: {'resistance N|[CBSAFD] [users]' => 'Starts a game of resistance with the people you mention.'})
|
16
8
|
|
17
|
-
|
18
|
-
|
9
|
+
def help (response)
|
10
|
+
response.reply(render_template("help"))
|
11
|
+
end
|
12
|
+
|
13
|
+
# Remove any "@" from usernames
|
14
|
+
def normalize_input! (all_users)
|
15
|
+
all_users.map! do |username|
|
19
16
|
if username[0] == '@'
|
20
|
-
username
|
17
|
+
username[1, username.length-1]
|
21
18
|
else
|
22
|
-
username
|
19
|
+
username
|
23
20
|
end
|
24
|
-
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def verify_characters (characters)
|
25
|
+
if characters != characters.uniq
|
26
|
+
raise 'You cannot have more than one of the same character.'
|
27
|
+
end
|
28
|
+
|
29
|
+
if characters.include?('N') && characters.length > 1
|
30
|
+
raise 'You cannot include special characters with N.'
|
31
|
+
end
|
32
|
+
|
33
|
+
# Num of Special Characters on spies doesn't exceed num of spies
|
34
|
+
if !characters.include?('N') && (characters - ['C', 'B']).length > @num_spies
|
35
|
+
raise 'You cannot have more special characters on spies than the number of spies.'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def validate_input (response)
|
40
|
+
input_args = response.args.uniq
|
41
|
+
@characters = input_args[0].split(//)
|
42
|
+
all_users = input_args[1, input_args.length - 1] # User mention_names
|
43
|
+
|
44
|
+
if all_users.length < 5
|
45
|
+
raise 'You need at least 5 players for Resistance.'
|
46
|
+
elsif all_users.length > 10
|
47
|
+
raise 'You cannot play a game of Resistance with more than 10 players.'
|
48
|
+
end
|
49
|
+
|
50
|
+
@num_spies = (all_users.length + 2) / 3
|
51
|
+
|
52
|
+
verify_characters(@characters)
|
53
|
+
|
54
|
+
normalize_input!(all_users)
|
25
55
|
|
26
56
|
# Ensure all people are users.
|
27
57
|
unknown_users = []
|
@@ -31,40 +61,89 @@ module Lita
|
|
31
61
|
end
|
32
62
|
|
33
63
|
if unknown_users.any?
|
34
|
-
|
35
|
-
unknown_users.each do |user|
|
36
|
-
response.reply(user)
|
37
|
-
end and return
|
64
|
+
raise "The following are not users: @#{unknown_users.join(' @')}"
|
38
65
|
end
|
39
66
|
|
40
|
-
|
67
|
+
all_users
|
68
|
+
end
|
41
69
|
|
42
|
-
|
43
|
-
|
44
|
-
|
70
|
+
def assign_spies (spies)
|
71
|
+
spy_specials = {}
|
72
|
+
if @characters.include?('D')
|
73
|
+
spy_specials[:deep_cover] = spies.sample
|
74
|
+
end
|
75
|
+
|
76
|
+
if @characters.include?('F')
|
77
|
+
spy_specials[:false_commander] = (spies - spy_specials.values).sample
|
78
|
+
end
|
79
|
+
|
80
|
+
if @characters.include?('B')
|
81
|
+
spy_specials[:blind_spy] = (spies - spy_specials.values).sample
|
82
|
+
end
|
83
|
+
|
84
|
+
if @characters.include?('A')
|
85
|
+
spy_specials[:assassin] = (spies - spy_specials.values).sample
|
86
|
+
end
|
45
87
|
|
46
88
|
spies.each do |member|
|
47
89
|
user = Lita::User.find_by_mention_name(member)
|
48
|
-
|
49
|
-
robot.send_message(
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
90
|
+
other_spies = spies.dup - [spy_specials[:blind_spy], member] # Don't mention Blind Spy or self
|
91
|
+
robot.send_message(Source.new(user: user),
|
92
|
+
render_template('spy', { spy_specials: spy_specials,
|
93
|
+
other_spies: other_spies,
|
94
|
+
member: member,
|
95
|
+
starter: @starter,
|
96
|
+
game_id: @game_id }))
|
97
|
+
end
|
98
|
+
spy_specials
|
99
|
+
end
|
100
|
+
|
101
|
+
def assign_resistance (resistance, spies, spy_specials)
|
102
|
+
if @characters.include?('C')
|
103
|
+
commander = resistance.sample
|
104
|
+
commander_visible = spies - [spy_specials[:deep_cover]]
|
105
|
+
end
|
106
|
+
|
107
|
+
if @characters.include?('B')
|
108
|
+
bodyguard = (resistance - [commander]).sample
|
109
|
+
bodyguard_visible = [commander, spy_specials[:false_commander]].shuffle.compact
|
57
110
|
end
|
58
111
|
|
59
112
|
resistance.each do |member|
|
60
113
|
user = Lita::User.find_by_mention_name(member)
|
61
|
-
robot.send_message(Source.new(user: user),
|
114
|
+
robot.send_message(Source.new(user: user),
|
115
|
+
render_template("resistance", { commander: commander,
|
116
|
+
bodyguard: bodyguard,
|
117
|
+
bodyguard_visible: bodyguard_visible,
|
118
|
+
commander_visible: commander_visible,
|
119
|
+
member: member,
|
120
|
+
starter: @starter,
|
121
|
+
game_id: @game_id,
|
122
|
+
spy_specials: spy_specials }))
|
123
|
+
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def play(response)
|
128
|
+
begin
|
129
|
+
all_users = validate_input(response)
|
130
|
+
rescue StandardError => error
|
131
|
+
response.reply(error.to_s) and return
|
62
132
|
end
|
63
133
|
|
64
|
-
|
65
|
-
response.
|
134
|
+
@game_id = rand(999999)
|
135
|
+
@starter = response.user.mention_name # Person who started the game
|
136
|
+
# Form teams
|
137
|
+
spies = all_users.sample(@num_spies)
|
138
|
+
resistance = all_users - spies
|
139
|
+
|
140
|
+
spy_specials = assign_spies(spies)
|
141
|
+
assign_resistance(resistance, spies, spy_specials)
|
142
|
+
|
143
|
+
leader = all_users.sample # Randomly pick a leader for the first round
|
144
|
+
response.reply("Roles have been assigned to the selected people! This is game ID ##{@game_id}. @#{leader} will be leading off the first round.")
|
66
145
|
end
|
67
|
-
|
146
|
+
|
68
147
|
Lita.register_handler(self)
|
69
148
|
end
|
70
149
|
end
|
data/lita-resistance.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "lita-resistance"
|
3
|
-
spec.version = "0.
|
3
|
+
spec.version = "1.0.0"
|
4
4
|
spec.authors = ["Deon Hua", "Yu Chen Hou"]
|
5
5
|
spec.email = ["deonhbci@gmail.com", "me@yuchen.io"]
|
6
6
|
spec.description = "Plays a game of resistance by assigning roles to users you mention in chat."
|
@@ -1,4 +1,88 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Lita::Handlers::Resistance, lita_handler: true do
|
4
|
+
before(:each) do
|
5
|
+
a = Lita::User.create(1, {name: 'a', mention_name: 'a'})
|
6
|
+
b = Lita::User.create(2, {name: 'b', mention_name: 'b'})
|
7
|
+
c = Lita::User.create(3, {name: 'c', mention_name: 'c'})
|
8
|
+
d = Lita::User.create(4, {name: 'd', mention_name: 'd'})
|
9
|
+
e = Lita::User.create(5, {name: 'e', mention_name: 'e'})
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "help" do
|
13
|
+
it "should provide help" do
|
14
|
+
send_command('resistance help')
|
15
|
+
expect(replies.last).to include('Commands:') # First line
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "with no special characters" do
|
20
|
+
it 'should not start a game with more than 10 players' do
|
21
|
+
f = Lita::User.create(6, {name: 'f', mention_name: 'f'})
|
22
|
+
g = Lita::User.create(7, {name: 'g', mention_name: 'g'})
|
23
|
+
h = Lita::User.create(8, {name: 'h', mention_name: 'h'})
|
24
|
+
i = Lita::User.create(9, {name: 'i', mention_name: 'i'})
|
25
|
+
j = Lita::User.create(10, {name: 'j', mention_name: 'j'})
|
26
|
+
k = Lita::User.create(11, {name: 'k', mention_name: 'k'})
|
27
|
+
|
28
|
+
send_command('resistance N a b c d e f g h i j k')
|
29
|
+
expect(replies.last).to eq('You cannot play a game of Resistance with more than 10 players.')
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should not start a game with unknown users' do
|
33
|
+
send_command('resistance N a b c d @e f')
|
34
|
+
expect(replies.last).to eq('The following are not users: @f')
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should start a game with 5 players' do
|
38
|
+
send_command('resistance N a b c d @e')
|
39
|
+
expect(replies.last).to include('Roles have been assigned to the selected people!')
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should start a game with 7 players' do
|
43
|
+
f = Lita::User.create(6, {name: 'f', mention_name: 'f'})
|
44
|
+
g = Lita::User.create(7, {name: 'g', mention_name: 'g'})
|
45
|
+
send_command('resistance N a b c d e f g')
|
46
|
+
expect(replies.last).to include('Roles have been assigned to the selected people!')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should not start a game with less than 5 players' do
|
50
|
+
send_command('resistance N a b c d')
|
51
|
+
expect(replies.last).to eq('You need at least 5 players for Resistance.')
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should not start a game with 2 Ns' do
|
55
|
+
send_command('resistance NN a b c d @e')
|
56
|
+
expect(replies.last).to eq('You cannot have more than one of the same character.')
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "with special characters" do
|
61
|
+
it 'should not start a game with multiple of the same character' do
|
62
|
+
send_command('resistance CC a b c d @e')
|
63
|
+
expect(replies.last).to eq('You cannot have more than one of the same character.')
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should not start a game with a special character and N' do
|
67
|
+
send_command('resistance NC a b c d @e')
|
68
|
+
expect(replies.last).to eq('You cannot include special characters with N.')
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should not start a game with more special spies than spies' do
|
72
|
+
send_command('resistance ADF a b c d @e')
|
73
|
+
expect(replies.last).to eq('You cannot have more special characters on spies than the number of spies.')
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'should start a game with 5 players' do
|
77
|
+
send_command('resistance BCDF a b c d @e')
|
78
|
+
expect(replies.last).to include('Roles have been assigned to the selected people!')
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'should start a game with 7 players' do
|
82
|
+
f = Lita::User.create(6, {name: 'f', mention_name: 'f'})
|
83
|
+
g = Lita::User.create(7, {name: 'g', mention_name: 'g'})
|
84
|
+
send_command('resistance ABCFS a b c d e f g')
|
85
|
+
expect(replies.last).to include('Roles have been assigned to the selected people!')
|
86
|
+
end
|
87
|
+
end
|
4
88
|
end
|
data/templates/help.erb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
Commands:
|
2
|
+
`lita resistance help` - Provides detailed help
|
3
|
+
|
4
|
+
`lita resistance N [users]` - Assigns the roles of spy/resistance to users you mention, with no special characters.
|
5
|
+
|
6
|
+
`lita resistance [CBSAFD] [users]` - Assigns special characters to the users mentioned, the remainder (if any) will receive 'vanilla' spy/resistance roles.
|
7
|
+
|
8
|
+
Special Characters:
|
9
|
+
Note: The number of special characters chosen for each team must be less than the number of characters on that team.
|
10
|
+
|
11
|
+
The number of spies is always (Players + 2)/3 rounded down.
|
12
|
+
|
13
|
+
Resistance:
|
14
|
+
Commander (C) - Knows all spies except Deep Cover.
|
15
|
+
|
16
|
+
Body Guard (B) - Knows Commander and False Commander.
|
17
|
+
|
18
|
+
Spies:
|
19
|
+
|
20
|
+
Blind Spy (S) - Doesn't know the other spies. The other spies don't know Blind Spy.
|
21
|
+
|
22
|
+
Assassin (A) - If Resistance successfully completes 3 missions, Assassin can guess Commander. If Assassin is correct, Spies win.
|
23
|
+
|
24
|
+
False Commander (F) - Appears as Commander to Bodyguard.
|
25
|
+
|
26
|
+
Deep Cover (D) - Does not appear as spy to Commander. If played with Commander and without Assassin, can take Assassin's role.
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
<%= @starter %> has started game ID #<%= @game_id %> of Resistance.
|
3
|
+
|
4
|
+
<% if @member == @commander %>
|
5
|
+
You are the Commander, a member of the Resistance.
|
6
|
+
|
7
|
+
<% if @spy_specials[:deep_cover].nil? %>
|
8
|
+
The spies are: @<%= @commander_visible.join(' @') %>.
|
9
|
+
<% else %>
|
10
|
+
The spies, excluding Deep Cover, are: @<%= @commander_visible.join(' @') %>.
|
11
|
+
<% end %>
|
12
|
+
<% elsif @member == @bodyguard %>
|
13
|
+
You are the Bodyguard, a member of the Resistance.
|
14
|
+
|
15
|
+
<% if !@commander.nil? && !@spy_specials[:false_commander].nil? %>
|
16
|
+
The Commander and False Commander, in random order, are: @<%= @bodyguard_visible.join(' @')%>.
|
17
|
+
<% elsif !@commander.nil? && @spy_specials[:false_commander].nil? %>
|
18
|
+
The Commander is @<%= @bodyguard_visible[0] %>
|
19
|
+
<% elsif @commander.nil? && !@spy_specials[:false_commander].nil? %>
|
20
|
+
The False Commander is @<%= @bodyguard_visible[0] %>
|
21
|
+
<% end %>
|
22
|
+
<% else %>
|
23
|
+
You are a regular member of the Resistance.
|
24
|
+
<% end %>
|
data/templates/spy.erb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
<%= @starter %> has started game ID #<%= @game_id %> of Resistance.
|
3
|
+
|
4
|
+
<% if @member == @spy_specials[:blind_spy] %>
|
5
|
+
You are the Blind Spy, a member of the Spies. Unfortunately, you don't know the other spies, and they don't know you.
|
6
|
+
<% else %>
|
7
|
+
<% if @member == @spy_specials[:deep_cover] %>
|
8
|
+
You are the Deep Cover, a member of the Spies.
|
9
|
+
<% elsif @member == @spy_specials[:false_commander] %>
|
10
|
+
You are the False Commander, a member of the Spies.
|
11
|
+
<% elsif @member == @spy_specials[:assassin] %>
|
12
|
+
You are the Assassin, a member of the Spies.
|
13
|
+
<% else %>
|
14
|
+
You are a regular member of the Spies.
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
<% if @other_spies.length == 1 %>
|
18
|
+
The other spy is @<%= @other_spies[0] %>.
|
19
|
+
<% elsif @other_spies.length > 1 %>
|
20
|
+
The other spies are @<%= @other_spies.join(' @') %>.
|
21
|
+
<% else %>
|
22
|
+
The other spy is invisible to you.
|
23
|
+
<% end %>
|
24
|
+
<% end %>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lita-resistance
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Deon Hua
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-01-
|
12
|
+
date: 2016-01-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: lita
|
@@ -144,6 +144,9 @@ files:
|
|
144
144
|
- spec/lita/handlers/resistance_spec.rb
|
145
145
|
- spec/spec_helper.rb
|
146
146
|
- templates/.gitkeep
|
147
|
+
- templates/help.erb
|
148
|
+
- templates/resistance.erb
|
149
|
+
- templates/spy.erb
|
147
150
|
homepage: http://github.com/DeonHua/lita-resistance
|
148
151
|
licenses:
|
149
152
|
- MIT
|