Class: Zold::WTS

Inherits:
Object
  • Object
show all
Defined in:
lib/zold/wts.rb

Overview

WTS

Instance Method Summary collapse

Constructor Details

#initialize(key, log: STDOUT) ⇒ WTS

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.



43
44
45
46
47
48
# File 'lib/zold/wts.rb', line 43

def initialize(key, log: STDOUT)
  raise 'Key can\'t be nil' if key.nil?
  @key = key
  raise 'Log can\'t be nil' if log.nil?
  @log = log
end

Instance Method Details

#balanceObject

Get wallet balance.



71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/zold/wts.rb', line 71

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)
  debug("Wallet balance #{balance} retrieved in #{Zold::Age.new(start)}")
  balance
end

#find(query) ⇒ Object

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.



129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/zold/wts.rb', line 129

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) }
  debug("#{txns.count} transactions found in #{Zold::Age.new(start)}")
  txns
end

#idObject

Get wallet ID.



85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/zold/wts.rb', line 85

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)
  debug("Wallet ID #{id} retrieved in #{Zold::Age.new(start)}")
  id
end

#pay(keygap, bnf, amount, details) ⇒ Object

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().



106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/zold/wts.rb', line 106

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 }
      )
    )
  )
  debug("PAY job #{job} started in #{Zold::Age.new(start)}")
  job
end

#pullObject

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().



56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/zold/wts.rb', line 56

def pull
  start = Time.now
  job = job_of(
    clean(
      Typhoeus::Request.get(
        'https://wts.zold.io/pull',
        headers: headers
      )
    )
  )
  debug("PULL job #{job} started in #{Zold::Age.new(start)}")
  job
end

#wait(job, time: 5 * 60) ⇒ Object

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.



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/zold/wts.rb', line 147

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
    next if http.body == 'Running'
    raise http.body unless http.body == 'OK'
    debug("Job #{job} completed, in #{Zold::Age.new(start)}")
    return http.body
  end
end