Browse Source

Add CoinDesk BPI for exchange rate

Add CoinDesk BPI for exchange rate options. Choose between blockchain
and coindesk on the plugin settings page.
283
Michael Wozniak 11 years ago
parent
commit
d30fb5c473
  1. 18
      gui/qt/lite_window.py
  2. 101
      plugins/exchange_rate.py

18
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)

101
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

Loading…
Cancel
Save