123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- 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
|