X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=plugins%2Fexchange_rate.py;h=f8713a78ea64e89e6c5e78d5c4ebf9c08cda5847;hb=068609b4a65a172a15a24299b8a0fad0ef82898c;hp=892a6b04ef78a776d39166d76a00e45e2da24c65;hpb=5619859386ffe20ab18343c235c5312fbfde7fb8;p=electrum-nvc.git diff --git a/plugins/exchange_rate.py b/plugins/exchange_rate.py index 892a6b0..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,6 +332,7 @@ 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) @@ -323,14 +359,14 @@ class Plugin(BasePlugin): if quote: price_text = "1 BTC~%s"%quote fiat_currency = quote[-3:] - btc_price = quote[:-4] + 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.config.get("currency", "EUR") + 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: @@ -347,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): @@ -371,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: @@ -378,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) @@ -398,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"))) @@ -417,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) @@ -444,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) @@ -470,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() @@ -492,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: @@ -538,66 +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): - quote_currency = self.config.get("currency", "???") - return quote_currency - - 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 network connection.")) - return - - quote_currency = self.fiat_unit() - - d = QDialog(self.gui.main_window) - d.setWindowTitle("Fiat") - vbox = QVBoxLayout(d) - text = "Amount to Send in " + quote_currency - vbox.addWidget(QLabel(_(text)+':')) + return self.config.get("currency", "EUR") - grid = QGridLayout() - fiat_e = AmountEdit(self.fiat_unit) - grid.addWidget(fiat_e, 1, 0) - - r = {} - self.get_fiat_price_text(r) - quote = r.get(0) - if quote: - text = "1 BTC~%s"%quote - grid.addWidget(QLabel(_(text)), 4, 0, 3, 0) - else: - self.gui.main_window.show_message(_("Exchange rate not available. Please check your network connection.")) - return - - 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" - - 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)