50 lines
972 B
Ruby
50 lines
972 B
Ruby
# frozen_string_literal: true
|
|
|
|
class TimeLimit
|
|
TIME_LIMIT_RE = /^exp(?<value>\d+)(?<unit>[mhd])$/
|
|
VALID_DURATION = (1.minute..7.days)
|
|
|
|
def self.from_tags(tags, created_at = Time.now.utc)
|
|
return unless tags
|
|
|
|
tags.map { |tag| new(tag.name, created_at) }.find(&:valid?)
|
|
end
|
|
|
|
def self.from_status(status)
|
|
return unless status
|
|
|
|
status = status.reblog if status.reblog?
|
|
return unless status.local?
|
|
|
|
from_tags(status.tags, status.created_at)
|
|
end
|
|
|
|
def initialize(name, created_at)
|
|
@name = name
|
|
@created_at = created_at
|
|
end
|
|
|
|
def valid?
|
|
VALID_DURATION.include?(to_duration)
|
|
end
|
|
|
|
def to_duration
|
|
matched = @name.match(TIME_LIMIT_RE)
|
|
return 0 unless matched
|
|
|
|
case matched[:unit]
|
|
when 'm'
|
|
matched[:value].to_i.minutes
|
|
when 'h'
|
|
matched[:value].to_i.hours
|
|
when 'd'
|
|
matched[:value].to_i.days
|
|
else
|
|
0
|
|
end
|
|
end
|
|
|
|
def to_datetime
|
|
@created_at + to_duration
|
|
end
|
|
end
|