lib/augury/fortune.rb in augury-0.2.1 vs lib/augury/fortune.rb in augury-0.3.0
- old
+ new
@@ -3,22 +3,23 @@
require 'twitter'
require 'wannabe_bool'
module Augury
class Fortune
- def initialize(username, path, width=nil, append=nil)
+ def initialize(username, path, width=nil, append=nil, count=nil)
begin
@config = ParseConfig.new(File.expand_path('~/.augury.cfg'))
rescue Errno::EACCES
@config = ParseConfig.new
end
augury_config = @config.params['augury'] || {}
@username = username
@path = path
- @width = width || augury_config['width'] || 72
- @append = append || augury_config['append'].to_b || false
+ @width = (width || augury_config['width'] || 72).to_i
+ @append = (append || augury_config['append'] || false).to_b
+ @count = (count || augury_config['count'] || 200).to_i
twitter_config = @config.params['twitter']
raise Augury::TwitterConfigError unless twitter_config
@twitter = Twitter::REST::Client.new do |config|
config.consumer_key = twitter_config['consumer_key']
@@ -26,30 +27,55 @@
config.access_token = twitter_config['access_token']
config.access_token_secret = twitter_config['access_token_secret']
end
end
- def tweet_texts
- @twitter.user_timeline(@username).flat_map { |tweet| tweet.full_text }
+ def collect_with_max_id(collection=[], max_id=nil, &block)
+ response = yield(max_id)
+ collection += response
+ if response.empty?
+ collection.flatten
+ elsif ! @count.zero? && collection.length >= @count
+ collection.flatten
+ else
+ collect_with_max_id(collection, response.last.id - 1, &block)
+ end
end
- def format_fortune(tweets)
- tweets.flat_map { |tweet| tweet.word_wrap(@width) }.join("%\n")
+ def tweets
+ begin
+ collect_with_max_id do |max_id|
+ options = {
+ count: @count.zero? ? 200 : @count,
+ include_rts: true,
+ }
+ options[:max_id] = max_id unless max_id.nil?
+ @twitter.user_timeline(@username, options)
+ end
+ rescue Twitter::Error::TooManyRequests => e
+ reset_length = e.rate_limit.reset_in + 1
+ puts "Twitter rate limit exceeded. Waiting #{reset_length} minute(s)"
+ sleep reset_length
+ end
end
- def write_fortune(text)
+ def format_fortune
+ tweet_texts = self.tweets.flat_map { |tweet| tweet.full_text }
+ tweet_texts.flat_map { |tweet| tweet.word_wrap(@width) }.join("%\n")
+ end
+
+ def write_fortune
+ text = self.format_fortune
# Write out the file
begin
mode = @append ? 'a' : 'w'
file = File.open(@path, mode)
file.write("%\n") if @append
file.write(text)
- rescue IOError => e
- puts e
ensure
file.close unless file.nil?
end
# Create the dat file too
- `strfile #{@path} #{@path}.dat`
+ `strfile '#{@path}' '#{@path}.dat'`
end
end
end