Class: WhoIsOnline::Tracker

Inherits:
Object
  • Object
show all
Defined in:
lib/whoisonline/tracker.rb

Instance Method Summary collapse

Constructor Details

#initialize(configuration, redis_store) ⇒ Tracker

Returns a new instance of Tracker.



5
6
7
8
9
# File 'lib/whoisonline/tracker.rb', line 5

def initialize(configuration, redis_store)
  @configuration = configuration
  @redis_store = redis_store
  @last_write_by_user = Concurrent::Hash.new
end

Instance Method Details

#countObject



38
39
40
# File 'lib/whoisonline/tracker.rb', line 38

def count
  user_ids.size
end

#offline(user) ⇒ Object



22
23
24
25
26
27
28
29
# File 'lib/whoisonline/tracker.rb', line 22

def offline(user)
  uid = extract_id(user)
  return unless uid

  key = presence_key(uid)
  @redis_store.delete_presence(key)
  @last_write_by_user.delete(uid)
end

#online?(user) ⇒ Boolean

Returns:



31
32
33
34
35
36
# File 'lib/whoisonline/tracker.rb', line 31

def online?(user)
  uid = extract_id(user)
  return false unless uid

  @redis_store.exists?(presence_key(uid))
end

#track(user) ⇒ Object



11
12
13
14
15
16
17
18
19
20
# File 'lib/whoisonline/tracker.rb', line 11

def track(user)
  uid = extract_id(user)
  return unless uid
  return if throttled?(uid)

  key = presence_key(uid)
  now = Time.now.to_i
  result = @redis_store.write_presence(key, now, ttl_seconds)
  @last_write_by_user[uid] = Time.now if result
end

#user_idsObject



42
43
44
45
# File 'lib/whoisonline/tracker.rb', line 42

def user_ids
  keys = @redis_store.scan_keys(match: "#{@configuration.namespace}:*")
  keys.lazy.map { |key| key.split(":").last }.to_a
end

#users(model_class) ⇒ Object



47
48
49
# File 'lib/whoisonline/tracker.rb', line 47

def users(model_class)
  model_class.where(id: user_ids)
end