electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 746cf6f7f378bb28d7e039b00528dcb533e19f74
parent 4a97aa1d1e629b279400f3d3661b413ed7220f50
Author: ThomasV <thomasv1@gmx.de>
Date:   Sun,  2 Mar 2014 18:21:03 +0100

Merge pull request #588 from wozz/for-upstream

Add CoinDesk BPI for exchange rate
Diffstat:
Mgui/qt/lite_window.py | 18++++++++++++++++++
Mplugins/exchange_rate.py | 101++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
2 files changed, 110 insertions(+), 9 deletions(-)

diff --git a/gui/qt/lite_window.py b/gui/qt/lite_window.py @@ -178,8 +178,10 @@ class MiniWindow(QDialog): self.actuator = actuator self.config = config self.btc_balance = None + self.use_exchanges = ["Blockchain", "CoinDesk"] self.quote_currencies = ["BRL", "CNY", "EUR", "GBP", "RUB", "USD"] self.actuator.set_configured_currency(self.set_quote_currency) + self.actuator.set_configured_exchange(self.set_exchange) # Needed because price discovery is done in a different thread # which needs to be sent back to this main one to update the GUI @@ -370,6 +372,13 @@ class MiniWindow(QDialog): def deactivate(self): pass + def set_exchange(self, use_exchange): + if use_exchange not in self.use_exchanges: + return + self.use_exchanges.remove(use_exchange) + self.use_exchanges.insert(0, use_exchange) + self.refresh_balance() + def set_quote_currency(self, currency): """Set and display the fiat currency country.""" if currency not in self.quote_currencies: @@ -675,6 +684,11 @@ class MiniActuator: self.theme_name = theme_name self.g.config.set_key('litegui_theme',theme_name) self.load_theme() + + def set_configured_exchange(self, set_exchange): + use_exchange = self.g.config.get('use_exchange') + if use_exchange is not None: + set_exchange(use_exchange) def set_configured_currency(self, set_quote_currency): """Set the inital fiat currency conversion country (USD/EUR/GBP) in @@ -685,6 +699,10 @@ class MiniActuator: if currency is not None: set_quote_currency(currency) + def set_config_exchange(self, conversion_exchange): + self.g.config.set_key('exchange',conversion_exchange,True) + self.g.update_status() + def set_config_currency(self, conversion_currency): """Change the wallet fiat currency country.""" self.g.config.set_key('currency',conversion_currency,True) diff --git a/plugins/exchange_rate.py b/plugins/exchange_rate.py @@ -20,6 +20,11 @@ class Exchanger(threading.Thread): self.parent = parent self.quote_currencies = None self.lock = threading.Lock() + self.use_exchange = self.parent.config.get('use_exchange', "CoinDesk") + self.parent.exchanges = ["CoinDesk", "Blockchain"] + self.parent.currencies = ["EUR","GBP","USD"] + self.parent.win.emit(SIGNAL("refresh_exchanges_combo()")) + self.parent.win.emit(SIGNAL("refresh_currencies_combo()")) self.is_running = False def exchange(self, btc_amount, quote_currency): @@ -29,7 +34,21 @@ class Exchanger(threading.Thread): quote_currencies = self.quote_currencies.copy() if quote_currency not in quote_currencies: return None - return btc_amount * quote_currencies[quote_currency] + if self.use_exchange == "CoinDesk": + try: + connection = httplib.HTTPSConnection('api.coindesk.com') + connection.request("GET", "/v1/bpi/currentprice/" + str(quote_currency) + ".json") + except Exception: + return + resp = connection.getresponse() + if resp.reason == httplib.responses[httplib.NOT_FOUND]: + return + try: + resp_rate = json.loads(resp.read()) + except Exception: + return + return btc_amount * decimal.Decimal(str(resp_rate["bpi"][str(quote_currency)]["rate_float"])) + return btc_amount * decimal.Decimal(quote_currencies[quote_currency]) def stop(self): self.is_running = False @@ -37,12 +56,38 @@ class Exchanger(threading.Thread): def run(self): self.is_running = True while self.is_running: - self.update() - time.sleep(120) + self.use_exchange = self.parent.config.get('use_exchange', "Blockchain") + if self.use_exchange == "Blockchain": + self.update_bc() + elif self.use_exchange == "CoinDesk": + self.update_cd() + time.sleep(150) + + def update_cd(self): + try: + connection = httplib.HTTPSConnection('api.coindesk.com') + connection.request("GET", "/v1/bpi/supported-currencies.json") + except Exception: + return + response = connection.getresponse() + if response.reason == httplib.responses[httplib.NOT_FOUND]: + return + try: + resp_currencies = json.loads(response.read()) + except Exception: + return + + quote_currencies = {} + for cur in resp_currencies: + quote_currencies[str(cur["currency"])] = 0.0 + with self.lock: + self.quote_currencies = quote_currencies + self.parent.set_currencies(quote_currencies) - def update(self): + + def update_bc(self): try: - connection = httplib.HTTPConnection('blockchain.info') + connection = httplib.HTTPSConnection('blockchain.info') connection.request("GET", "/ticker") except Exception: return @@ -84,6 +129,7 @@ class Plugin(BasePlugin): def __init__(self,a,b): BasePlugin.__init__(self,a,b) self.currencies = [self.config.get('currency', "EUR")] + self.exchanges = [self.config.get('use_exchange', "CoinDesk")] def init(self): self.win = self.gui.main_window @@ -93,16 +139,18 @@ class Plugin(BasePlugin): self.exchanger.start() self.gui.exchanger = self.exchanger # - def set_currencies(self, quote_currencies): - self.currencies = sorted(quote_currencies.keys()) + 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 set_quote_text(self, btc_balance, r): r[0] = self.create_quote_text(Decimal(btc_balance) / 100000000) def create_quote_text(self, btc_balance): quote_currency = self.config.get("currency", "EUR") + self.exchanger.use_exchange = self.config.get("use_exchange", "Blockchain") quote_balance = self.exchanger.exchange(btc_balance, quote_currency) if quote_balance is None: quote_text = "" @@ -126,7 +174,15 @@ class Plugin(BasePlugin): def settings_widget(self, window): + return EnterButton(_('Settings'), self.settings_dialog) + + def settings_dialog(self): + d = QDialog() + layout = QGridLayout(d) + layout.addWidget(QLabel("Exchange rate API: "), 0, 0) + layout.addWidget(QLabel("Currency: "), 1, 0) combo = QComboBox() + combo_ex = QComboBox() def on_change(x): cur_request = str(self.currencies[x]) @@ -134,6 +190,12 @@ class Plugin(BasePlugin): self.config.set_key('currency', cur_request, True) self.win.update_status() + def on_change_ex(x): + cur_request = str(self.exchanges[x]) + if cur_request != self.config.get('use_exchange', "CoinDesk"): + self.config.set_key('use_exchange', cur_request, True) + self.win.update_status() + def set_currencies(combo): try: combo.clear() @@ -146,10 +208,31 @@ class Plugin(BasePlugin): index = 0 combo.setCurrentIndex(index) + def set_exchanges(combo_ex): + try: + combo_ex.clear() + except Exception: + return + combo_ex.addItems(self.exchanges) + try: + index = self.exchanges.index(self.config.get('use_exchange', "Blockchain")) + except Exception: + index = 0 + combo_ex.setCurrentIndex(index) + + set_exchanges(combo_ex) set_currencies(combo) combo.currentIndexChanged.connect(on_change) - combo.connect(window, SIGNAL('refresh_currencies_combo()'), lambda: set_currencies(combo)) - return combo + combo_ex.currentIndexChanged.connect(on_change_ex) + combo.connect(d, SIGNAL('refresh_currencies_combo()'), lambda: set_currencies(combo)) + combo_ex.connect(d, SIGNAL('refresh_exchanges_combo()'), lambda: set_exchanges(combo_ex)) + layout.addWidget(combo,1,1) + layout.addWidget(combo_ex,0,1) + + if d.exec_(): + return True + else: + return False