forked from cybrespace/mastodon
57 lines
1.2 KiB
Ruby
57 lines
1.2 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class DeliveryFailureTracker
|
||
|
FAILURE_DAYS_THRESHOLD = 7
|
||
|
|
||
|
def initialize(inbox_url)
|
||
|
@inbox_url = inbox_url
|
||
|
end
|
||
|
|
||
|
def track_failure!
|
||
|
Redis.current.sadd(exhausted_deliveries_key, today)
|
||
|
Redis.current.sadd('unavailable_inboxes', @inbox_url) if reached_failure_threshold?
|
||
|
end
|
||
|
|
||
|
def track_success!
|
||
|
Redis.current.del(exhausted_deliveries_key)
|
||
|
Redis.current.srem('unavailable_inboxes', @inbox_url)
|
||
|
end
|
||
|
|
||
|
def days
|
||
|
Redis.current.scard(exhausted_deliveries_key) || 0
|
||
|
end
|
||
|
|
||
|
class << self
|
||
|
def filter(arr)
|
||
|
arr.reject(&method(:unavailable?))
|
||
|
end
|
||
|
|
||
|
def unavailable?(url)
|
||
|
Redis.current.sismember('unavailable_inboxes', url)
|
||
|
end
|
||
|
|
||
|
def available?(url)
|
||
|
!unavailable?(url)
|
||
|
end
|
||
|
|
||
|
def track_inverse_success!(from_account)
|
||
|
new(from_account.inbox_url).track_success! if from_account.inbox_url.present?
|
||
|
new(from_account.shared_inbox_url).track_success! if from_account.shared_inbox_url.present?
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def exhausted_deliveries_key
|
||
|
"exhausted_deliveries:#{@inbox_url}"
|
||
|
end
|
||
|
|
||
|
def today
|
||
|
Time.now.utc.strftime('%Y%m%d')
|
||
|
end
|
||
|
|
||
|
def reached_failure_threshold?
|
||
|
days >= FAILURE_DAYS_THRESHOLD
|
||
|
end
|
||
|
end
|