class Lita::Timing::SlidingWindow

Public Class Methods

new(name, redis) click to toggle source
# File lib/lita/timing/sliding_window.rb, line 4
def initialize(name, redis)
  @name, @redis = name, redis
  @mutex = Timing::Mutex.new("#{name}-lock", redis)

  initialise_last_time_if_not_set
end

Public Instance Methods

advance(duration_minutes: 30, buffer_minutes: 0) { |last_time| ... } click to toggle source
# File lib/lita/timing/sliding_window.rb, line 11
def advance(duration_minutes: 30, buffer_minutes: 0, &block)
  @mutex.syncronise do
    start_time = Time.now - mins_to_seconds(duration_minutes) - mins_to_seconds(buffer_minutes)
    last_time = get_last_time

    return unless start_time > last_time

    advance_to = last_time + mins_to_seconds(duration_minutes)

    yield last_time + 1, advance_to

    @redis.set(@name, advance_to.to_i)
  end
end

Private Instance Methods

get_last_time() click to toggle source
# File lib/lita/timing/sliding_window.rb, line 32
def get_last_time
  Time.at(@redis.get(@name).to_i)
end
initialise_last_time_if_not_set() click to toggle source
# File lib/lita/timing/sliding_window.rb, line 36
def initialise_last_time_if_not_set
  @mutex.syncronise do
    @redis.setnx(@name, two_weeks_ago.to_i)
  end
end
mins_to_seconds(mins) click to toggle source
# File lib/lita/timing/sliding_window.rb, line 28
def mins_to_seconds(mins)
  mins * 60
end
two_weeks_ago() click to toggle source
# File lib/lita/timing/sliding_window.rb, line 42
def two_weeks_ago
  ::Time.now - (60 * 60 * 24 * 14)
end