Class: Beeline::Session

Inherits:
Object
  • Object
show all
Includes:
Config, Hive::Utils
Defined in:
lib/beeline/session.rb

Overview

Manages the http and websockets session for the bot. Also interacts with the http API.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Config

#friendships, #hive_account, #hive_posting_wif, #hive_public_key

Constructor Details

#initializeSession

Returns a new instance of Session.



17
18
19
20
21
22
# File 'lib/beeline/session.rb', line 17

def initialize
  @base_uri = nil
  @ws_uri = nil
  @beeline_session = nil
  @http = nil
end

Instance Attribute Details

#ws_sessionObject (readonly)

Returns the value of attribute ws_session.



15
16
17
# File 'lib/beeline/session.rb', line 15

def ws_session
  @ws_session
end

Instance Method Details

#base_uriObject



24
25
26
# File 'lib/beeline/session.rb', line 24

def base_uri
  @base_uri ||= URI.parse(BEE_BASE_URL)
end

#channelsObject

Returns an array of bot-created channels.

See: GET /users/channels



170
# File 'lib/beeline/session.rb', line 170

def channels; get('/users/channels'); end

#channels=(name) ⇒ Object

Creates a new channel.

See: POST /users/channels

Parameters:

  • name (String)


177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
# File 'lib/beeline/session.rb', line 177

def channels=(name)
  raise "Unable to post channels before logging in" unless !!@beeline_session
  
  resource = "#{base_uri.path}/users/channels"
  
  http do |http|
    request = Net::HTTP::Post.new resource
    request.body = name
    request['Content-Type'] = 'application/json; charset=UTF-8'
    request['User-Agent'] = AGENT_ID
    request['Authorization'] = "Bearer #{token}"
    response = http.request request
    
    JSON[response.body]
  end
end

#chats(id, before = nil, limit = nil) ⇒ Object

Query chat messages by id, \

See: GET /messages/chats



233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
# File 'lib/beeline/session.rb', line 233

def chats(id, before = nil, limit = nil)
  raise "Unable to get conversation before logging in" unless !!@beeline_session
  
  resource = "#{base_uri.path}/messages/chats?conversation_id=#{id}"
  resource += "&before=#{before.utc.iso8601}" if !!before
  resource += "&limit=#{limit}" if !!limit
  
  http do |http|
    request = Net::HTTP::Get.new resource
    request['User-Agent'] = AGENT_ID
    request['Authorization'] = "Bearer #{token}"
    response = http.request request
    
    JSON[response.body]
  end
end

#conversation(*id) ⇒ Object

Returns details of a conversation.

See: GET /messages/conversation

Parameters:

  • id (String)

    (or Array<String>) Conversation id or array of ids.



209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'lib/beeline/session.rb', line 209

def conversation(*id)
  raise "Unable to get conversation before logging in" unless !!@beeline_session
  
  id = [id].flatten
  resource = "#{base_uri.path}/messages/conversation?ids=#{id.join(',')}"
  
  http do |http|
    request = Net::HTTP::Get.new resource
    request['User-Agent'] = AGENT_ID
    request['Authorization'] = "Bearer #{token}"
    response = http.request request
    
    JSON[response.body]
  end
end

#conversationsObject

Returns details of a conversation.

See: GET /messages/conversation



202
# File 'lib/beeline/session.rb', line 202

def conversations; get('/messages/conversations'); end

#dump_conversationsObject

Calls #new_conversations and dumps all messages.



252
253
254
# File 'lib/beeline/session.rb', line 252

def dump_conversations
  new_conversations.map{|c| "#{c['timestamp']} :: #{c['conversation_id']} :: #{c['from']}: #{c['content']}"}
end

#friend_requestsObject

Returns an array of bot’s pending friend requests.

See: GET /users/friend-requests



136
# File 'lib/beeline/session.rb', line 136

def friend_requests; get('/users/friend-requests'); end

#friendsObject

Returns bot’s friends and blocked list.

See: GET /users/friends



131
# File 'lib/beeline/session.rb', line 131

def friends; get('/users/friends'); end

#get(resource) ⇒ Object

Generalized get method.

Parameters:

  • resource (String)

    Resource to get, including query parameters.



113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/beeline/session.rb', line 113

def get(resource)
  raise "Unable to request #{resource} before logging in" unless !!@beeline_session
  
  resource = "#{base_uri.path}#{resource}"
  
  http do |http|
    request = Net::HTTP::Get.new resource
    request['User-Agent'] = AGENT_ID
    request['Authorization'] = "Bearer #{token}"
    response = http.request request
    
    JSON[response.body]
  end
end

#http(&block) ⇒ Object



40
41
42
43
44
# File 'lib/beeline/session.rb', line 40

def http(&block)
  Net::HTTP.start(base_uri.host, base_uri.port, use_ssl: base_uri.scheme == 'https') do |http|
    yield http
  end
end

#inspectObject



256
257
258
259
260
261
262
263
264
265
266
267
# File 'lib/beeline/session.rb', line 256

def inspect
  properties = %w(base_uri ws_uri ws_session).map do |prop|
    if !!(v = instance_variable_get("@#{prop}"))
      case v
      when Array then "@#{prop}=<#{v.size} #{v.size == 1 ? 'element' : 'elements'}>" 
      else; "@#{prop}=#{v}" 
      end
    end
  end.compact.join(', ')
  
  "#<#{self.class} [#{properties}]>"
end

#loginObject

Logs in the bot.

See: GET /users/login



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/beeline/session.rb', line 49

def 
  return @beeline_session if !!@beeline_session
  
  timestamp = (Time.now.to_f * 1000).to_i
  message = "#{}#{timestamp}"
  signature = hexlify sign_message message
  resource = "#{base_uri.path}/users/login?username=#{}&ts=#{timestamp}&sig=#{signature}"
  
  http do |http|
    request = Net::HTTP::Get.new resource
    request['User-Agent'] = AGENT_ID
    response = http.request request
    
    if response.code == '200'
      @beeline_session = JSON[response.body]
    else
      JSON[response.body]
    end
  end
end

#logoutObject

Logs out the bot.

See: GET /users/logout



197
# File 'lib/beeline/session.rb', line 197

def logout; get('/users/logout'); end

#new_conversationsObject

Return an array of unread messages.

See: GET /messages/new



228
# File 'lib/beeline/session.rb', line 228

def new_conversations; get('/messages/new'); end

#refresh_tokenObject

Requests a new access token.

See: GET /users/refresh-token



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/beeline/session.rb', line 91

def refresh_token
  raise "Unable to refresh token before logging in" unless !!@beeline_session
  
  resource = "#{base_uri.path}/refresh-token"
  
  http do |http|
    request = Net::HTTP::Get.new resource
    request['User-Agent'] = AGENT_ID
    request['Authorization'] = "Bearer #{@beeline_session['refresh_token']}"
    response = http.request request
    
    if response.code == '200'
      @beeline_session['token'] = JSON[response.body]['token']
    else
      JSON[response.body]
    end
  end
end

#settingsObject

Returns bot’s settings.

See: GET /users/settings



141
# File 'lib/beeline/session.rb', line 141

def settings; get('/users/settings'); end

#settings=(new_settings) ⇒ Object

Updates the bot’s settings.

See: POST /users/settings

Parameters:

  • new_settings (Hash)

Options Hash (new_settings):

  • :dm (Hash)
    • :only_from_friends (Boolean) Only allow direct messages from friends.



150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/beeline/session.rb', line 150

def settings=(new_settings)
  raise "Unable to post settings before logging in" unless !!@beeline_session
  
  resource = "#{base_uri.path}/users/settings"
  
  http do |http|
    request = Net::HTTP::Post.new resource
    request.body = new_settings.to_json
    request['Content-Type'] = 'application/json; charset=UTF-8'
    request['User-Agent'] = AGENT_ID
    request['Authorization'] = "Bearer #{token}"
    response = http.request request
    
    JSON[response.body]
  end
end

#tokenObject



32
33
34
35
36
37
38
# File 'lib/beeline/session.rb', line 32

def token
   if @beeline_session.nil?
  
  return if @beeline_session.nil?
  
  @beeline_session['token']
end

#verifyObject

Verifies if the current access token is valid.

See: GET /users/verify



73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/beeline/session.rb', line 73

def verify
  raise "Unable to verify before logging in" unless !!@beeline_session
  
  resource = "#{base_uri.path}/users/verify"
  
  http do |http|
    request = Net::HTTP::Get.new resource
    request['User-Agent'] = AGENT_ID
    request['Authorization'] = "Bearer #{token}"
    response = http.request request
    
    JSON[response.body]
  end
end

#ws_uriObject



28
29
30
# File 'lib/beeline/session.rb', line 28

def ws_uri
  @ws_uri ||= URI.parse(BEE_WS_URL)
end