class Ruboty::Handlers::Rss

Constants

DEFAULT_INTERVAL
NAMESPACE

Public Class Methods

new(*args) click to toggle source
Calls superclass method
# File lib/ruboty/handlers/rss.rb, line 13
def initialize(*args)
  super(*args)
  load_feeds
  start_watching
end

Public Instance Methods

list(message) click to toggle source
# File lib/ruboty/handlers/rss.rb, line 45
def list(message)
  list = feeds.each_value.reject do |feed|
    feed.from && message.from && feed.from != message.from
  end.map do |feed|
    "#{feed.id}: #{feed.url}"
  end
  if list.empty?
    message.reply("No RSS feed")
  else
    message.reply(list.join("\n"))
  end
end
subscribe(message) click to toggle source
# File lib/ruboty/handlers/rss.rb, line 19
def subscribe(message)
  urls = message[:urls].split(' ')
  urls.each do |url|
    feed = Ruboty::Rss::Feed.new(
      message.original.except(:robot).merge(
        id: generate_id,
        url: url,
      )
    )

    feeds[feed.id] = feed
    feed_data[feed.id] = feed.attributes
  end

  message.reply("#{urls.size} feed(s) subscribed.")
end
unsubscribe(message) click to toggle source
# File lib/ruboty/handlers/rss.rb, line 36
def unsubscribe(message)
  id = message[:id].to_i

  feeds.delete(id)
  feed_data.delete(id)

  message.reply("Unsubscribed.")
end

Private Instance Methods

debug(str) click to toggle source
# File lib/ruboty/handlers/rss.rb, line 101
def debug(str)
  Ruboty.logger.debug("[#{Time.now.to_s}] ruboty-rss: #{str}")
end
feed_data() click to toggle source
# File lib/ruboty/handlers/rss.rb, line 59
def feed_data
  robot.brain.data[NAMESPACE] ||= {}
end
feeds() click to toggle source
# File lib/ruboty/handlers/rss.rb, line 63
def feeds
  @feeds ||= {}
end
generate_id() click to toggle source
# File lib/ruboty/handlers/rss.rb, line 92
def generate_id
  begin
    id = rand(1000)
  end while feeds.has_key?(id)
  id
end
load_feeds() click to toggle source
# File lib/ruboty/handlers/rss.rb, line 67
def load_feeds
  feed_data.each_pair do |id, datum|
    feed = Ruboty::Rss::Feed.new(datum)
    feeds[feed.id] = feed
  end
end
start_watching() click to toggle source
# File lib/ruboty/handlers/rss.rb, line 74
def start_watching
  Thread.start do
    while true
      feeds.each_pair do |id, feed|
        debug "Fetching RSS feed (#{feed.url})"
        feed.new_items.each do |item|
          debug "New item found (#{item.title} / #{item.link})"
          body = "New Entry: #{item.title}\n#{item.link}"
          Message.new(
            feed.attributes.symbolize_keys.except(:url, :id).merge(robot: robot)
          ).reply(body)
        end
      end
      sleep (ENV["RUBOTY_RSS_INTERVAL"] || DEFAULT_INTERVAL).to_i
    end
  end
end