lita-totems 0.2.0 → 0.3.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/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
|