online_manager 0.0.1 → 0.0.2
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 +21 -3
- data/lib/online_manager.rb +13 -29
- data/lib/online_manager/dsl.rb +23 -0
- data/online_manager.gemspec +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc1c0b7ad1198c4e4a02cb8b797b647b919571fd
|
4
|
+
data.tar.gz: e1d2a97d952633e0e68023760cd426f6b98c6a3c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f505a05f4324e4ac45ea09d940ff7e76a4da416e5ebbc91450ecf2e5bb89c53be3145cff0c10078f4c37b1c69bc4dd1791efc54a9b20036b567c0cb233840360
|
7
|
+
data.tar.gz: 278a2c80e9688f6d9df62e263b2a0391f2151ab0eae0f5c94baaa86726e95ca6efa5db1822c8b9268fb68d5a16305c61583f50e83f7f6d688a7be3f112fc38ac
|
data/README.md
CHANGED
@@ -27,10 +27,14 @@ Or install it yourself as:
|
|
27
27
|
```ruby
|
28
28
|
require 'online_manager'
|
29
29
|
|
30
|
+
# You should set all the users offline when it first runs,
|
31
|
+
# since otherwise you'll be left with users marked online from when it last quit.
|
32
|
+
|
30
33
|
# This runs an eventmachine reactor, so the call to .run blocks.
|
31
34
|
OnlineManager.run do |c|
|
32
35
|
|
33
|
-
|
36
|
+
# How long since a heartbeat was last received until the user is considered offline? (in seconds)
|
37
|
+
c.timeout 5
|
34
38
|
|
35
39
|
# All the blocks below will be called inside an eventmachine reactor.
|
36
40
|
|
@@ -43,7 +47,7 @@ OnlineManager.run do |c|
|
|
43
47
|
c.online do |user_id|
|
44
48
|
puts "Booster #{user_id} online"
|
45
49
|
# Update the user to online in the database or whatever
|
46
|
-
# This must
|
50
|
+
# This must use asynchronous i/o, otherwise it will block the reactor.
|
47
51
|
end
|
48
52
|
|
49
53
|
c.offline do |user_id|
|
@@ -53,10 +57,23 @@ OnlineManager.run do |c|
|
|
53
57
|
end
|
54
58
|
```
|
55
59
|
|
60
|
+
If you already are in the context of an eventmachine reactor, or you want to run multiple of these in the same thread,
|
61
|
+
you can use `.setup`.
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
EM.run do
|
65
|
+
OnlineManager.setup do |c|
|
66
|
+
# Configure it
|
67
|
+
end
|
68
|
+
end
|
69
|
+
```
|
70
|
+
|
56
71
|
## TODO
|
57
72
|
|
58
73
|
* Write tests for this. Its pretty simple (~ 50 lines of code excluding the DSL) and I have it running in production, so it should be fine.
|
59
74
|
Check out [this][1] for testing eventmachine.
|
75
|
+
* Consider setting remaining users offline in an ensure block, so it always leaves the statuses in a consistent state.
|
76
|
+
[Could this replace setting users offline on initialization?][2]
|
60
77
|
|
61
78
|
## Contributing
|
62
79
|
|
@@ -67,4 +84,5 @@ end
|
|
67
84
|
5. Create a new Pull Request
|
68
85
|
|
69
86
|
|
70
|
-
[1]: https://github.com/jcoglan/rspec-eventmachine
|
87
|
+
[1]: https://github.com/jcoglan/rspec-eventmachine
|
88
|
+
[2]: http://stackoverflow.com/questions/25235089/when-will-rubys-ensure-not-run
|
data/lib/online_manager.rb
CHANGED
@@ -1,13 +1,18 @@
|
|
1
1
|
require 'eventmachine'
|
2
2
|
|
3
|
-
|
3
|
+
require 'online_manager/dsl'
|
4
4
|
|
5
|
+
class OnlineManager
|
5
6
|
attr_writer :online_callback, :offline_callback, :setup_callback, :timeout
|
6
7
|
|
7
8
|
def self.run(*args, &block)
|
8
9
|
new(*args, &block).run
|
9
10
|
end
|
10
11
|
|
12
|
+
def self.setup(*args, &block)
|
13
|
+
new(*args, &block).setup
|
14
|
+
end
|
15
|
+
|
11
16
|
def initialize
|
12
17
|
@timeout = nil
|
13
18
|
@online_users = {}
|
@@ -15,18 +20,20 @@ class OnlineManager
|
|
15
20
|
@offline_callback = -> (_) { }
|
16
21
|
@setup_callback = ->(_) { raise 'You must specify a setup callback' }
|
17
22
|
|
18
|
-
yield
|
23
|
+
yield DSL.new(self) if block_given?
|
19
24
|
|
20
25
|
raise 'Timeout must be specified' unless @timeout
|
21
26
|
end
|
22
27
|
|
23
28
|
def run
|
24
|
-
EM.run
|
25
|
-
@setup_callback.call(method(:seen))
|
26
|
-
end
|
29
|
+
EM.run { setup }
|
27
30
|
end
|
28
31
|
|
29
|
-
|
32
|
+
def setup
|
33
|
+
@setup_callback.call(method(:seen))
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
30
37
|
|
31
38
|
def seen(id)
|
32
39
|
@online_callback.call(id) unless online?(id)
|
@@ -49,27 +56,4 @@ class OnlineManager
|
|
49
56
|
def online?(id)
|
50
57
|
@online_users.has_key?(id)
|
51
58
|
end
|
52
|
-
|
53
|
-
class CallbackDSL
|
54
|
-
def initialize(target)
|
55
|
-
@target = target
|
56
|
-
end
|
57
|
-
|
58
|
-
def timeout(timeout)
|
59
|
-
@target.timeout = timeout
|
60
|
-
end
|
61
|
-
|
62
|
-
def online(&block)
|
63
|
-
@target.online_callback = block
|
64
|
-
end
|
65
|
-
|
66
|
-
def offline(&block)
|
67
|
-
@target.offline_callback = block
|
68
|
-
end
|
69
|
-
|
70
|
-
def setup(&block)
|
71
|
-
@target.setup_callback = block
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
59
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class OnlineManager
|
2
|
+
class DSL
|
3
|
+
def initialize(target)
|
4
|
+
@target = target
|
5
|
+
end
|
6
|
+
|
7
|
+
def timeout(timeout)
|
8
|
+
@target.timeout = timeout
|
9
|
+
end
|
10
|
+
|
11
|
+
def online(&block)
|
12
|
+
@target.online_callback = block
|
13
|
+
end
|
14
|
+
|
15
|
+
def offline(&block)
|
16
|
+
@target.offline_callback = block
|
17
|
+
end
|
18
|
+
|
19
|
+
def setup(&block)
|
20
|
+
@target.setup_callback = block
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/online_manager.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'online_manager'
|
7
|
-
spec.version = '0.0.
|
7
|
+
spec.version = '0.0.2'
|
8
8
|
spec.authors = ['Cameron Martin']
|
9
9
|
spec.email = ['cameronmartin123@gmail.com']
|
10
10
|
spec.summary = %q{Manage user's online status.}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: online_manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cameron Martin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- README.md
|
81
81
|
- Rakefile
|
82
82
|
- lib/online_manager.rb
|
83
|
+
- lib/online_manager/dsl.rb
|
83
84
|
- online_manager.gemspec
|
84
85
|
homepage: https://github.com/cameron-martin/online_manager
|
85
86
|
licenses:
|