lita-totems 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/lita/handlers/totems.rb +11 -2
- data/lita-totems.gemspec +2 -2
- data/spec/lita/handlers/totems_spec.rb +63 -37
- data/spec/spec_helper.rb +1 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4c08d38dab66a89133a326195a7a3284c383e95e
|
4
|
+
data.tar.gz: 67e50f44222b2e993aec07811c178a868cf31a24
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80179d6ebc67dd3ff465b7fb0636b9cab74665b0ca9d8ce564b6eb183c06cb5cefbca6d62039dd1baa4259366e7b21f883527543395bc5b5f91ee60af3c3179c
|
7
|
+
data.tar.gz: b6fcd10085bdc4fc04ceceb5faf7c2bd2ddd5a8cbab5b6c206d923e23629a11182fd583b446cd9b19627e0c801113092df467b33c019caa5fd377520a9ff52aa
|
data/lib/lita/handlers/totems.rb
CHANGED
@@ -10,13 +10,14 @@ module Lita
|
|
10
10
|
%r{
|
11
11
|
^totems?\s+
|
12
12
|
(#{action_capture_group})\s+
|
13
|
-
(?<totem>\w+)
|
13
|
+
(?<totem>\w+)\s*
|
14
|
+
(?<message>.*)?
|
14
15
|
}x
|
15
16
|
end
|
16
17
|
|
17
18
|
route(route_regex("add|join|take|queue"), :add,
|
18
19
|
help: {
|
19
|
-
'totems add TOTEM' => "Adds yourself to the TOTEM queue, or assigns yourself to the TOTEM if it's unassigned"
|
20
|
+
'totems add TOTEM <MESSAGE>' => "Adds yourself to the TOTEM queue, or assigns yourself to the TOTEM if it's unassigned. Includes optional MESSAGE."
|
20
21
|
})
|
21
22
|
|
22
23
|
route(
|
@@ -108,9 +109,12 @@ module Lita
|
|
108
109
|
return
|
109
110
|
end
|
110
111
|
|
112
|
+
message = response.match_data[:message]
|
113
|
+
|
111
114
|
token_acquired = false
|
112
115
|
queue_size = nil
|
113
116
|
Redis::Semaphore.new("totem/#{totem}", redis: redis).lock do
|
117
|
+
redis.hset("totem/#{totem}/message", user_id, message) if message && message != ""
|
114
118
|
if redis.llen("totem/#{totem}/list") == 0 && redis.get("totem/#{totem}/owning_user_id").nil?
|
115
119
|
# take it:
|
116
120
|
token_acquired = true
|
@@ -176,6 +180,7 @@ module Lita
|
|
176
180
|
|
177
181
|
redis.srem("user/#{past_owning_user_id}/totems", totem)
|
178
182
|
redis.hdel("totem/#{totem}/waiting_since", past_owning_user_id)
|
183
|
+
redis.hdel("totem/#{totem}/message", past_owning_user_id)
|
179
184
|
robot.send_messages(Lita::Source.new(user: Lita::User.find_by_id(past_owning_user_id)), %{You have been kicked from totem "#{totem}".})
|
180
185
|
next_user_id = redis.lpop("totem/#{totem}/list")
|
181
186
|
if next_user_id
|
@@ -215,10 +220,13 @@ module Lita
|
|
215
220
|
first_id = redis.get("totem/#{totem}/owning_user_id")
|
216
221
|
if first_id
|
217
222
|
waiting_since_hash = redis.hgetall("totem/#{totem}/waiting_since")
|
223
|
+
message_hash = redis.hgetall("totem/#{totem}/message")
|
218
224
|
str += "#{prefix}1. #{users_cache[first_id].name} (held for #{waiting_duration(waiting_since_hash[first_id])})\n"
|
225
|
+
str += "\s\s\s\s#{message_hash[first_id]}\n" if message_hash[first_id]
|
219
226
|
rest = redis.lrange("totem/#{totem}/list", 0, -1)
|
220
227
|
rest.each_with_index do |user_id, index|
|
221
228
|
str += "#{prefix}#{index+2}. #{users_cache[user_id].name} (waiting for #{waiting_duration(waiting_since_hash[user_id])})\n"
|
229
|
+
str += "\s\s\s\s#{message_hash[user_id]}\n" if message_hash[user_id]
|
222
230
|
end
|
223
231
|
end
|
224
232
|
str
|
@@ -231,6 +239,7 @@ module Lita
|
|
231
239
|
def yield_totem(totem, user_id, response)
|
232
240
|
redis.srem("user/#{user_id}/totems", totem)
|
233
241
|
redis.hdel("totem/#{totem}/waiting_since", user_id)
|
242
|
+
redis.hdel("totem/#{totem}/message", user_id)
|
234
243
|
next_user_id = redis.lpop("totem/#{totem}/list")
|
235
244
|
if next_user_id
|
236
245
|
redis.set("totem/#{totem}/owning_user_id", next_user_id)
|
data/lita-totems.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "lita-totems"
|
3
|
-
spec.version = "0.
|
3
|
+
spec.version = "0.3.0"
|
4
4
|
spec.authors = ["Charles Finkel", "Vijay Ramesh"]
|
5
5
|
spec.email = ["cf@dropbox.com", "vijay@change.org"]
|
6
6
|
spec.description = %q{Totems handler for Lita)}
|
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
14
14
|
spec.require_paths = ["lib"]
|
15
15
|
|
16
|
-
spec.add_runtime_dependency "lita", ">=
|
16
|
+
spec.add_runtime_dependency "lita", ">= 4.0"
|
17
17
|
spec.add_runtime_dependency "chronic_duration"
|
18
18
|
spec.add_runtime_dependency "redis-semaphore"
|
19
19
|
|
@@ -1,16 +1,18 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Lita::Handlers::Totems, lita_handler: true do
|
4
|
-
it {
|
5
|
-
it {
|
6
|
-
it {
|
7
|
-
it {
|
8
|
-
it {
|
9
|
-
it {
|
10
|
-
it {
|
11
|
-
it {
|
12
|
-
it {
|
13
|
-
it {
|
4
|
+
it { is_expected.to route("totems add foo").to(:add) }
|
5
|
+
it { is_expected.to route("totem add foo").to(:add) }
|
6
|
+
it { is_expected.to route("totem join foo").to(:add) }
|
7
|
+
it { is_expected.to route("totems add foo message").to(:add) }
|
8
|
+
it { is_expected.not_to route("totems add ").to(:add) }
|
9
|
+
it { is_expected.not_to route("tote add foo").to(:add) }
|
10
|
+
it { is_expected.to route("totems kick foo").to(:kick) }
|
11
|
+
it { is_expected.to route("totems kick foo bob").to(:kick) }
|
12
|
+
it { is_expected.to route("totems").to(:info) }
|
13
|
+
it { is_expected.to route("totems info").to(:info) }
|
14
|
+
it { is_expected.to route("totems info chicken").to(:info) }
|
15
|
+
|
14
16
|
|
15
17
|
let(:totem_creator) { Class.new do
|
16
18
|
def initialize
|
@@ -121,6 +123,25 @@ describe Lita::Handlers::Totems, lita_handler: true do
|
|
121
123
|
end
|
122
124
|
end
|
123
125
|
|
126
|
+
context "with a message" do
|
127
|
+
before do
|
128
|
+
Timecop.freeze("2014-03-01 12:00:00") do
|
129
|
+
send_message("totems add chicken message", as: carl)
|
130
|
+
send_message("totems add chicken other message", as: another_user)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
it "includes the message in the totems' info" do
|
134
|
+
Timecop.freeze("2014-03-01 13:00:00") do
|
135
|
+
send_message("totems info chicken")
|
136
|
+
expect(replies.last).to eq <<-END
|
137
|
+
1. Carl (held for 1h)
|
138
|
+
message
|
139
|
+
2. person_1 (waiting for 1h)
|
140
|
+
other message
|
141
|
+
END
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
124
145
|
end
|
125
146
|
|
126
147
|
context "when the totem doesn't exist" do
|
@@ -152,26 +173,28 @@ describe Lita::Handlers::Totems, lita_handler: true do
|
|
152
173
|
end
|
153
174
|
end
|
154
175
|
it "yields that totem, gives to the next person in line" do
|
155
|
-
expect(robot).to receive(:send_messages) do |target, message|
|
156
|
-
expect(
|
157
|
-
|
176
|
+
expect(robot).to receive(:send_messages).twice do |target, message|
|
177
|
+
expect([another_user.id, carl.id]).to include(target.user.id)
|
178
|
+
if target.user.id == another_user.id
|
179
|
+
expect(message).to eq(%{You are now in possession of totem "chicken."})
|
180
|
+
elsif target.user.id == carl.id
|
181
|
+
expect(message).to eq("You have yielded the totem to #{another_user.name}.")
|
182
|
+
end
|
158
183
|
end
|
159
184
|
send_message("totems yield", as: carl)
|
160
|
-
# todo: check for message to other user
|
161
|
-
expect(replies.last).to eq("You have yielded the totem to #{another_user.name}.")
|
162
185
|
end
|
163
186
|
it "updates the waiting since value for the new holder" do
|
164
187
|
Timecop.freeze("2014-03-01 13:00:00") do
|
165
188
|
send_message("totems info chicken")
|
166
189
|
expect(replies.last).to eq <<-END
|
167
190
|
1. Carl (held for 2h)
|
168
|
-
2.
|
191
|
+
2. person_1 (waiting for 1h)
|
169
192
|
3. person_2 (waiting for 1h)
|
170
193
|
END
|
171
194
|
send_message("totems yield", as: carl)
|
172
195
|
send_message("totems info chicken")
|
173
196
|
expect(replies.last).to eq <<-END
|
174
|
-
1.
|
197
|
+
1. person_1 (held for 0s)
|
175
198
|
2. person_2 (waiting for 1h)
|
176
199
|
END
|
177
200
|
end
|
@@ -240,7 +263,7 @@ describe Lita::Handlers::Totems, lita_handler: true do
|
|
240
263
|
send_message("totems yield chicken", as: carl)
|
241
264
|
expect(replies.last).to eq(%{You are no longer in line for the "chicken" totem.})
|
242
265
|
send_message("totems info chicken")
|
243
|
-
expect(replies.last).to eq("1.
|
266
|
+
expect(replies.last).to eq("1. person_1 (held for 1h)\n")
|
244
267
|
end
|
245
268
|
end
|
246
269
|
end
|
@@ -251,7 +274,7 @@ describe Lita::Handlers::Totems, lita_handler: true do
|
|
251
274
|
send_message("totems yield", as: carl)
|
252
275
|
expect(replies.last).to eq(%{You are no longer in line for the "chicken" totem.})
|
253
276
|
send_message("totems info chicken")
|
254
|
-
expect(replies.last).to eq("1.
|
277
|
+
expect(replies.last).to eq("1. person_1 (held for 1h)\n")
|
255
278
|
end
|
256
279
|
end
|
257
280
|
end
|
@@ -274,7 +297,7 @@ describe Lita::Handlers::Totems, lita_handler: true do
|
|
274
297
|
send_message("totems yield chicken", as: carl)
|
275
298
|
expect(replies.last).to eq(%{You are no longer in line for the "chicken" totem.})
|
276
299
|
send_message("totems info chicken")
|
277
|
-
expect(replies.last).to eq("1.
|
300
|
+
expect(replies.last).to eq("1. person_1 (held for 1h)\n2. person_2 (waiting for 1h)\n")
|
278
301
|
end
|
279
302
|
end
|
280
303
|
end
|
@@ -306,7 +329,7 @@ describe Lita::Handlers::Totems, lita_handler: true do
|
|
306
329
|
send_message("totems yield chicken", as: carl)
|
307
330
|
expect(replies.last).to eq(%{You are no longer in line for the "chicken" totem.})
|
308
331
|
send_message("totems info chicken")
|
309
|
-
expect(replies.last).to eq("1.
|
332
|
+
expect(replies.last).to eq("1. person_1 (held for 1h)\n2. person_2 (waiting for 1h)\n")
|
310
333
|
end
|
311
334
|
end
|
312
335
|
end
|
@@ -333,16 +356,16 @@ describe Lita::Handlers::Totems, lita_handler: true do
|
|
333
356
|
send_message("totems add chicken", as: another_user)
|
334
357
|
send_message("totems add chicken", as: carl)
|
335
358
|
end
|
336
|
-
it "should notify that user that she has been kicked" do
|
337
|
-
expect(robot).to receive(:send_messages) do |target, message|
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
359
|
+
it "should notify that user that she has been kicked, and notify the next user she now has the totem" do
|
360
|
+
expect(robot).to receive(:send_messages).twice do |target, message|
|
361
|
+
expect([another_user.id, carl.id]).to include(target.user.id)
|
362
|
+
if target.user.id == carl.id
|
363
|
+
expect(message).to eq(%{You are now in possession of totem "chicken".})
|
364
|
+
elsif target.user.id == another_user.id
|
365
|
+
expect(message).to eq(%{You have been kicked from totem "chicken".})
|
366
|
+
end
|
367
|
+
end
|
368
|
+
send_message("totems kick chicken", as: carl)
|
346
369
|
end
|
347
370
|
end
|
348
371
|
|
@@ -351,13 +374,16 @@ describe Lita::Handlers::Totems, lita_handler: true do
|
|
351
374
|
send_message("totems add chicken", as: carl)
|
352
375
|
end
|
353
376
|
it "should notify that user that she has been kicked and clear the owning_user_id" do
|
354
|
-
expect(robot).to receive(:send_messages) do |target, message|
|
355
|
-
expect(
|
356
|
-
|
377
|
+
expect(robot).to receive(:send_messages).twice do |target, message|
|
378
|
+
expect([another_user.id, carl.id]).to include(target.user.id)
|
379
|
+
if target.user.id == carl.id
|
380
|
+
expect(message).to eq(%{You have been kicked from totem "chicken".})
|
381
|
+
elsif target.user.id == another_user.id
|
382
|
+
expect(message).to eq("")
|
383
|
+
end
|
357
384
|
end
|
358
385
|
send_message("totems kick chicken")
|
359
386
|
send_message("totems info chicken")
|
360
|
-
expect(replies.last).to eq ""
|
361
387
|
end
|
362
388
|
end
|
363
389
|
|
@@ -388,7 +414,7 @@ describe Lita::Handlers::Totems, lita_handler: true do
|
|
388
414
|
send_message("totems info chicken")
|
389
415
|
expect(replies.last).to eq <<-END
|
390
416
|
1. Carl (held for 1h)
|
391
|
-
2.
|
417
|
+
2. person_1 (waiting for 1h)
|
392
418
|
3. person_2 (waiting for 1h)
|
393
419
|
END
|
394
420
|
end
|
@@ -402,7 +428,7 @@ describe Lita::Handlers::Totems, lita_handler: true do
|
|
402
428
|
expect(replies.last).to include <<-END
|
403
429
|
- chicken
|
404
430
|
1. Carl (held for 1d 1h)
|
405
|
-
2.
|
431
|
+
2. person_1 (waiting for 1d 1h)
|
406
432
|
3. person_2 (waiting for 1d 1h)
|
407
433
|
END
|
408
434
|
expect(replies.last).to include <<-END
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lita-totems
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Charles Finkel
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-09-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: lita
|
@@ -17,14 +17,14 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
20
|
+
version: '4.0'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '
|
27
|
+
version: '4.0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: chronic_duration
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -176,7 +176,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
176
176
|
version: '0'
|
177
177
|
requirements: []
|
178
178
|
rubyforge_project:
|
179
|
-
rubygems_version: 2.
|
179
|
+
rubygems_version: 2.4.5
|
180
180
|
signing_key:
|
181
181
|
specification_version: 4
|
182
182
|
summary: Adds support to Lita for Totems
|