This handy little bot keeps track of RSS feeds, and announces in the channel when one is updated. (note: be sure to edit the path to the datafiles) Each poller runs inside its own ruby thread, and can be run on its own independent schedule
require 'thread'
require 'rss/1.0'
require 'rss/2.0'
require 'open-uri'
require 'fileutils'
require 'digest/md5'
class Feeder < AutumnLeaf
def watch_feed(url, title, sleepfor=300)
message "Watching (#{title}) [#{url}] every #{sleepfor} seconds"
feedid = Digest::MD5.hexdigest(title)
Thread.new {
while true
begin
content = ""
open(url) { |s|
content = s.read
}
rss = RSS::Parser.parse(content, false)
rss.items.each { |entry|
digest = Digest::MD5.hexdigest(entry.title)
if !File.exist?("/tmp/.rss.#{feedid}.#{digest}")
FileUtils.touch("/tmp/.rss.#{feedid}.#{digest}")
message "#{entry.title} (#{title}) #{entry.link}"
end
sleep(2)
}
rescue
sleep(2)
end
sleep(sleepfor)
end
}
sleep(1)
end
def did_start_up
watch_feed("http://planet.wordpress.org/rss20.xml", "planet", 600)
watch_feed("http://wordpress.com/feed/", "wpcom", 300)
end
end