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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +4 -0
- data/lib/mpex/cli.rb +43 -14
- data/lib/mpex/mpex.rb +45 -17
- data/lib/mpex/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e41a7ba41a180a7924df3c7195df8023c2302332
|
4
|
+
data.tar.gz: e2805ae4b45f3d9ea0206d6be109f12a6bef89e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98ade93137edbfa1b803904f8f7433dd648f1a834bbe5d0018b7ad1b4229a69d77ccda44bf6e33d89ab28449e279f68d9b59b9a058db9584bd8eed4b9c379eb2
|
7
|
+
data.tar.gz: a75dd7211660aa4cb106858d7bfb82606cfad28b5c5869d5d54849e575556ceda58103440590ca9139debc4662896c9df21518c82c9049537257365ca755e85d
|
data/Gemfile.lock
CHANGED
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
|
data/lib/mpex/cli.rb
CHANGED
@@ -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
|
-
|
80
|
-
|
81
|
-
|
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
|
-
|
103
|
-
|
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
|
-
|
125
|
-
|
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
|
-
|
139
|
-
|
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
|
-
|
153
|
-
|
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
|
-
|
168
|
-
|
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
|
data/lib/mpex/mpex.rb
CHANGED
@@ -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], :
|
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
|
-
|
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
|
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
|
-
|
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
|
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[
|
319
|
-
h[
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
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))
|
data/lib/mpex/version.rb
CHANGED
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.
|
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:
|
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.
|
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'
|