yolodice-client 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +77 -26
  3. data/lib/yolodice_client.rb +66 -22
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b770b33186e05e3fd16caee8bdb990aca0da7740
4
- data.tar.gz: c60e4b8ac43202cb52b3f33deac511cebf0cbc71
3
+ metadata.gz: 4777876d939b40f70b4bdba8a119d73afacdf1a9
4
+ data.tar.gz: d20844e3e1163eeb47d26a1ec4971732b5043877
5
5
  SHA512:
6
- metadata.gz: 873a5a2542fa8da4ef04da2ba049b934117b7bb18eee723a39dae9fe4b45def756da1f58e462a1d6c9cbd2a5383ef3ffb99a4adc2c3c617e30577086ed861505
7
- data.tar.gz: a7a8f91141abfc76fd481fb705fdba2541e5d1d3c9b7aa371b83e917207d857c570583ecce9ff438cad82d9196f0fd73f63cf8f4eae57e5ba3b1cc93ba8bd13f
6
+ metadata.gz: 638e0e46a0a2f8d128a7b0e2468370fb2940d236f15dee52e5ab1e80962d01925db278628815d5821311b6833a0fca46adaf6412f6c6bd10b04d8916f989f8b2
7
+ data.tar.gz: a2751949033cc6edcfca2440f1d52d43ce5015eb831a8a588c662e5e723eeb4b3be50d606d1812a1fbe582e154d1604ddfe291d88b5c59b85808ad52081655ab
data/README.md CHANGED
@@ -32,15 +32,15 @@ YOLOdice API requires authentication for most of it's methods. A Bitcoin key/add
32
32
 
33
33
  1. Generate an Bitcoin public and private key:
34
34
 
35
-
35
+ ```ruby
36
36
  require 'bitcoin'
37
37
 
38
38
  btc_key = Bitcoin::Key.generate
39
39
  auth_key = btc_key.to_base58 # this is your secret code, store it in a secure place
40
40
  auth_addr = btc_key.addr # paste this in your YD settings as a new key
41
+ ```
41
42
 
42
43
  2. Go to [YOLOdice account Settings](https://yolodice.com/#settings), create a new key and paste the `auth_addr` generated above. Set permissions as you wish.
43
-
44
44
  3. Use `auth_key` in your code to authenticate.
45
45
 
46
46
  Just a quick note — this address is used ONLY to authenticate. No coins will be ever sent to it.
@@ -48,9 +48,11 @@ Just a quick note — this address is used ONLY to authenticate. No coins wi
48
48
 
49
49
  ## Connecting
50
50
 
51
- yd = YolodiceClient.new
52
- yd.connect
53
- yd.authenticate auth_key
51
+ ```ruby
52
+ yd = YolodiceClient.new
53
+ yd.connect
54
+ yd.authenticate auth_key
55
+ ```
54
56
 
55
57
  It's important to authenticate immediately after connecting. Otherwise the connection will be closed by the server.
56
58
 
@@ -61,13 +63,15 @@ The client automatically sends a `ping` requests to the server every 30 seconds
61
63
 
62
64
  To preview the actuall messages sent back and forth you could provide your own logger object and set log level to `DEBUG` like this:
63
65
 
64
- yd = YolodiceClient.new
65
- logger = Logger.new STDERR
66
- logger.level = Logger::DEBUG
67
- yd.logger = logger
66
+ ```ruby
67
+ yd = YolodiceClient.new
68
+ logger = Logger.new STDERR
69
+ logger.level = Logger::DEBUG
70
+ yd.logger = logger
68
71
 
69
- yd.connect
70
- yd.authenticate auth_key
72
+ yd.connect
73
+ yd.authenticate auth_key
74
+ ```
71
75
 
72
76
  This would result in the output similar to this:
73
77
 
@@ -97,22 +101,69 @@ There are two error classes:
97
101
 
98
102
  `RemoteError` has two extra attributes: `code` and `data` that are mapped to values in the error object returned from the server.
99
103
 
104
+ ## Helper methods
105
+
106
+ #### .satoshi_to_btc(v)
107
+
108
+ Converts an amount value from satoshis (integer) to bitcoin (float).
109
+
110
+ ```ruby
111
+ YolodiceClient.satoshi_to_btc(10_000)
112
+ # => 0.0001
113
+ ```
114
+
115
+ #### .btc_to_satoshi(v)
116
+
117
+ Converts an amount value from bitcoin (float) to satoshi (integer).
118
+
119
+ ```ruby
120
+ YolodiceClient.btc_to_satoshi(0.12312312)
121
+ # => 12312312
122
+ ```
123
+
124
+ #### .target_from_multiplier(m)
125
+
126
+ It calculates target value given the multiplier for the bet. If you want to find our the target that corresponds e.g. to multiplier `4`, try this:
127
+
128
+ ```ruby
129
+ target = YolodiceClient.target_from_multiplier(4)
130
+ # => 247500
131
+ ```
132
+
133
+ You can then use the target as an attribute to API method `create_bet`.
134
+
135
+ #### .target_from_probability(p)
136
+
137
+ It calculates target value given the win probability. Note: probability is a value ranged from 0 (0%) to 1 (100%). To find target that corresponds to win probability of 50% do this:
138
+
139
+ ```ruby
140
+ target = YolodiceClient.target_from_probability(0.5)
141
+ # => 500000
142
+ ```
143
+
144
+
100
145
  ## An example
101
146
 
102
147
  Here is a script that connects to the server, authenticates, fetches user data, rolls a few 50% chance bets and reads user data again (make sure to use your own credential):
103
148
 
104
- require 'yolodice_client'
105
- require 'pp'
106
-
107
- auth_key = 'cPFVHENWNjs5UKNXXynDSWiRkBEph8hcrjHKkXK5SW9QHxx7i4jC'
108
- yd = YolodiceClient.new
109
- yd.connect
110
- user = yd.authenticate auth_key
111
- user_data = yd.read_user_data selector: {id: user['id']}
112
- puts "Your account balance is: #{user_data['balance']} satoshis."
113
- 10.times do
114
- b = yd.create_bet attrs: {amount: 100, range: 'lo', target: 500000}
115
- puts "Bet profit: #{b['profit']}"
116
- end
117
- user_data = yd.read_user_data selector: {id: user['id']}
118
- puts "Your account balance is: #{user_data['balance']} satoshis."
149
+ ```ruby
150
+ require 'yolodice_client'
151
+ require 'pp'
152
+
153
+ auth_key = 'cPFVHENWNjs5UKNXXynDSWiRkBEph8hcrjHKkXK5SW9QHxx7i4jC'
154
+ yd = YolodiceClient.new
155
+ yd.connect
156
+ user = yd.authenticate auth_key
157
+ user_data = yd.read_user_data selector: {id: user['id']}
158
+ puts "Your account balance is: #{user_data['balance']} satoshis."
159
+ 10.times do
160
+ b = yd.create_bet attrs: {amount: 100, range: 'lo', target: 500000}
161
+ puts "Bet profit: #{b['profit']}"
162
+ end
163
+ user_data = yd.read_user_data selector: {id: user['id']}
164
+ puts "Your account balance is: #{user_data['balance']} satoshis."
165
+ ```
166
+
167
+ # Even more examples
168
+
169
+ We have created a new Github repository with Ruby script examples to get you started. If you are looking for inspiration, check this out: https://github.com/ethan-nx/yolodice-examples.
@@ -62,28 +62,33 @@ class YolodiceClient
62
62
  @listening_thread = Thread.new do
63
63
  log.debug 'Listening thread started'
64
64
  loop do
65
- msg = @connection.gets
66
- log.debug{ "<<< #{msg}" }
67
- message = JSON.parse msg
68
- if message['id'] && (message.has_key?('result') || message.has_key?('error'))
69
- # definitealy a response
70
- callback = @thread_semaphore.synchronize{ @current_requests.delete message['id'] }
71
- raise Error, "Unknown id in response" unless callback
72
- if callback.is_a? Integer
73
- # it's a thread
74
- @receive_queues[callback] << message
75
- elsif callback.is_a? Proc
76
- # A thread pool would be better.
77
- Thread.new do
78
- callback.call message
65
+ begin
66
+ msg = @connection.gets
67
+ next if msg == nil
68
+ log.debug{ "<<< #{msg}" }
69
+ message = JSON.parse msg
70
+ if message['id'] && (message.has_key?('result') || message.has_key?('error'))
71
+ # definitealy a response
72
+ callback = @thread_semaphore.synchronize{ @current_requests.delete message['id'] }
73
+ raise Error, "Unknown id in response" unless callback
74
+ if callback.is_a? Integer
75
+ # it's a thread
76
+ @receive_queues[callback] << message
77
+ elsif callback.is_a? Proc
78
+ # A thread pool would be better.
79
+ Thread.new do
80
+ callback.call message
81
+ end
79
82
  end
80
- end
81
- else
82
- if message['id']
83
- # It must be a request from the server. We do not support it yet.
84
83
  else
85
- # No id, it must be a notification then. This can be implemented later.
84
+ if message['id']
85
+ # It must be a request from the server. We do not support it yet.
86
+ else
87
+ # No id, it must be a notification then. This can be implemented later.
88
+ end
86
89
  end
90
+ rescue StandardError => e
91
+ log.error e
87
92
  end
88
93
  end
89
94
  end
@@ -91,8 +96,12 @@ class YolodiceClient
91
96
  @pinging_thread = Thread.new do
92
97
  log.debug 'Pinging thread started'
93
98
  loop do
94
- sleep 30
95
- call :ping
99
+ begin
100
+ sleep 30
101
+ call :ping
102
+ rescue StandardError => e
103
+ log.error e
104
+ end
96
105
  end
97
106
  end
98
107
  true
@@ -165,6 +174,7 @@ class YolodiceClient
165
174
  # a regular blocking request
166
175
  @thread_semaphore.synchronize{ @current_requests[id] = Thread.current.object_id }
167
176
  queue = (@receive_queues[Thread.current.object_id] ||= Queue.new)
177
+ queue.clear
168
178
  log.debug{ "Calling remote method #{method}(#{params.inspect if params != nil})" }
169
179
  log.debug{ ">>> #{request.to_json}" }
170
180
  @connection.puts request.to_json
@@ -213,8 +223,42 @@ class YolodiceClient
213
223
  def initialize(error_obj = {'code' => -1, 'message' => "RPC Error"})
214
224
  @code = error_obj['code'] || -1
215
225
  @data = error_obj['data'] if error_obj['data']
216
- super "#{@code}: #{error_obj['message']}"
226
+ msg = "#{@code}: #{error_obj['message']}"
227
+ if @code == 422 && @data && @data.has_key?('errors')
228
+ msg += ': ' + @data['errors'].to_json
229
+ end
230
+ super msg
217
231
  end
218
232
  end
219
233
 
234
+ class << self
235
+
236
+ ##
237
+ # Returns bet terget given the required multiplier.
238
+
239
+ def target_from_multiplier m
240
+ edge = 0.01
241
+ (1_000_000.0 * (1.0 - edge) / m).round
242
+ end
243
+
244
+ ##
245
+ # Returns bet target given the required win probability.
246
+
247
+ def target_from_probability p
248
+ (p * 1_000_000.0).round
249
+ end
250
+
251
+ ##
252
+ # Converts amount from satoshi (integer) to amount in bitcoins (float).
253
+
254
+ def satoshi_to_btc v
255
+ (v.to_f / 100_000_000).round(8)
256
+ end
257
+
258
+ ## Converts amount from bitcoins (float) to satoshi (integer).
259
+ def btc_to_satoshi v
260
+ (v * 100_000_000).round
261
+ end
262
+
263
+ end
220
264
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yolodice-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - ethan_nx
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-10 00:00:00.000000000 Z
11
+ date: 2017-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bitcoin-ruby