app/models/agents/tumblr_likes_agent.rb
module Agents
class TumblrLikesAgent < Agent
include TumblrConcern
gem_dependency_check { defined?(Tumblr::Client) }
description <<~MD
The Tumblr Likes Agent checks for liked Tumblr posts from a specific blog.
#{'## Include `tumblr_client` and `omniauth-tumblr` in your Gemfile to use this Agent!' if dependencies_missing?}
To be able to use this Agent you need to authenticate with Tumblr in the [Services](/services) section first.
**Required fields:**
`blog_name` The Tumblr URL you're querying (e.g. "staff.tumblr.com")
Set `expected_update_period_in_days` to the maximum amount of time that you'd expect to pass between Events being created by this Agent.
MD
default_schedule 'every_1h'
def validate_options
errors.add(:base, 'blog_name is required') unless options['blog_name'].present?
errors.add(:base,
'expected_update_period_in_days is required') unless options['expected_update_period_in_days'].present?
end
def working?
event_created_within?(options['expected_update_period_in_days']) && !recent_error_logs?
end
def default_options
{
'expected_update_period_in_days' => '10',
'blog_name' => 'someblog',
}
end
def check
memory[:ids] ||= []
memory[:last_liked] ||= 0
# Request Likes of blog_name after the last stored timestamp (or default of 0)
liked = tumblr.blog_likes(options['blog_name'], after: memory[:last_liked])
if liked['liked_posts']
# Loop over all liked posts which came back from Tumblr, add to memory, and create events.
liked['liked_posts'].each do |post|
next if memory[:ids].include?(post['id'])
memory[:ids].push(post['id'])
memory[:last_liked] = post['liked_timestamp'] if post['liked_timestamp'] > memory[:last_liked]
create_event(payload: post)
end
elsif liked['status'] && liked['msg']
# If there was a problem fetching likes (like 403 Forbidden or 404 Not Found) create an error message.
error "Error finding liked posts for #{options['blog_name']}: #{liked['status']} #{liked['msg']}"
end
# Store only the last 50 (maximum the API will return) IDs in memory to prevent performance issues.
memory[:ids] = memory[:ids].last(50) if memory[:ids].length > 50
end
end
end