mirror of
https://github.com/codeninjasllc/discourse.git
synced 2024-11-24 16:18:42 -05:00
52 lines
1.4 KiB
Ruby
52 lines
1.4 KiB
Ruby
#
|
|
# Creates and Updates Topics based on an RSS or ATOM feed.
|
|
#
|
|
require 'digest/sha1'
|
|
require_dependency 'post_creator'
|
|
require_dependency 'post_revisor'
|
|
|
|
module Jobs
|
|
class PollFeed < Jobs::Scheduled
|
|
recurrence { hourly }
|
|
sidekiq_options retry: false
|
|
|
|
def execute(args)
|
|
poll_feed if SiteSetting.feed_polling_enabled? &&
|
|
SiteSetting.feed_polling_url.present? &&
|
|
SiteSetting.embed_by_username.present?
|
|
end
|
|
|
|
def feed_key
|
|
@feed_key ||= "feed-modified:#{Digest::SHA1.hexdigest(SiteSetting.feed_polling_url)}"
|
|
end
|
|
|
|
def poll_feed
|
|
user = User.where(username_lower: SiteSetting.embed_by_username.downcase).first
|
|
return if user.blank?
|
|
|
|
fetch_opts = {}
|
|
|
|
last_modified = $redis.get(feed_key)
|
|
if last_modified.present?
|
|
fetch_opts[:if_modified_since] = Time.parse(last_modified)
|
|
end
|
|
|
|
require 'feedzirra'
|
|
feed = Feedzirra::Feed.fetch_and_parse(SiteSetting.feed_polling_url, fetch_opts)
|
|
|
|
if feed.respond_to?(:entries)
|
|
feed.entries.each do |e|
|
|
url = e.url
|
|
url = e.id if url.blank? || url !~ /^https?\:\/\//
|
|
TopicEmbed.import(user, url, e.title, e.content)
|
|
end
|
|
|
|
# Store last modified for faster requests from feeds
|
|
$redis.set(feed_key, feed.last_modified)
|
|
|
|
false
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|