class Ruboty::Tweets::Stream

Public Class Methods

new(robot) click to toggle source
# File lib/ruboty/tweets/stream.rb, line 7
def initialize(robot)
  TweetStream.configure do |config|
    config.consumer_key       = CONSUMER_KEY
    config.consumer_secret    = CONSUMER_SECRET
    config.oauth_token        = ACCESS_TOKEN
    config.oauth_token_secret = ACCESS_TOKEN_SECRET
    config.auth_method        = :oauth
  end

  @robot  = robot
  @client = TweetStream::Client.new

  @client.on_inited do
    log(:info , "Connected to twitter stream.")

    # Every day reconnect the stream to prevent from shutdown.
    EM::PeriodicTimer.new(60 * 60 * 24) do
      @client.stream.immediate_reconnect
    end
  end

  @client.on_reconnect do |timeout, retrial|
    log(:info , "Reconnected to twitter stream: #{timeout} sec.")
  end

  @client.on_error do |message|
    log(:error, message)
  end
end

Public Instance Methods

rest() click to toggle source
# File lib/ruboty/tweets/stream.rb, line 56
def rest
  @rest ||= Twitter::REST::Client.new do |config|
    config.consumer_key        = CONSUMER_KEY
    config.consumer_secret     = CONSUMER_SECRET
    config.access_token        = ACCESS_TOKEN
    config.access_token_secret = ACCESS_TOKEN_SECRET
  end
end
start(users) click to toggle source
# File lib/ruboty/tweets/stream.rb, line 37
def start(users)
  return if users.empty?

  Thread.start do
    @client.follow(*q(users)) do |object|
      if userinfo = users[object.user.screen_name]
        message = Message.new(userinfo[:message].merge(robot: @robot))
        message.reply(u(object))
      end
    end
  end
end
update(users) click to toggle source
# File lib/ruboty/tweets/stream.rb, line 50
def update(users)
  return start(users) unless @client.stream

  @client.stream.update(params: {:follow => q(users)})
end

Private Instance Methods

log(level, message) click to toggle source
# File lib/ruboty/tweets/stream.rb, line 74
def log(level, message)
  Ruboty.logger.send(level, "[#{Time.now}] ruboty-tweets: #{message}")
end
q(users) click to toggle source
# File lib/ruboty/tweets/stream.rb, line 66
def q(users)
  users.values.map { |userinfo| userinfo[:twitter_id] }
end
u(object) click to toggle source
# File lib/ruboty/tweets/stream.rb, line 70
def u(object)
  "https://twitter.com/#{object.user.screen_name}/status/#{object.id}"
end