Module: Chatterbot::Client

Included in:
Bot
Defined in:
lib/chatterbot/client.rb

Overview

routines for connecting to Twitter and validating the bot

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#clientObject

the main interface to the Twitter API



14
15
16
# File 'lib/chatterbot/client.rb', line 14

def client
  @client
end

#screen_nameObject

Returns the value of attribute screen_name.



9
10
11
# File 'lib/chatterbot/client.rb', line 9

def screen_name
  @screen_name
end

Instance Method Details

#authenticated_userObject

return the currently authenticated User



21
22
23
# File 'lib/chatterbot/client.rb', line 21

def authenticated_user
  @user ||= client.user
end

#base_urlObject

the URL we should use for api calls



85
86
87
# File 'lib/chatterbot/client.rb', line 85

def base_url
  "https://api.twitter.com"
end

#consumerObject

simple OAuth client for setting up with Twitter



131
132
133
134
135
136
137
# File 'lib/chatterbot/client.rb', line 131

def consumer
  @consumer ||= OAuth::Consumer.new(
                      config[:consumer_key],
                      config[:consumer_secret],
                      :site => base_url
                      )
end

#default_optsObject

default options when querying twitter – this could be extended with a language, etc.



93
94
95
96
97
98
99
100
101
# File 'lib/chatterbot/client.rb', line 93

def default_opts
  opts = {
    :result_type => "recent"
  }
  opts[:since_id] = since_id if since_id > 0
  opts[:since_id_reply] = since_id_reply if since_id_reply > 0

  opts
end

#generate_authorize_url(request_token) ⇒ Object

copied from t, the awesome twitter cli app



143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/chatterbot/client.rb', line 143

def generate_authorize_url(request_token)
  request = consumer.create_signed_request(:get,
    consumer.authorize_path, request_token,
    {:oauth_callback => 'oob'})

  params = request['Authorization'].sub(/^OAuth\s+/, '').split(/,\s+/).map do |param|
    key, value = param.split('=')
    value =~ /"(.*?)"/
    "#{key}=#{CGI::escape($1)}"
  end.join('&')

  "#{base_url}#{request.path}?#{params}"
end

#get_screen_name(t = @access_token) ⇒ Object

query twitter for the bots screen name. we do this during the bot registration process



165
166
167
168
169
170
171
# File 'lib/chatterbot/client.rb', line 165

def get_screen_name(t = @access_token)
  return unless @screen_name.nil?
  return if t.nil?

  oauth_response = t.get('/1.1/account/verify_credentials.json')
  @screen_name = JSON.parse(oauth_response.body)["screen_name"]
end

#init_clientObject

Initialize the Twitter client, and check to see if it has credentials or not

Returns:

  • true/false depending on if client has OAuth credentials



107
108
109
# File 'lib/chatterbot/client.rb', line 107

def init_client
  client.credentials?
end

#login(do_update_config = true) ⇒ Object

handle oauth for this request. if the client isn’t authorized, print out the auth URL and get a pin code back from the user If do_update_config is false, don’t udpate the bots config file after authorization. This defaults to true but chatterbot-register will pass in false because it does some other work before saving.



180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
# File 'lib/chatterbot/client.rb', line 180

def (do_update_config=true)
  if needs_api_key?
    get_api_key
  end

  if needs_auth_token?
    pin = get_oauth_verifier
    return false if pin.nil?


    begin
      # this will throw an error that we can try and catch
      @access_token = request_token.get_access_token(:oauth_verifier => pin.chomp)
      get_screen_name

      self.config[:access_token] = @access_token.token
      self.config[:access_token_secret] = @access_token.secret

      #update_config unless ! do_update_config
      reset_client

    rescue OAuth::Unauthorized => e
      display_oauth_error
      warn e.inspect
      return false
    end
  end

  return true
end

#request_tokenObject

grab a OAuth request token



158
159
160
# File 'lib/chatterbot/client.rb', line 158

def request_token
  @request_token ||= consumer.get_request_token
end

#require_login(do_update_config = true) ⇒ Object

Call this before doing anything that requires an authorized Twitter connection.



121
122
123
124
# File 'lib/chatterbot/client.rb', line 121

def (do_update_config=true)
  init_client
  (do_update_config)
end

#reset!Object

reset a few tweet_id trackers



28
29
30
31
# File 'lib/chatterbot/client.rb', line 28

def reset!
  config[:since_id] = 1
  config[:since_id_reply] = 1
end

#reset_clientObject

Re-initialize with Twitter, handy during the auth process



113
114
115
116
# File 'lib/chatterbot/client.rb', line 113

def reset_client
  @client = nil
  init_client
end

#reset_since_idObject

reset the since_id for this bot to the highest since_id we can get, by running a really open search and updating config with the max_id



47
48
49
50
51
52
53
# File 'lib/chatterbot/client.rb', line 47

def reset_since_id
  config[:since_id] = 1
  # do a search of recent tweets with the letter 'a' in them to
  # get a rough max tweet id
  result = client.search("a", since:Time.now - 10).max_by(&:id)
  update_since_id(result)
end

#reset_since_id_countersObject

reset all since_id counters



34
35
36
37
38
39
40
# File 'lib/chatterbot/client.rb', line 34

def reset_since_id_counters
  reset!
  reset_since_id
  reset_since_id_reply
  reset_since_id_home_timeline
  reset_since_id_dm
end

#reset_since_id_dmObject

reset to the last DM received



75
76
77
78
79
# File 'lib/chatterbot/client.rb', line 75

def reset_since_id_dm
  config[:since_id_dm] = 0
  result = client.direct_messages_received.max_by(&:id)
  update_since_id_dm(result)
end

#reset_since_id_home_timelineObject

resets the home_timeline_id_reply for this bot to the last tweet on the timeline



68
69
70
71
72
# File 'lib/chatterbot/client.rb', line 68

def reset_since_id_home_timeline
  config[:since_id_reply] = 0
  result = client.home_timeline.max_by(&:id)
  update_since_id_home_timeline(result)
end

#reset_since_id_replyObject

resets the since_id_reply for this bot to the last mention received



58
59
60
61
62
# File 'lib/chatterbot/client.rb', line 58

def reset_since_id_reply
  config[:since_id_reply] = 0
  result = client.mentions_timeline.max_by(&:id)
  update_since_id_reply(result)
end