class Zold::WTS
WTS
gateway.
- Author
-
Yegor Bugayenko (yegor256@gmail.com)
- Copyright
-
Copyright © 2018-2020 Yegor Bugayenko
- License
-
MIT
Public Class Methods
Makes a new object of the class. The key
you are supposed to obtain at this page: wts.zold.io/api. You will have to login and confirm your account first. Keep this key secret, to avoid information lost. However, even knowing the secret no payments can be sent without they keygap.
# File lib/zold/wts.rb, line 74 def initialize(key, log: Loog::NULL) raise 'Key can\'t be nil' if key.nil? @key = key raise 'Log can\'t be nil' if log.nil? @log = log end
Public Instance Methods
Get wallet balance.
# File lib/zold/wts.rb, line 102 def balance start = Time.now http = clean( Typhoeus::Request.get( 'https://wts.zold.io/balance', headers: headers ) ) balance = Zold::Amount.new(zents: http.body.to_i) @log.debug("The balance #{balance} retrieved in #{Zold::Age.new(start)}") balance end
Find transactions by the criteria. All criterias are regular expressions and their summary result is concatenated by OR. For example, this request will return all transactions that have “pizza” in details OR which are coming from the root wallet:
find(details: /pizza/, bnf: '0000000000000000')
The method returns an array of Zold::Txn objects.
# File lib/zold/wts.rb, line 165 def find(query) start = Time.now http = clean( Typhoeus::Request.get( 'https://wts.zold.io/find?' + query.map do |k, v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}" end.join('&'), headers: headers ) ) txns = http.body.split("\n").map { |t| Zold::Txn.parse(t) } @log.debug("#{txns.count} transactions found in #{Zold::Age.new(start)}") txns end
Get wallet ID.
# File lib/zold/wts.rb, line 116 def id start = Time.now http = clean( Typhoeus::Request.get( 'https://wts.zold.io/id', headers: headers ) ) id = Zold::Id.new(http.body.to_s) @log.debug("Wallet ID #{id} retrieved in #{Zold::Age.new(start)}") id end
Initiate PAY request. The keygap
is a string you get when you confirm the account. The bnf
is the name of the GitHub account, the wallet ID or the invoice (up to you). The amount
is the amount in ZLD, e.g. “19.99”. The details
is the text to add to the transaction.
The method returns the job ID, which you should wait for completion using the method wait()
.
# File lib/zold/wts.rb, line 137 def pay(keygap, bnf, amount, details) start = Time.now job = job_of( clean( Typhoeus::Request.post( 'https://wts.zold.io/do-pay', headers: headers, body: { keygap: keygap, bnf: bnf, amount: amount, details: details } ) ) ) @log.debug("PAY job #{job} started in #{Zold::Age.new(start)}") job end
Initiate PULL request. The server will pull your wallet form the network, and make it ready for future requests. Without this operation you won't be able to perform find()
or balance()
requests.
The method returns the job ID, which you should wait for completion using the method wait()
.
# File lib/zold/wts.rb, line 87 def pull start = Time.now job = job_of( clean( Typhoeus::Request.get( 'https://wts.zold.io/pull', headers: headers ) ) ) @log.debug("PULL job #{job} started in #{Zold::Age.new(start)}") job end
Returns current USD rate of one ZLD.
# File lib/zold/wts.rb, line 153 def usd_rate clean(Typhoeus::Request.get('https://wts.zold.io/usd_rate')).body.to_f end
Wait for the job to complete. If the job completes successfully, the method returns 'OK' in a few seconds (up to a few minutes). If the is some error, the exception will be raised.
# File lib/zold/wts.rb, line 183 def wait(job, time: 5 * 60) start = Time.now loop do if Time.now - start > time raise "Can't wait any longer for the job #{job} to complete" end http = Typhoeus::Request.get( 'https://wts.zold.io/job?id=' + job, headers: headers ) raise "Job #{job} not found on the server" if http.code == 404 raise "Unpredictable response code #{http.code}" unless http.code == 200 if http.body == 'Running' @log.debug("Job #{job} is still running, \ #{Zold::Age.new(start)} already...") sleep 1 next end raise http.body unless http.body == 'OK' @log.debug("Job #{job} completed, in #{Zold::Age.new(start)}") return http.body end end
Private Instance Methods
# File lib/zold/wts.rb, line 223 def clean(http) error = (http.headers || {})['X-Zold-Error'] raise error unless error.nil? unless http.code == 200 || http.code == 302 @log.debug("HTTP response body: #{http.body}") raise "Unexpected response code #{http.code}" end http end
# File lib/zold/wts.rb, line 209 def headers { 'X-Zold-WTS': @key, 'User-Agent': 'zold-ruby-sdk' } end
# File lib/zold/wts.rb, line 216 def job_of(http) raise 'There are no headers in the response' if http.headers.nil? job = http.headers['X-Zold-Job'] raise 'Job ID is not returned, for some reason' if job.nil? job end