mpex 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4a87718ecf434d124e3a37665c035416241daa62
4
- data.tar.gz: 1b92eba912866a6ca908ff114b360b9956b5caed
3
+ metadata.gz: e41a7ba41a180a7924df3c7195df8023c2302332
4
+ data.tar.gz: e2805ae4b45f3d9ea0206d6be109f12a6bef89e3
5
5
  SHA512:
6
- metadata.gz: 7d44f8de8244e53b7da86c1ebb6075b9710bb920d8ff6335911d5f5571f1ce421db8f079f131954b7b9eaba02a55ae3af95a73bb70ff42267e11a0dead5d495a
7
- data.tar.gz: 38d9e0dd2c5d40623e9a046112525887965bbe27611b24dceaadf5e16e975d0fe373e6fbe286d735e89bdf91d14098e63ddf1f9293f5be524d989ab367207734
6
+ metadata.gz: 98ade93137edbfa1b803904f8f7433dd648f1a834bbe5d0018b7ad1b4229a69d77ccda44bf6e33d89ab28449e279f68d9b59b9a058db9584bd8eed4b9c379eb2
7
+ data.tar.gz: a75dd7211660aa4cb106858d7bfb82606cfad28b5c5869d5d54849e575556ceda58103440590ca9139debc4662896c9df21518c82c9049537257365ca755e85d
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mpex (0.6.1)
4
+ mpex (0.7.0)
5
5
  cri (~> 2.2)
6
6
  gpgme
7
7
  highline
data/README.md CHANGED
@@ -17,6 +17,10 @@ If you want to use MPEx via IRC, use the interactive mode:
17
17
 
18
18
  * mpex -i
19
19
 
20
+ ## Config
21
+
22
+ After you run the "mpex" cli once a config file is created in $HOME/.mpex/config where you can edit default keys etc.
23
+
20
24
  ## License
21
25
 
22
26
  Copyright (c) 2013 Fa Wuxi
@@ -21,7 +21,6 @@ module Mpex::CLI
21
21
  option :s, :url, 'URL to MPEx (defaults to http://mpex.co)'
22
22
  option :u, :keyid, 'key id of your gnupg key to use'
23
23
  option :m, :mpexkeyid, 'MPEx public key id (see FAQ#8)'
24
- option :p, :password, 'passphrase of your private key (unless provided you\'ll be asked for it)'
25
24
 
26
25
  option "0", :isinteractive, "internal flag set automatically in interactive mode"
27
26
 
@@ -76,9 +75,11 @@ end
76
75
  summary "send string as is signed/encrypted to MPEx"
77
76
 
78
77
  run do |opts, args|
79
- mpex = Mpex::Mpex.new
80
- mpex.send_plain(args[0], opts) do |answer|
81
- puts answer
78
+ if agree("Send " + args[0] + " to MPEx? [y/n]")
79
+ mpex = Mpex::Mpex.new
80
+ mpex.send_plain(args[0], opts) do |answer|
81
+ puts answer
82
+ end
82
83
  end
83
84
  end
84
85
  end
@@ -99,8 +100,10 @@ end
99
100
  end
100
101
  say "<%= color('Buy #{amount} #{mpsic} @ #{Mpex::Converter.satoshi_to_btc(price.to_i)} BTC = #{Mpex::Converter.satoshi_to_btc(amount.to_i*price.to_i)} total BTC', :bold) %>"
101
102
  order_string = "BUY|#{mpsic}|#{amount}|#{price}"
102
- mpex.send_plain(order_string, opts) do |answer|
103
- puts answer
103
+ if agree("Send " + order_string + " to MPEx? [y/n]")
104
+ mpex.send_plain(order_string, opts) do |answer|
105
+ puts answer
106
+ end
104
107
  end
105
108
  end
106
109
  end
@@ -121,8 +124,10 @@ end
121
124
  end
122
125
  say "<%= color('Sell #{amount} #{mpsic} @ #{Mpex::Converter.satoshi_to_btc(price.to_i)} BTC = #{Mpex::Converter.satoshi_to_btc(amount.to_i*price.to_i)} total BTC', :bold) %>"
123
126
  order_string = "SELL|#{mpsic}|#{amount}|#{price}"
124
- mpex.send_plain(order_string, opts) do |answer|
125
- puts answer
127
+ if agree("Send " + order_string + " to MPEx? [y/n]")
128
+ mpex.send_plain(order_string, opts) do |answer|
129
+ puts answer
130
+ end
126
131
  end
127
132
  end
128
133
  end
@@ -135,8 +140,10 @@ end
135
140
  run do |opts, args|
136
141
  mpex = Mpex::Mpex.new
137
142
  order_string = "CANCEL|#{args[0]}"
138
- mpex.send_plain(order_string, opts) do |answer|
139
- puts answer
143
+ if agree("Send " + order_string + " to MPEx? [y/n]")
144
+ mpex.send_plain(order_string, opts) do |answer|
145
+ puts answer
146
+ end
140
147
  end
141
148
  end
142
149
  end
@@ -149,8 +156,10 @@ end
149
156
  run do |opts, args|
150
157
  mpex = Mpex::Mpex.new
151
158
  order_string = "DEPOSIT|#{args[0]}"
152
- mpex.send_plain(order_string, opts) do |answer|
153
- puts answer
159
+ if agree("Send " + order_string + " to MPEx? [y/n]")
160
+ mpex.send_plain(order_string, opts) do |answer|
161
+ puts answer
162
+ end
154
163
  end
155
164
  end
156
165
  end
@@ -164,8 +173,28 @@ end
164
173
  #puts .run('help'); exit 0 unless args.length == 2
165
174
  mpex = Mpex::Mpex.new
166
175
  order_string = "WITHDRAW|#{args[0]}|#{args[1]}"
167
- mpex.send_plain(order_string, opts) do |answer|
168
- puts answer
176
+ if agree("Send " + order_string + " to MPEx? [y/n]")
177
+ mpex.send_plain(order_string, opts) do |answer|
178
+ puts answer
179
+ end
180
+ end
181
+ end
182
+ end
183
+
184
+ @cmd.define_command do
185
+ name 'push'
186
+ aliases :PUSH
187
+ usage "push [options] [MPSIC] [40 char key fingerprint] [qty]"
188
+
189
+ run do |opts, args|
190
+ #puts .run('help'); exit 0 unless args.length == 2
191
+ mpex = Mpex::Mpex.new
192
+ order_string = "PUSH|#{args[0]}|#{args[1]}|#{args[2]}"
193
+ puts "Read FAQ: 'PUSH|{MPSIC}|{40 char key fingerprint}|{qty}, which allows you to push an asset (including BTC) to another account on MPEx. This is free of charge but it does not check if the keyid exists so please, for the love of all that is holy, make sure you don't send your stocks to limbo.'"
194
+ if agree("Send " + order_string + " to MPEx? [y/n]")
195
+ mpex.send_plain(order_string, opts) do |answer|
196
+ puts answer
197
+ end
169
198
  end
170
199
  end
171
200
  end
@@ -30,7 +30,7 @@ module Mpex
30
30
  end
31
31
 
32
32
  def sign(msg, opts)
33
- signed_message = @crypto.sign(msg, :signer => opts[:keyid], :password => opts[:password], :mode => GPGME::SIG_MODE_CLEAR)
33
+ signed_message = @crypto.sign(msg, { :signer => opts[:keyid], :passphrase_callback => method(:passphrase_callback), :mode => GPGME::SIG_MODE_CLEAR } )
34
34
 
35
35
  verify(signed_message)
36
36
  signed_message.to_s
@@ -54,7 +54,8 @@ module Mpex
54
54
  end
55
55
 
56
56
  def decrypt(encrypted_data, opts)
57
- decrypted = @crypto.decrypt(encrypted_data, :password => opts[:password]) do |signature|
57
+ return encrypted_data unless (encrypted_data.start_with?("-----BEGIN PGP MESSAGE-----"))
58
+ decrypted = @crypto.decrypt(encrypted_data, { :passphrase_callback => method(:passphrase_callback) }) do |signature|
58
59
  raise "Signature could not be verified" unless signature.valid?
59
60
  end
60
61
  decrypted.to_s
@@ -64,7 +65,7 @@ module Mpex
64
65
 
65
66
  puts "Sending order to MPEX: #{cleartext_command}"
66
67
 
67
- opts = verify_opts_present(opts, [ :url, :keyid, :mpexkeyid, :password ])
68
+ opts = verify_opts_present(opts, [ :url, :keyid, :mpexkeyid ])
68
69
 
69
70
  signed_msg = sign(cleartext_command, opts)
70
71
  say("<%= color('Track-ID: #{track_id(signed_msg)}', :blue) %>")
@@ -192,7 +193,19 @@ STAT
192
193
  order[order.keys.first]["Price"].to_i * order[order.keys.first]["Quantity"].to_i
193
194
  elsif order[order.keys.first]["BS"] == "S"
194
195
  mpsic = order[order.keys.first]["MPSIC"]
195
- vwaps[mpsic] ? vwaps[mpsic]["1d"]["max"].to_i * order[order.keys.first]["Quantity"].to_i : 0
196
+ if vwaps[mpsic]
197
+ avg_price = 0
198
+ if vwaps[mpsic]["1d"]["avg"].to_i > 0
199
+ avg_price = vwaps[mpsic]["1d"]["avg"].to_i
200
+ elsif vwaps[mpsic]["7d"]["avg"].to_i > 0
201
+ avg_price = vwaps[mpsic]["7d"]["avg"].to_i
202
+ elsif vwaps[mpsic]["30d"]["avg"].to_i > 0
203
+ avg_price = vwaps[mpsic]["30d"]["avg"].to_i
204
+ end
205
+ avg_price * order[order.keys.first]["Quantity"].to_i
206
+ else
207
+ 0
208
+ end
196
209
  else
197
210
  0
198
211
  end
@@ -251,7 +264,7 @@ STAT
251
264
 
252
265
  return unless stat
253
266
 
254
- opts = verify_opts_present(opts, [ :url, :keyid, :mpexkeyid, :password ])
267
+ opts = verify_opts_present(opts, [ :url, :keyid, :mpexkeyid ])
255
268
 
256
269
  fetch_mpex_vwaps(opts[:url]) do |vwaps|
257
270
  return unless vwaps
@@ -311,18 +324,21 @@ Holdings including those stuck in open orders:
311
324
  end
312
325
 
313
326
  def holdings_avg_value(stat, vwaps)
314
- # TODO improve!
315
327
  holdings_value = stat["Holdings"].map do |h|
328
+ mpsic = h.keys.first
316
329
  if h["CxBTC"]
317
330
  h["CxBTC"].to_i
318
- elsif h["S.MPOE"]
319
- h["S.MPOE"].to_i*vwaps["S.MPOE"]["1d"]["avg"].to_i
320
- elsif h["S.DICE"]
321
- h["S.DICE"].to_i*vwaps["S.DICE"]["1d"]["avg"].to_i
322
- elsif h["S.BBET"]
323
- h["S.BBET"].to_i*vwaps["S.BBET"]["1d"]["avg"].to_i
324
- elsif h["S.MG"]
325
- h["S.MG"].to_i*vwaps["S.MG"]["1d"]["avg"].to_i
331
+ elsif h[mpsic] && vwaps[mpsic]
332
+ amount = h[mpsic].to_i
333
+ avg_price = 0
334
+ if vwaps[mpsic]["1d"]["avg"].to_i > 0
335
+ avg_price = vwaps[mpsic]["1d"]["avg"].to_i
336
+ elsif vwaps[mpsic]["7d"]["avg"].to_i > 0
337
+ avg_price = vwaps[mpsic]["7d"]["avg"].to_i
338
+ elsif vwaps[mpsic]["30d"]["avg"].to_i > 0
339
+ avg_price = vwaps[mpsic]["30d"]["avg"].to_i
340
+ end
341
+ amount * avg_price
326
342
  else
327
343
  0
328
344
  end
@@ -335,9 +351,6 @@ Holdings including those stuck in open orders:
335
351
  unless opts[r_opt]
336
352
  if config_opts[r_opt.to_s]
337
353
  opts[r_opt] = config_opts[r_opt.to_s]
338
- elsif r_opt == :password
339
- opts[:password] = ask("Enter Passphrase: "){|q| q.echo = false}
340
- puts
341
354
  else
342
355
  $stderr.puts "--#{r_opt} option is required"
343
356
  exit 1
@@ -347,6 +360,21 @@ Holdings including those stuck in open orders:
347
360
  opts
348
361
  end
349
362
 
363
+ def passphrase_callback(hook, uid_hint, passphrase_info, prev_was_bad, fd)
364
+ $stderr.write("Passphrase for #{uid_hint}: ")
365
+ $stderr.flush
366
+ begin
367
+ system('stty -echo')
368
+ io = IO.for_fd(fd, 'w')
369
+ io.puts(ask(''){|q| q.echo = false})
370
+ io.flush
371
+ ensure
372
+ (0 ... $_.length).each do |i| $_[i] = ?0 end if $_
373
+ system('stty echo')
374
+ end
375
+ $stderr.puts
376
+ end
377
+
350
378
  def read_config
351
379
  begin
352
380
  return YAML.load_file(File.expand_path(CONFIG_FILE_PATH))
@@ -1,3 +1,3 @@
1
1
  module Mpex
2
- VERSION = "0.6.1"
2
+ VERSION = "0.7.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mpex
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fa Wuxi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-27 00:00:00.000000000 Z
11
+ date: 2014-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cri
@@ -173,7 +173,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
173
173
  version: '0'
174
174
  requirements: []
175
175
  rubyforge_project:
176
- rubygems_version: 2.1.3
176
+ rubygems_version: 2.1.10
177
177
  signing_key:
178
178
  specification_version: 4
179
179
  summary: 'MPEx.rb: a commandline client for MPEx'