class Beeline::Session

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

Attributes

ws_session[R]

Public Class Methods

new() click to toggle source
# File lib/beeline/session.rb, line 17
def initialize
  @base_uri = nil
  @ws_uri = nil
  @beeline_session = nil
  @http = nil
end

Public Instance Methods

base_uri() click to toggle source
# File lib/beeline/session.rb, line 24
def base_uri
  @base_uri ||= URI.parse(BEE_BASE_URL)
end
channels() click to toggle source

Returns an array of bot-created channels.

See: {github.com/hive-engine/beechat-frontend/blob/master/DOCUMENTATION.md#get-userschannels GET /users/channels}

# File lib/beeline/session.rb, line 170
def channels; get('/users/channels'); end
channels=(name) click to toggle source

Creates a new channel.

See: {github.com/hive-engine/beechat-frontend/blob/master/DOCUMENTATION.md#post-userschannels POST /users/channels}

@param name [String]

# 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) click to toggle source

Query chat messages by id, \

See: {github.com/hive-engine/beechat-frontend/blob/master/DOCUMENTATION.md#get-messageschats GET /messages/chats}

# 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) click to toggle source

Returns details of a conversation.

See: {github.com/hive-engine/beechat-frontend/blob/master/DOCUMENTATION.md#get-messagesconversation GET /messages/conversation}

@param id [String] (or Array<String>) Conversation id or array of ids.

# 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
conversations() click to toggle source

Returns details of a conversation.

See: {github.com/hive-engine/beechat-frontend/blob/master/DOCUMENTATION.md#get-messagesconversation GET /messages/conversation}

# File lib/beeline/session.rb, line 202
def conversations; get('/messages/conversations'); end
dump_conversations() click to toggle source

Calls new_conversations and dumps all messages.

# 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_requests() click to toggle source

Returns an array of bot's pending friend requests.

See: {github.com/hive-engine/beechat-frontend/blob/master/DOCUMENTATION.md#get-usersfriend-requests GET /users/friend-requests}

# File lib/beeline/session.rb, line 136
def friend_requests; get('/users/friend-requests'); end
friends() click to toggle source

Returns bot's friends and blocked list.

See: {github.com/hive-engine/beechat-frontend/blob/master/DOCUMENTATION.md#get-usersfriends GET /users/friends}

# File lib/beeline/session.rb, line 131
def friends; get('/users/friends'); end
get(resource) click to toggle source

Generalized get method.

@param resource [String] Resource to get, including query parameters.

# 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() { |http| ... } click to toggle source
# 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
inspect() click to toggle source
# 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
login() click to toggle source

Logs in the bot.

See: {github.com/hive-engine/beechat-frontend/blob/master/DOCUMENTATION.md#get-userslogin GET /users/login}

# File lib/beeline/session.rb, line 49
def login
  return @beeline_session if !!@beeline_session
  
  timestamp = (Time.now.to_f * 1000).to_i
  message = "#{hive_account}#{timestamp}"
  signature = hexlify sign_message message
  resource = "#{base_uri.path}/users/login?username=#{hive_account}&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
logout() click to toggle source

Logs out the bot.

See: {github.com/hive-engine/beechat-frontend/blob/master/DOCUMENTATION.md#get-userslogout GET /users/logout}

# File lib/beeline/session.rb, line 197
def logout; get('/users/logout'); end
new_conversations() click to toggle source

Return an array of unread messages.

See: {github.com/hive-engine/beechat-frontend/blob/master/DOCUMENTATION.md#get-messagesnew GET /messages/new}

# File lib/beeline/session.rb, line 228
def new_conversations; get('/messages/new'); end
refresh_token() click to toggle source

Requests a new access token.

See: {github.com/hive-engine/beechat-frontend/blob/master/DOCUMENTATION.md#get-usersrefresh-token GET /users/refresh-token}

# 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
settings() click to toggle source

Returns bot's settings.

See: {github.com/hive-engine/beechat-frontend/blob/master/DOCUMENTATION.md#get-userssettings GET /users/settings}

# File lib/beeline/session.rb, line 141
def settings; get('/users/settings'); end
settings=(new_settings) click to toggle source

Updates the bot's settings.

See: {github.com/hive-engine/beechat-frontend/blob/master/DOCUMENTATION.md#post-userssettings POST /users/settings}

@param new_settings [Hash] @option new_settings [Hash] :dm

* :only_from_friends (Boolean) Only allow direct messages from friends.
# 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
token() click to toggle source
# File lib/beeline/session.rb, line 32
def token
  login if @beeline_session.nil?
  
  return if @beeline_session.nil?
  
  @beeline_session['token']
end
verify() click to toggle source

Verifies if the current access token is valid.

See: {github.com/hive-engine/beechat-frontend/blob/master/DOCUMENTATION.md#get-usersverify GET /users/verify}

# 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_uri() click to toggle source
# File lib/beeline/session.rb, line 28
def ws_uri
  @ws_uri ||= URI.parse(BEE_WS_URL)
end

Private Instance Methods

sign_message(message) click to toggle source

@private

# File lib/beeline/session.rb, line 270
def sign_message(message)
  digest_hex = Digest::SHA256.digest(message)
  private_key = Bitcoin::Key.from_base58 hive_posting_wif
  public_key = Bitcoin.decode_base58(hive_public_key[3..-1])[0..65]
  
  Bitcoin::OpenSSL_EC.sign_compact(digest_hex, private_key.priv, public_key, true)
end