Class: Augury::Fortune

Inherits:
Object
  • Object
show all
Defined in:
lib/augury/fortune.rb

Instance Method Summary collapse

Constructor Details

#initialize(username, path, config) ⇒ Fortune

Returns a new instance of Fortune.



9
10
11
12
13
14
# File 'lib/augury/fortune.rb', line 9

def initialize(username, path, config)
  @username = username
  @path = path
  @config = config
  @tweets = []
end

Instance Method Details

#collect_with_max_id(collection = [], max_id = nil, &block) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/augury/fortune.rb', line 16

def collect_with_max_id(collection = [], max_id = nil, &block)
  response = yield(max_id)
  collection += response
  if response.empty?
    collection
  elsif !@config[:count].zero? && collection.length >= @config[:count]
    # Get everything or trim the results to the count
    @config[:count].zero? ? collection : collection[0..@config[:count] - 1]
  else
    collect_with_max_id(collection, response.last.id - 1, &block)
  end
end

#format_fortuneObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/augury/fortune.rb', line 49

def format_fortune
  filtered = @tweets.flat_map(&:full_text).reject do |tweet|
    tweet.match(/https?:/) unless @config[:links]
  end
  to_transform = transforms
  formatted = filtered.flat_map do |tweet|
    text = CGI.unescapeHTML(tweet)
    to_transform.each do |transform|
      text.gsub!(transform[0], transform[1])
    end
    WordWrap.ww text, @config.fetch(:width, 72)
  end
  author = @config[:attribution] ? "\n-- #{@twitter.user(@username).name}\n" : ''
  text = formatted.join("#{author}%\n")
  text + author if author
end

#retrieve_tweetsObject



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/augury/fortune.rb', line 29

def retrieve_tweets
  # Make sure the case of the name is correct to avoid errors in the Twitter API
  screen_name = @twitter.user(@username).screen_name

  @tweets = collect_with_max_id do |max_id|
    options = {
      count: 200,
      tweet_mode: 'extended',
      include_rts: @config[:retweets],
      exclude_replies: !@config[:replies],
    }
    options[:max_id] = max_id unless max_id.nil?
    @twitter.user_timeline(screen_name, 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

#twitter_setupObject



80
81
82
83
84
85
86
87
88
89
# File 'lib/augury/fortune.rb', line 80

def twitter_setup
  raise Augury::TwitterConfigError unless @config[:twitter]

  @twitter = Twitter::REST::Client.new do |cfg|
    cfg.consumer_key = @config[:twitter]['consumer_key']
    cfg.consumer_secret = @config[:twitter]['consumer_secret']
    cfg.access_token = @config[:twitter]['access_token']
    cfg.access_token_secret = @config[:twitter]['access_token_secret']
  end
end

#write_fortuneObject



66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/augury/fortune.rb', line 66

def write_fortune
  # Write out the file
  begin
    mode = @config[:append] ? 'a' : 'w'
    file = File.open(@path, mode)
    file.write("%\n") if @config[:append]
    file.write(format_fortune)
  ensure
    file&.close
  end
  # Create the dat file too
  `strfile '#{@path}' '#{@path}.dat'`
end