hyperoslo/mingle

View on GitHub
app/models/mingle/twitter/tweets_fetcher.rb

Summary

Maintainability
A
45 mins
Test Coverage
module Mingle::Twitter
  class TweetsFetcher
    def initialize(hashtag, options)
      @hashtag = hashtag
      @options = options
    end

    def fetch
      valid_tweets.each {|t| t.save! }
    end

    private

    attr_reader :hashtag, :options

    def valid_tweets
      tweets_for_hashtag.reject {|t| ignore? t}
    end

    def tweets_for_hashtag
      tweetdata_for_hashtag.collect do |data|
        Tweet.find_or_initialize_by(tweet_id: data.id.to_s).tap do |tweet|
          tweet.attributes = {
            created_at: data.created_at,
            image_url: data.media.any? ? data.media.first.media_url_https.to_s : nil,
            text: data.text,
            user_id: data.user.id.to_s,
            user_handle: data.user.screen_name,
            user_image_url: data.user.profile_image_url.to_s,
            # Twitter orignally only returns a small version of the profile image. 
            # by removing '_normal' at the end of the image link a large image is returned.
            remote_profile_picture_url: data.user.profile_image_url.to_s.gsub(/_normal/, ''),
            user_name: data.user.name
          }
          tweet.hashtags << hashtag unless tweet.hashtags.exists? hashtag
        end
      end
    end

    def tweetdata_for_hashtag
      client.search(query_string, options)
    end

    def ignore? tweet
      tweet.created_before?(Mingle.config.since)
    end

    def client
      Twitter::REST::Client.new do |config|
        config.consumer_key        = Mingle.config.twitter_api_key
        config.consumer_secret     = Mingle.config.twitter_api_secret
        config.access_token        = Mingle.config.twitter_access_token
        config.access_token_secret = Mingle.config.twitter_access_token_secret
      end
    end

    def query_string
      hashtag.tag_name_with_hash +
        rejected_words_string +
        rejected_users_string
    end

    def rejected_words_string
      Mingle.config.twitter_reject_words.map {|w| " -#{w}"}.join
    end

    def rejected_users_string
      Mingle.config.twitter_reject_users.map {|w| " -from:#{w}"}.join
    end
  end
end