class Lita::Adapters::Twitter::Connector

Attributes

rest_client[R]
robot[R]
streaming_client[R]

Public Class Methods

new(robot, api_key: nil, api_secret: nil, access_token: nil, access_token_secret: nil) click to toggle source
# File lib/lita/adapters/twitter/connector.rb, line 7
def initialize(robot, api_key: nil, api_secret: nil, access_token: nil, access_token_secret: nil)
  @robot = robot
  @streaming_client = ::Twitter::Streaming::Client.new do |config|
    config.consumer_key        = api_key
    config.consumer_secret     = api_secret
    config.access_token        = access_token
    config.access_token_secret = access_token_secret
  end

  @rest_client = ::Twitter::REST::Client.new do |config|
    config.consumer_key        = api_key
    config.consumer_secret     = api_secret
    config.access_token        = access_token
    config.access_token_secret = access_token_secret
  end
end

Public Instance Methods

connect() click to toggle source
# File lib/lita/adapters/twitter/connector.rb, line 25
def connect
  streaming_client.user do |object|
    case object
    when ::Twitter::Tweet
      tweet = object
      if tweet.user.screen_name != robot.name
        text = tweet.text.dup
        mention = false
        if text.match(/\A@#{robot.name} /)
          text.gsub!(/\A@#{robot.name} /, '')
          mention = true
        end
        user    = User.new(tweet.user.id, name: tweet.user.screen_name, mention: mention)
        source  = Source.new(user: user, room: tweet.id.to_s)
        message = Message.new(robot, text, source)
        message.command! if mention
        robot.receive(message)
      end
    when ::Twitter::DirectMessage
      dm = object
      dm.text
      if dm.sender.screen_name != robot.name
        user    = User.new(dm.sender.id, name: dm.sender.screen_name)
        source  = Source.new(user: user)
        message = Message.new(robot, dm.text.dup, source)
        message.command!
        robot.receive(message)
      end
    when ::Twitter::Streaming::Event
      event = object
      on_streaming_event(event) if event.source.screen_name != robot.name
    end
  end
end
join(user) click to toggle source
# File lib/lita/adapters/twitter/connector.rb, line 82
def join(user)
  rest_client.follow(user)
end
message(target, strings) click to toggle source
# File lib/lita/adapters/twitter/connector.rb, line 60
def message(target, strings)
  tries = 0
  text  = strings.join("\n")[0...137]
  begin
    if target.private_message
      rest_client.create_direct_message(target.user.name, text)
    elsif target.user
      rest_client.update(text, in_reply_to_status_id: target.room)
    else
      rest_client.update(text)
    end
  rescue ::Twitter::Error::DuplicateStatus => e
    tries += 1
    text  += "⠀" #U+2800
    retry if tries <= 3
  end
end
part(user) click to toggle source
# File lib/lita/adapters/twitter/connector.rb, line 86
def part(user)
  rest_client.unfollow(user)
end
update_name(name) click to toggle source
# File lib/lita/adapters/twitter/connector.rb, line 78
def update_name(name)
  rest_client.update_profile(name: topic)
end

Private Instance Methods

on_streaming_event(event) click to toggle source
# File lib/lita/adapters/twitter/connector.rb, line 91
def on_streaming_event(event)
  # see: https://dev.twitter.com/docs/streaming-apis/messages

  user = User.new(event.source.id, name: event.source.screen_name)
  case event.name
  when :favorite
    robot.trigger(:favorited, user: user, tweet: event.target_object)
  when :unfavorite
    robot.trigger(:unfavorited, user: user, tweet: event.target_object)
  when :follow
    robot.trigger(:followed, user: user)
  end
end