lita-resistance 0.2.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Build Status](https://travis-ci.org/DeonHua/lita-resistance.svg?branch=master)](https://travis-ci.org/DeonHua/lita-resistance)
|
4
4
|
[![Gem Version](https://badge.fury.io/rb/lita-resistance.svg)](https://badge.fury.io/rb/lita-resistance)
|
5
|
+
[![Coverage Status](https://coveralls.io/repos/DeonHua/lita-resistance/badge.svg?branch=master&service=github)](https://coveralls.io/github/DeonHua/lita-resistance?branch=master)
|
6
|
+
[![Code Climate](https://codeclimate.com/github/DeonHua/lita-resistance/badges/gpa.svg)](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
|
-
[![forthebadge](http://forthebadge.com/images/badges/built-with-love.svg)](http://forthebadge.com)
|
64
|
+
[![forthebadge](http://forthebadge.com/images/badges/built-with-love.svg)](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
|