X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=plugins%2Fexchange_rate.py;h=f8713a78ea64e89e6c5e78d5c4ebf9c08cda5847;hb=068609b4a65a172a15a24299b8a0fad0ef82898c;hp=8cc14ff933e72929abda66f408456c8f55777686;hpb=dea58fcb496ebc7ac7fda096aec03eefec90fe69;p=electrum-nvc.git diff --git a/plugins/exchange_rate.py b/plugins/exchange_rate.py index 8cc14ff..f8713a7 100644 --- a/plugins/exchange_rate.py +++ b/plugins/exchange_rate.py @@ -6,6 +6,7 @@ import decimal import httplib import json import threading +import time import re from decimal import Decimal from electrum.plugins import BasePlugin @@ -16,6 +17,8 @@ from electrum_gui.qt.amountedit import AmountEdit EXCHANGES = ["BitcoinAverage", "BitcoinVenezuela", + "Bitcurex", + "Bitmarket", "BitPay", "Blockchain", "BTCChina", @@ -24,7 +27,7 @@ EXCHANGES = ["BitcoinAverage", "CoinDesk", "LocalBitcoins", "Winkdex"] - + class Exchanger(threading.Thread): @@ -37,7 +40,7 @@ class Exchanger(threading.Thread): self.query_rates = threading.Event() self.use_exchange = self.parent.config.get('use_exchange', "Blockchain") self.parent.exchanges = EXCHANGES - self.parent.currencies = ["EUR","GBP","USD"] + self.parent.currencies = ["EUR","GBP","USD","PLN"] self.parent.win.emit(SIGNAL("refresh_exchanges_combo()")) self.parent.win.emit(SIGNAL("refresh_currencies_combo()")) self.is_running = False @@ -81,6 +84,8 @@ class Exchanger(threading.Thread): update_rates = { "BitcoinAverage": self.update_ba, "BitcoinVenezuela": self.update_bv, + "Bitcurex": self.update_bx, + "Bitmarket": self.update_bm, "BitPay": self.update_bp, "Blockchain": self.update_bc, "BTCChina": self.update_CNY, @@ -115,7 +120,7 @@ class Exchanger(threading.Thread): with self.lock: self.quote_currencies = quote_currencies self.parent.set_currencies(quote_currencies) - + def update_wd(self): try: winkresp = self.get_json('winkdex.com', "/static/data/0_600_288.json") @@ -133,7 +138,7 @@ class Exchanger(threading.Thread): except KeyError: pass self.parent.set_currencies(quote_currencies) - + def update_cv(self): try: jsonresp = self.get_json('www.cavirtex.com', "/api/CAD/ticker.json") @@ -149,6 +154,36 @@ class Exchanger(threading.Thread): pass self.parent.set_currencies(quote_currencies) + def update_bm(self): + try: + jsonresp = self.get_json('www.bitmarket.pl', "/json/BTCPLN/ticker.json") + except Exception: + return + quote_currencies = {"PLN": 0.0} + pln_price = jsonresp["last"] + try: + quote_currencies["PLN"] = decimal.Decimal(str(pln_price)) + with self.lock: + self.quote_currencies = quote_currencies + except KeyError: + pass + self.parent.set_currencies(quote_currencies) + + def update_bx(self): + try: + jsonresp = self.get_json('pln.bitcurex.com', "/data/ticker.json") + except Exception: + return + quote_currencies = {"PLN": 0.0} + pln_price = jsonresp["last"] + try: + quote_currencies["PLN"] = decimal.Decimal(str(pln_price)) + with self.lock: + self.quote_currencies = quote_currencies + except KeyError: + pass + self.parent.set_currencies(quote_currencies) + def update_CNY(self): try: jsonresp = self.get_json('data.btcchina.com', "/data/ticker") @@ -227,7 +262,7 @@ class Exchanger(threading.Thread): except KeyError: pass self.parent.set_currencies(quote_currencies) - + def update_bv(self): try: @@ -286,7 +321,7 @@ class Plugin(BasePlugin): def __init__(self,a,b): BasePlugin.__init__(self,a,b) - self.currencies = [self.config.get('currency', "EUR")] + self.currencies = [self.fiat_unit()] self.exchanges = [self.config.get('use_exchange', "Blockchain")] def init(self): @@ -297,18 +332,41 @@ class Plugin(BasePlugin): self.exchanger = Exchanger(self) self.exchanger.start() self.gui.exchanger = self.exchanger # + self.add_fiat_edit() def set_currencies(self, currency_options): self.currencies = sorted(currency_options) self.win.emit(SIGNAL("refresh_currencies()")) self.win.emit(SIGNAL("refresh_currencies_combo()")) + def get_fiat_balance_text(self, btc_balance, r): + # return balance as: 1.23 USD + r[0] = self.create_fiat_balance_text(Decimal(btc_balance) / 100000000) - def set_quote_text(self, btc_balance, r): - r[0] = self.create_quote_text(Decimal(btc_balance) / 100000000) + def get_fiat_price_text(self, r): + # return BTC price as: 123.45 USD + r[0] = self.create_fiat_balance_text(1) + quote = r[0] + if quote: + r[0] = "%s"%quote - def create_quote_text(self, btc_balance): - quote_currency = self.config.get("currency", "EUR") + def get_fiat_status_text(self, btc_balance, r2): + # return status as: (1.23 USD) 1 BTC~123.45 USD + text = "" + r = {} + self.get_fiat_price_text(r) + quote = r.get(0) + if quote: + price_text = "1 BTC~%s"%quote + fiat_currency = quote[-3:] + btc_price = self.btc_rate + fiat_balance = Decimal(btc_price) * (Decimal(btc_balance)/100000000) + balance_text = "(%.2f %s)" % (fiat_balance,fiat_currency) + text = " " + balance_text + " " + price_text + " " + r2[0] = text + + def create_fiat_balance_text(self, btc_balance): + quote_currency = self.fiat_unit() self.exchanger.use_exchange = self.config.get("use_exchange", "Blockchain") cur_rate = self.exchanger.exchange(Decimal("1.0"), quote_currency) if cur_rate is None: @@ -325,23 +383,23 @@ class Plugin(BasePlugin): for item in self.wallet.get_tx_history(self.wallet.storage.get("current_account", None)): tx_hash, conf, is_mine, value, fee, balance, timestamp = item tx_list[tx_hash] = {'value': value, 'timestamp': timestamp, 'balance': balance} - + self.tx_list = tx_list - + def requires_settings(self): return True def toggle(self): - out = BasePlugin.toggle(self) + enabled = BasePlugin.toggle(self) self.win.update_status() - if self.config.get('use_exchange_rate'): - try: - self.fiat_button - except: - self.gui.main_window.show_message("To see fiat amount when sending bitcoin, please restart Electrum to activate the new GUI settings.") - return out + self.win.tabs.removeTab(1) + new_send_tab = self.gui.main_window.create_send_tab() + self.win.tabs.insertTab(1, new_send_tab, _('Send')) + if enabled: + self.add_fiat_edit() + return enabled def close(self): @@ -349,6 +407,7 @@ class Plugin(BasePlugin): def history_tab_update(self): if self.config.get('history_rates', 'unchecked') == "checked": + cur_exchange = self.config.get('use_exchange', "Blockchain") try: tx_list = self.tx_list except Exception: @@ -356,13 +415,34 @@ class Plugin(BasePlugin): try: mintimestr = datetime.datetime.fromtimestamp(int(min(tx_list.items(), key=lambda x: x[1]['timestamp'])[1]['timestamp'])).strftime('%Y-%m-%d') - except ValueError: - return - maxtimestr = datetime.datetime.now().strftime('%Y-%m-%d') - try: - resp_hist = self.exchanger.get_json('api.coindesk.com', "/v1/bpi/historical/close.json?start=" + mintimestr + "&end=" + maxtimestr) except Exception: return + maxtimestr = datetime.datetime.now().strftime('%Y-%m-%d') + + if cur_exchange == "CoinDesk": + try: + resp_hist = self.exchanger.get_json('api.coindesk.com', "/v1/bpi/historical/close.json?start=" + mintimestr + "&end=" + maxtimestr) + except Exception: + return + elif cur_exchange == "Winkdex": + try: + resp_hist = self.exchanger.get_json('winkdex.com', "/static/data/0_86400_730.json")['prices'] + except Exception: + return + elif cur_exchange == "BitcoinVenezuela": + cur_currency = self.fiat_unit() + if cur_currency == "VEF": + try: + resp_hist = self.exchanger.get_json('api.bitcoinvenezuela.com', "/historical/index.php?coin=BTC")['VEF_BTC'] + except Exception: + return + elif cur_currency == "ARS": + try: + resp_hist = self.exchanger.get_json('api.bitcoinvenezuela.com', "/historical/index.php?coin=BTC")['ARS_BTC'] + except Exception: + return + else: + return self.gui.main_window.is_edit = True self.gui.main_window.history_list.setColumnCount(6) @@ -376,17 +456,35 @@ class Plugin(BasePlugin): except Exception: newtx = self.wallet.get_tx_history() v = newtx[[x[0] for x in newtx].index(str(item.data(0, Qt.UserRole).toPyObject()))][3] - - tx_info = {'timestamp':int(datetime.datetime.now().strftime("%s")), 'value': v } + + tx_info = {'timestamp':int(time.time()), 'value': v } pass tx_time = int(tx_info['timestamp']) - tx_time_str = datetime.datetime.fromtimestamp(tx_time).strftime('%Y-%m-%d') - try: - tx_USD_val = "%.2f %s" % (Decimal(str(tx_info['value'])) / 100000000 * Decimal(resp_hist['bpi'][tx_time_str]), "USD") - except KeyError: - tx_USD_val = "%.2f %s" % (self.btc_rate * Decimal(str(tx_info['value']))/100000000 , "USD") - - item.setText(5, tx_USD_val) + if cur_exchange == "CoinDesk": + tx_time_str = datetime.datetime.fromtimestamp(tx_time).strftime('%Y-%m-%d') + try: + tx_USD_val = "%.2f %s" % (Decimal(str(tx_info['value'])) / 100000000 * Decimal(resp_hist['bpi'][tx_time_str]), "USD") + except KeyError: + tx_USD_val = "%.2f %s" % (self.btc_rate * Decimal(str(tx_info['value']))/100000000 , "USD") + elif cur_exchange == "Winkdex": + tx_time_str = int(tx_time) - (int(tx_time) % (60 * 60 * 24)) + try: + tx_rate = resp_hist[[x['x'] for x in resp_hist].index(tx_time_str)]['y'] + tx_USD_val = "%.2f %s" % (Decimal(tx_info['value']) / 100000000 * Decimal(tx_rate), "USD") + except ValueError: + tx_USD_val = "%.2f %s" % (self.btc_rate * Decimal(tx_info['value'])/100000000 , "USD") + elif cur_exchange == "BitcoinVenezuela": + tx_time_str = datetime.datetime.fromtimestamp(tx_time).strftime('%Y-%m-%d') + try: + num = resp_hist[tx_time_str].replace(',','') + tx_BTCVEN_val = "%.2f %s" % (Decimal(str(tx_info['value'])) / 100000000 * Decimal(num), cur_currency) + except KeyError: + tx_BTCVEN_val = _("No data") + + if cur_exchange == "CoinDesk" or cur_exchange == "Winkdex": + item.setText(5, tx_USD_val) + elif cur_exchange == "BitcoinVenezuela": + item.setText(5, tx_BTCVEN_val) if Decimal(str(tx_info['value'])) < 0: item.setForeground(5, QBrush(QColor("#BC1E1E"))) @@ -395,7 +493,7 @@ class Plugin(BasePlugin): self.gui.main_window.history_list.setColumnWidth(4, 140) self.gui.main_window.history_list.setColumnWidth(5, 120) self.gui.main_window.is_edit = False - + def settings_widget(self, window): return EnterButton(_('Settings'), self.settings_dialog) @@ -422,9 +520,14 @@ class Plugin(BasePlugin): cur_request = str(self.currencies[x]) except Exception: return - if cur_request != self.config.get('currency', "EUR"): + if cur_request != self.fiat_unit(): self.config.set_key('currency', cur_request, True) - if cur_request == "USD" and self.config.get('use_exchange', "Blockchain") == "CoinDesk": + cur_exchange = self.config.get('use_exchange', "Blockchain") + if cur_request == "USD" and (cur_exchange == "CoinDesk" or cur_exchange == "Winkdex"): + hist_checkbox.setEnabled(True) + elif cur_request == "VEF" and (cur_exchange == "BitcoinVenezuela"): + hist_checkbox.setEnabled(True) + elif cur_request == "ARS" and (cur_exchange == "BitcoinVenezuela"): hist_checkbox.setEnabled(True) else: hist_checkbox.setChecked(False) @@ -448,8 +551,14 @@ class Plugin(BasePlugin): self.currencies = [] combo.clear() self.exchanger.query_rates.set() - if cur_request == "CoinDesk": - if self.config.get('currency', "EUR") == "USD": + cur_currency = self.fiat_unit() + if cur_request == "CoinDesk" or cur_request == "Winkdex": + if cur_currency == "USD": + hist_checkbox.setEnabled(True) + else: + disable_check() + elif cur_request == "BitcoinVenezuela": + if cur_currency == "VEF" or cur_currency == "ARS": hist_checkbox.setEnabled(True) else: disable_check() @@ -470,13 +579,16 @@ class Plugin(BasePlugin): self.gui.main_window.history_list.setColumnWidth(i, width) def set_hist_check(hist_checkbox): - if self.config.get('use_exchange', "Blockchain") == "CoinDesk": + cur_exchange = self.config.get('use_exchange', "Blockchain") + if cur_exchange == "CoinDesk" or cur_exchange == "Winkdex": + hist_checkbox.setEnabled(True) + elif cur_exchange == "BitcoinVenezuela": hist_checkbox.setEnabled(True) else: - hist_checkbox.setEnabled(False) - + hist_checkbox.setEnabled(False) + def set_currencies(combo): - current_currency = self.config.get('currency', "EUR") + current_currency = self.fiat_unit() try: combo.clear() except Exception: @@ -516,77 +628,38 @@ class Plugin(BasePlugin): layout.addWidget(combo_ex,0,1) layout.addWidget(hist_checkbox,2,1) layout.addWidget(ok_button,3,1) - + if d.exec_(): return True else: return False - - def fiat_unit(self): - r = {} - self.set_quote_text(100000000, r) - quote = r.get(0) - if quote: - return quote[-3:] - else: - return "???" - - def fiat_dialog(self): - if not self.config.get('use_exchange_rate'): - self.gui.main_window.show_message("To use this feature, first enable the exchange rate plugin.") - return - - if not self.gui.main_window.network.is_connected(): - self.gui.main_window.show_message("To use this feature, you must have a connection.") - return + return self.config.get("currency", "EUR") - quote_currency = self.config.get("currency", "EUR") - - d = QDialog(self.gui.main_window) - d.setWindowTitle("Fiat") - vbox = QVBoxLayout(d) - text = "Amount to Send in " + quote_currency - vbox.addWidget(QLabel(_(text)+':')) - - grid = QGridLayout() - fiat_e = AmountEdit(self.fiat_unit) - grid.addWidget(fiat_e, 1, 0) - - r = {} - self.set_quote_text(100000000, r) - quote = r.get(0) - if quote: - text = " 1 BTC=%s"%quote - grid.addWidget(QLabel(_(text)), 4, 0, 3, 0) - - vbox.addLayout(grid) - vbox.addLayout(ok_cancel_buttons(d)) - - if not d.exec_(): - return - - fiat = str(fiat_e.text()) - - if str(fiat) == "" or str(fiat) == ".": - fiat = "0" - - r = {} - self.set_quote_text(100000000, r) - quote = r.get(0) - if not quote: - self.gui.main_window.show_message("Exchange rate not available. Please check your connection.") - return - else: - quote = quote[:-4] - btcamount = Decimal(fiat) / Decimal(quote) - if str(self.gui.main_window.base_unit()) == "mBTC": - btcamount = btcamount * 1000 - quote = "%.8f"%btcamount - self.gui.main_window.amount_e.setText( quote ) - - def exchange_rate_button(self, grid): - quote_currency = self.config.get("currency", "EUR") - self.fiat_button = EnterButton(_(quote_currency), self.fiat_dialog) - grid.addWidget(self.fiat_button, 4, 3, Qt.AlignHCenter) + def add_fiat_edit(self): + self.fiat_e = AmountEdit(self.fiat_unit) + self.btc_e = self.win.amount_e + grid = self.btc_e.parent() + def fiat_changed(): + try: + fiat_amount = Decimal(str(self.fiat_e.text())) + except: + self.btc_e.setText("") + return + exchange_rate = self.exchanger.exchange(Decimal("1.0"), self.fiat_unit()) + if exchange_rate is not None: + btc_amount = fiat_amount/exchange_rate + self.btc_e.setAmount(int(btc_amount*Decimal(100000000))) + self.fiat_e.textEdited.connect(fiat_changed) + def btc_changed(): + btc_amount = self.btc_e.get_amount() + if btc_amount is None: + self.fiat_e.setText("") + return + fiat_amount = self.exchanger.exchange(Decimal(btc_amount)/Decimal(100000000), self.fiat_unit()) + if fiat_amount is not None: + self.fiat_e.setText("%.2f"%fiat_amount) + self.btc_e.textEdited.connect(btc_changed) + self.btc_e.frozen.connect(lambda: self.fiat_e.setFrozen(self.btc_e.isReadOnly())) + self.win.send_grid.addWidget(self.fiat_e, 4, 3, Qt.AlignHCenter)