Class: OBarc::Session

Inherits:
Object
  • Object
show all
Defined in:
lib/obarc/session.rb

Constant Summary collapse

OPTIONS_KEYS =
protocol server_host server_port api_version username
password base_url logger cookies verify_ssl
DEFAULT_OPTIONS =
{
  protocol: 'http',
  server_host: 'localhost',
  server_port: '18469',
  api_version: 'v1',
  verify_ssl: true
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Session

Returns a new instance of Session.


21
22
23
24
25
26
27
28
29
# File 'lib/obarc/session.rb', line 21

def initialize(options = {})
  OPTIONS_KEYS.each do |k|
    instance_variable_set "@#{k}".to_sym, options[k] || DEFAULT_OPTIONS[k]
  end
  
  @base_url ||= base_url
  @logger ||= logger
  @cookies ||= Api::(self).cookies
end

Instance Attribute Details

#base_urlObject


31
32
33
# File 'lib/obarc/session.rb', line 31

def base_url
  @base_url ||= "#{@protocol}://#{@server_host}:#{@server_port}/api/#{@api_version}"
end

#cookiesObject

Returns the value of attribute cookies


10
11
12
# File 'lib/obarc/session.rb', line 10

def cookies
  @cookies
end

#loggerObject


35
36
37
# File 'lib/obarc/session.rb', line 35

def logger
  @logger ||= Logging.logger(STDOUT)
end

#passwordObject

Returns the value of attribute password


10
11
12
# File 'lib/obarc/session.rb', line 10

def password
  @password
end

#usernameObject

Returns the value of attribute username


10
11
12
# File 'lib/obarc/session.rb', line 10

def username
  @username
end

#verify_sslObject

Returns the value of attribute verify_ssl


10
11
12
# File 'lib/obarc/session.rb', line 10

def verify_ssl
  @verify_ssl
end

Instance Method Details

#add_social_account(social_account = {}) ⇒ Hash

Adds a social account to the user profile data of the user.

Parameters:

  • social_account (Hash) (defaults to: {})

    e.g.: account_type: 'TWITTER', username: '@inertia186'

Returns:

  • (Hash)

    containing: “success” => true or false

See Also:


185
# File 'lib/obarc/session.rb', line 185

def ( = {}); JSON[Api::post_social_accounts(, self)]; end

#broadcast(message = {}) ⇒ Hash

Sends some kind of “Twitter-like” message to all nodes that are following you. This call can take a while to complete.

Returns:

  • (Hash)

    containing:

    • “success” => true or false

    • “peers_reached” => [number reached]

See Also:


436
# File 'lib/obarc/session.rb', line 436

def broadcast(message = {}); JSON[Api::post_broadcast(message, self)]; end

#btc_priceHash

Undocumented

Returns:

  • (Hash)

441
# File 'lib/obarc/session.rb', line 441

def btc_price; JSON[Api::get_btc_price(self)]; end

#casesHash

Undocumented

Returns:

  • (Hash)

408
# File 'lib/obarc/session.rb', line 408

def cases; JSON[Api::get_cases(self)]; end

#chat_conversationsHash

Retreives a list of outstandng conversations.


381
# File 'lib/obarc/session.rb', line 381

def chat_conversations; JSON[Api::get_chat_conversations(self)]; end

#chat_messages(chat_messages = {}) ⇒ Hash

Retrieves all chat message received from other nodes.

Parameters:

  • chat_messages (Hash) (defaults to: {})

    containing:

    • guid [String] target node, required

    • limit [Integer] max number of chat messages to return (ignored)

    • start [FIXME] the starting point in the message list

Returns:

  • (Hash)

See Also:


375
# File 'lib/obarc/session.rb', line 375

def chat_messages(chat_messages = {}); JSON[Api::get_chat_messages(chat_messages, self)]; end

#check_for_payment(check_for_payment) ⇒ Hash

Sends a Twitter-like message to all nodes that are following you.

Parameters:

  • check_for_payment (Hash)

    containing:

    • order_id [Integer]

Returns:

  • (Hash)

    containing:

    • “success” => true or false

See Also:


464
# File 'lib/obarc/session.rb', line 464

def check_for_payment(check_for_payment); JSON[Api::post_check_for_payment(check_for_payment, self)]; end

#close_dispute(close_dispute = nil) ⇒ Hash

Undocumented

Parameters:

  • dispute_contract (Hash)

    containing:

    • order_id [Integer]

    • resolution [String]

    • buyer_percentage [Float]

    • vendor_percentage [Float]

    • moderator_percentage [Float]

    • moderator_address [String]

Returns:

  • (Hash)

483
# File 'lib/obarc/session.rb', line 483

def close_dispute(close_dispute = nil); JSON[Api::post_close_dispute(close_dispute, self)]; end

#complete_order(complete_order = {}) ⇒ Hash

Sends a message with a partially signed transaction releasing funds from escrow to the Vendor as well as review data.

Parameters:

  • complete_order (Hash) (defaults to: {})

Returns:

  • (Hash)

    containing: “success” => true or false

See Also:


336
# File 'lib/obarc/session.rb', line 336

def complete_order(complete_order = {}); JSON[Api::post_complete_order(complete_order, self)]; end

#confirm_order(confirm_order = {}) ⇒ Hash

Sends the order confirmation and shipping information to the Buyer. If he’s offline, it will embed this data into the dht. The API call also updates the status of the order in the database.

Parameters:

  • confirm_order (Hash) (defaults to: {})

Returns:

  • (Hash)

    containing: “success” => true or false

See Also:


316
# File 'lib/obarc/session.rb', line 316

def confirm_order(confirm_order = {}); JSON[Api::post_confirm_order(confirm_order, self)]; end

#connected_peersHash

Undocumented

Returns:

  • (Hash)

354
# File 'lib/obarc/session.rb', line 354

def connected_peers; JSON[Api::get_connected_peers(self)]; end

#contracts(contracts = {}) ⇒ Hash

Retrieves the listings created by either your node or a target node.

Parameters:

  • contracts (Hash) (defaults to: {})

    containing the:

    • id: Unique identifier of the contract SHA256 of the JSON formatted contract (40 character hex string), required

    • guid: GUID of the node if the call is made to a target node. If omitted, the API will search for a contract ID created by your own node

Returns:

  • (Hash)

See Also:


199
# File 'lib/obarc/session.rb', line 199

def contracts(contracts = {}); JSON[Api::get_contracts(contracts, self)]; end

#create_contract(contract = {}) ⇒ Hash

Creates a listing contract, which is saved to the database and local file system, as well as publish the keywords in the distributed hash table.

Parameters:

  • contract (Hash) (defaults to: {})

    containing:

    • expiration_date: [UTC] Formatted string. The date the contract should expire in string formatted UTC datetime. Example:

      * "2015-11-01T00:00 UTC"
      * "" if the contract never expires
      
    • metadata_category: [category] Formatted string. Select from:

      * physical good
      * digital good
      * service
      
    • title: [title text] String. Title of the product for sale

    • description: [description text] String. Description of the item, content or service

    • currency_code: [code] Formatted string. The currency the product is priced in. may either be “btc” or a currency from this list

    • price: [value] String. The price per unit in the same currency as currency_code.

    • process_time: [time] String. The time it will take to prepare the item for shipping

    • nsfw: [true/false] Boolean. Is the item not suitable for work (i.e. 18+)

    • shipping_origin: [country/region] Formatted string. Required and only applicable if the metadata_category is a physical good

      * Where the item ships from
      * Must be a formatted string from this list
      
    • shipping_regions: [locations] Formatted string. Required and only applicable if the metadata_category is a physical good.

      * A list of countries/regions where the product will ship to
      * Each item in the list must be formatted from this list
      
    • est_delivery_domestic: [time] Estimated delivery time for domestic shipments

    • est_delivery_international: [time] String. Estimated delivery time for international shipments.

    • terms_conditions: [terms and conditions text] String. Any terms or conditions the user wishes to include.

    • returns: [returns policy text] String. Return policy.

    • shipping_currency_code: [currency code] Formatted string. The currency code used to price shipping. may either be “btc” or a currency from this list.

    • shipping_domestic: [price] String. The price of domestic shipping in the selected currency code.

    • shipping_international: [price] String. The price of nternational shipping in the selected currency code.

    • keywords: [keyword text] String. A list of string search terms for the listing. Must be fewer than 10.

    • category: [category text] Sting. A user-generated category for this product. Will show in store’s category list.

    • condition: [condition text] The condition of the product

    • sku: [sku text] String. Stock keeping unit (sku) for the listing.

    • images: [String, Array<String>] 40 character hex string. A list of SHA256 image hashes. The images should be uploaded using the upload_image api call.

      * images: '04192728d0fd8dfe6663f429a5c03a7faf907930'
      * images: ['04192728d0fd8dfe6663f429a5c03a7faf907930', '0dee4786fd02d6bc673b50309a3c831acf78ec70']
      
    • image_urls: [Array<String>] An array of image URLs for OBarc to first download then automatically store to this record.

      * image_urls: 'http://i.imgur.com/YHBh57j.gif'
      * image_urls: ['http://i.imgur.com/uC2KUQ6.png', 'http://i.imgur.com/RliU8Gn.jpg']
      
    • image_data: [Array<String>] An array of Base64 images for OBarc to automatically store to this record.

      * image_data: <String>
      * image_data: [<String>, <String>]
      
    • free_shipping: [boolean] “true” or “false”

    • moderators: [guids] GUID: 40 character hex string. A list of moderator GUIDs that the vendor wishes to use

      * Note: the moderator must have been previously returned by the get_moderators websocket call.
      * Given the UI workflow, this call should always be made before the contract is set.
      
    • options: [options text] String. A list of options for the product. Example: “size”, “color”

      * option: [option text] String.
          * For each option in the options list, another argument should be added using that option name and a list of value
          * For example, given “color” in the options list, choose from "red", "green", "purple" etc
      

Returns:

  • (Hash)

    containing: “success” => true or false, “id” => Integer

See Also:


254
255
256
257
258
259
260
261
262
263
# File 'lib/obarc/session.rb', line 254

def create_contract(contract = {})
  # Note, passing contract_id appears to create a clone that re-uses the
  # original contract_id.
  
  %i(image_urls image_data).each do |symbol|
    upload_contract_images_with(symbol, contract) if !!contract[symbol]
  end
  
  JSON[Api::post_contract(contract, self)]
end

#delete_chat_conversation(delete_chat_conversation) ⇒ Hash

Undocumented

Returns:

  • (Hash)

386
# File 'lib/obarc/session.rb', line 386

def delete_chat_conversation(delete_chat_conversation); JSON[Api::delete_chat_conversation(delete_chat_conversation, self)]; end

#delete_contract(contract = {}) ⇒ Hash

Undocumented.

Returns:

  • (Hash)

280
# File 'lib/obarc/session.rb', line 280

def delete_contract(contract = {}); JSON[Api::delete_contract(contract, self)]; end

#delete_social_account(social_account = {}) ⇒ Hash

Undocumented.

Returns:

  • (Hash)

190
# File 'lib/obarc/session.rb', line 190

def ( = {}); JSON[Api::delete_social_accounts(, self)]; end

#dispute_contract(dispute_contract = nil) ⇒ Hash

Undocumented

Parameters:

  • dispute_contract (Hash) (defaults to: nil)

    containing:

    • order_id [Integer]

Returns:

  • (Hash)

471
# File 'lib/obarc/session.rb', line 471

def dispute_contract(dispute_contract = nil); JSON[Api::post_dispute_contract(dispute_contract, self)]; end

#follow(follow) ⇒ Hash

Follows a target node and will cause you to receive notifications from that node after certain event (e.g. new listing, broadcast messages) and share some metadata (in future).

Parameters:

  • follow (Hash)

    containing the guid: of the target node, required

Returns:

  • (Hash)

    containing: “success” => true or false

See Also:


162
# File 'lib/obarc/session.rb', line 162

def follow(follow); JSON[Api::post_follow(follow, self)]; end

#followers(followers = nil) ⇒ Hash

Returns the followers of the user’s node, or that of a target node.

Parameters:

  • followers (Hash) (defaults to: nil)

    containing the guid: of the target node, optional

    • If the guid is omitted, the server will look for followers in your own node’s database.

Returns:

  • (Hash)

See Also:


145
# File 'lib/obarc/session.rb', line 145

def followers(followers = nil); JSON[Api::get_followers(followers, self)]; end

#following(following = nil) ⇒ Hash

Returns the following of the user’s node, or that of a target node.

Parameters:

  • following (Hash) (defaults to: nil)

    containing the guid: of the target node, optional

    • If the guid is omitted, the server will look for following in your own node’s database.

Returns:

  • (Hash)

See Also:


153
# File 'lib/obarc/session.rb', line 153

def following(following = nil); JSON[Api::get_following(following, self)]; end

#image(image) ⇒ Object

Returns the image for the hash specified.

Parameters:

  • image (Hash)

    containing the hash: of the target image, required

Returns:

  • (Object)

    The image will be returned in .jpg format.

See Also:


54
# File 'lib/obarc/session.rb', line 54

def image(image); Api::get_image(image, self); end

#listings(listings = nil) ⇒ Hash

Returns the listings of the user’s node, or that of a target node.

Parameters:

  • listings (Hash) (defaults to: nil)

    containing the guid: of the target node, optional

    • If the guid is omitted, the server will look for listings in your own node’s database.

Returns:

  • (Hash)

See Also:


88
# File 'lib/obarc/session.rb', line 88

def listings(listings = nil); JSON[Api::get_listings(listings, self)]; end

#make_moderatorHash

Sets your node as a Moderator, which is discoverable on the network.

Returns:

  • (Hash)

    containing: “success” => true or false

See Also:


286
# File 'lib/obarc/session.rb', line 286

def make_moderator; JSON[Api::post_make_moderator(self)]; end

#mark_chat_message_as_read(mark_chat_message_as_read = nil) ⇒ Hash

Marks all chat messages with a specific node as read in the database.

Parameters:

  • chat_message_as_read (Hash)

    containing:

    • guid [String] GUID of the party you are chatting with

Returns:

  • (Hash)

    containing:

    • “success” => true or false

See Also:


455
# File 'lib/obarc/session.rb', line 455

def mark_chat_message_as_read(mark_chat_message_as_read = nil); JSON[Api::post_mark_chat_message_as_read(mark_chat_message_as_read, self)]; end

#mark_discussion_as_read(mark_discussion_as_read = nil) ⇒ Hash

Undocumented

Returns:

  • (Hash)

498
# File 'lib/obarc/session.rb', line 498

def mark_discussion_as_read(mark_discussion_as_read = nil); JSON[Api::post_mark_discussion_as_read(mark_discussion_as_read, self)]; end

#mark_notification_as_read(notification = nil) ⇒ Hash

Marks a notification as read in the database.

Parameters:

  • notification (Hash) (defaults to: nil)

    containing id:

    • 40 character hex string

    • Every notification has an ID that must be referenced in order to mark as read

Returns:

  • (Hash)

    containing: “success” => true or false

See Also:


427
# File 'lib/obarc/session.rb', line 427

def mark_notification_as_read(notification = nil); JSON[Api::post_mark_notification_as_read(notification, self)]; end

#notificationsHash

Retreive a history of all notifications your node has received. Notifications can be sent due to:

  • A node following you

  • Events related to a purchase or sale

Parameters:

  • FIXME

    not yet supported, future: limit-[number of most recent notifications]

    • Default is unlimited

    • Counts from most recent

Returns:

  • (Hash)

See Also:


365
# File 'lib/obarc/session.rb', line 365

def notifications; JSON[Api::get_notifications(self)]; end

#order(order) ⇒ Hash

Undocumented

Returns:

  • (Hash)

403
# File 'lib/obarc/session.rb', line 403

def order(order); JSON[Api::get_order(order, self)]; end

#order_messages(order_messages) ⇒ Hash

Undocumented

Returns:

  • (Hash)

413
# File 'lib/obarc/session.rb', line 413

def order_messages(order_messages); JSON[Api::get_order_messages(order_messages, self)]; end

#pingBoolean

Check if there's a valid session.

Returns:

  • (Boolean)

    True if the session is valid.


42
43
44
45
46
47
48
# File 'lib/obarc/session.rb', line 42

def ping
  return false if !(json = Api::ping(self))
  !!JSON[json]['num_peers']
rescue RestClient::Unauthorized => e
  logger.warn(e)
  false
end

#profile(profile = nil) ⇒ Hash

Returns the profile data of the user’s node, or that of a target node.

Parameters:

  • profile (Hash) (defaults to: nil)

    containing the guid: of the target node, optional

    • The global unique identifier (guid; 40 character hex string) of the node to get the profile data from

    • If the guid is omitted, your own node’s profile will be returned

Returns:

  • (Hash)

See Also:


63
# File 'lib/obarc/session.rb', line 63

def profile(profile = nil); JSON[Api::get_profile(profile, self)]; end

#purchase_contract(purchase_contract = {}) ⇒ Hash

Purchases a contract by sending the purchase into the Vendor. The Buyer waits for a response to indicate whether the purchase is successful or not. If successful, the Buyer needs to fund the direct or multisig address.

Parameters:

  • purchase_contract (Hash) (defaults to: {})

Returns:

  • (Hash)

    containing:

    • “success” => true or false

    • “address” => “bitcoin address to fund”

    • “amount” => “amount to fund”

    • “order_id” => “purchase order id”

See Also:


307
# File 'lib/obarc/session.rb', line 307

def purchase_contract(purchase_contract = {}); JSON[Api::post_purchase_contract(purchase_contract, self)]; end

#purchasesHash

Retrieves any purchases made by the node.


398
# File 'lib/obarc/session.rb', line 398

def purchases; JSON[Api::get_purchases(self)]; end

#query_listings(options = {}) ⇒ Hash

Finds the listings of the user’s node, or that of a target node.

Parameters:

  • options (Hash) (defaults to: {})

    containing:

    • guid: of the target node, optional

      *If the guid is omitted, the server will look for listings in your own node’s database.
      
    • pattern: [Regex] search phrase

Returns:

  • (Hash)

97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/obarc/session.rb', line 97

def query_listings(options = {})
  pattern = options.delete(:pattern)
  all_listings = JSON[Api::get_listings(options, self)]
  listings = all_listings['listings']
  
  if !!pattern
    listings = listings.select do |l|
      [l['contract_hash'], l['category'], l['title'],
        l['price'].to_s, l['origin'], l['currency_code'],
        l['ships_to'].join].join(' ') =~ pattern
    end
  end
  
  return {'listings' => listings} if listings === all_listings
  
  start = Time.now.to_i
  
  @cache_timestamp = if (start - (@cache_timestamp ||= 0)) > 300
    @contracts_cache = {}
    start
  else
    @cache_timestamp
  end
  
  @contracts_cache ||= {}
  (all_listings['listings'] - listings).each do |listing|
    contract_hash = listing['contract_hash']
    contract = @contracts_cache[contract_hash] ||= contracts(options.merge(id: listing['contract_hash']))
    next unless !!contract
    
    l = contract['vendor_offer']['listing']
    
    if [l['metadata']['expiry'], l['item']['category'], l['item']['sku'],
      l['item']['description'], l['item']['process_time'],
      l['item']['keywords'].join].join(' ') =~ pattern
      listings << listing && next
    end
  end

  {'listings' => listings}
end

#ratings(ratings) ⇒ Hash

Undocumented

Returns:

  • (Hash)

418
# File 'lib/obarc/session.rb', line 418

def ratings(ratings); JSON[Api::get_ratings(ratings, self)]; end

#refund(refund = nil) ⇒ Hash

Undocumented

Returns:

  • (Hash)

493
# File 'lib/obarc/session.rb', line 493

def refund(refund = nil); JSON[Api::post_refund(refund, self)]; end

#release_funds(release_funds = nil) ⇒ Hash

Undocumented

Returns:

  • (Hash)

488
# File 'lib/obarc/session.rb', line 488

def release_funds(release_funds = nil); JSON[Api::post_release_funds(release_funds, self)]; end

#routing_tableHash

Undocumented

Returns:

  • (Hash)

446
# File 'lib/obarc/session.rb', line 446

def routing_table; JSON[Api::get_routing_table(self)]; end

#salesHash

Retrieves any sales made by the node.


392
# File 'lib/obarc/session.rb', line 392

def sales; JSON[Api::get_sales(self)]; end

#settingsHash

Returns the settings of your node.


349
# File 'lib/obarc/session.rb', line 349

def settings; JSON[Api::get_settings(self)]; end

#shutdown!Object

API call to cleanly disconnect from connected nodes and shutsdown the OpenBazaar server component.


504
505
506
507
508
509
510
# File 'lib/obarc/session.rb', line 504

def shutdown!
  begin
    Api::get_shutdown(self)
  rescue Errno::ECONNREFUSED => e
    logger.warn(e)
  end
end

#social_accounts(profile = nil) ⇒ Hash

Returns just the profile's social accounts of the user’s node, or that of a target node.

Parameters:

  • profile (Hash) (defaults to: nil)

    containing the guid: of the target node, optional

    • The global unique identifier (guid; 40 character hex string) of the node to get the profile data from

    • If the guid is omitted, your own node’s social accounts will be returned

Returns:

  • (Hash)

See Also:


72
73
74
75
76
77
78
79
80
# File 'lib/obarc/session.rb', line 72

def social_accounts(profile = nil)
  result = JSON[Api::get_profile(profile, self)]
  
  if !!result && !!result['profile'] && !!result['profile']['social_accounts']
    result['profile']['social_accounts']
  else
    []
  end
end

#unfollow(unfollow) ⇒ Hash

Stop following a target node, will cease to receive notifications and sharing metadata.

Parameters:

  • unfollow (Hash)

    containing the guid: of the target node, required

Returns:

  • (Hash)

    containing: “success” => true or false

See Also:


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

def unfollow(unfollow); JSON[Api::post_unfollow(unfollow, self)]; end

#unmake_moderatorHash

Removes the node as a Moderator and is no longer discoverable on the network as a Moderator.

Returns:

  • (Hash)

    containing: “success” => true or false

See Also:


293
# File 'lib/obarc/session.rb', line 293

def unmake_moderator; JSON[Api::post_unmake_moderator(self)]; end

#update_profile(profile = {}) ⇒ Hash

Add data related to the node's profile into the database, which will be visible to other nodes.

Parameters:

  • profile (Hash) (defaults to: {})

Returns:

  • (Hash)

    containing: “success” => true or false

See Also:


178
# File 'lib/obarc/session.rb', line 178

def update_profile(profile = {}); JSON[Api::post_profile(profile, self)]; end

#update_settings(settings = {}) ⇒ Hash

Changes the settings of the node and pushes them to the database.

Parameters:

  • settings (Hash) (defaults to: {})

Returns:

  • (Hash)

    containing: “success” => true or false

See Also:


343
# File 'lib/obarc/session.rb', line 343

def update_settings(settings = {}); JSON[Api::post_settings(settings, self)]; end

#upload_contract_images_with(symbol, contract = {}) ⇒ Object


265
266
267
268
269
270
271
272
273
274
275
# File 'lib/obarc/session.rb', line 265

def upload_contract_images_with(symbol, contract = {})
  contract[:images] = [contract.delete(symbol)].flatten.map do |image|
    response = if image =~ URI::regexp
      upload_image(image: open(image, 'rb'))
    else
      upload_image(image: image )
    end
             
    response['image_hashes'] if response['success']
  end.flatten
end

#upload_image(image = {}) ⇒ Hash

Saves the image in the file system and a pointer to it in the db.

Parameters:

  • image (Hash) (defaults to: {})

    containing:

    • image: a list of product images to upload (LIST of images in base64. data only, no base64 prefix)

    • avatar: use this if uploading an avatar image (base64 image)

    • header: use this if uploading a header image (base64 image)

Returns:

  • (Hash)

    containing:

    • “success” => true or false

    • “image_hashes” => [list_of_image_hashes]

See Also:


328
# File 'lib/obarc/session.rb', line 328

def upload_image(image = {}); JSON[Api::post_upload_image(image.merge(cookies: cookies, base_url: base_url, verify_ssl: verify_ssl))]; end