[modules/currency] Enable base and symbol configuration

The "base" currency can now be configured using the parameter "source",
and the "symbols" to be resolved can be configured using the parameter
"destination", which is a comma-separated list.

see #169
This commit is contained in:
Tobias Witek 2017-09-10 09:34:02 +02:00
parent b4dcfb792c
commit bf53c5912c

View file

@ -8,6 +8,10 @@ Requires the following python packages:
Parameters: Parameters:
* currency.interval: Interval in minutes between updates, default is 1. * currency.interval: Interval in minutes between updates, default is 1.
* currency.source: Source currency (defaults to "GBP")
* currency.destination: Comma-separated list of destination currencies (defaults to "USD,EUR")
Note: source and destination names right now must correspond to the names used by the API of http://fixer.io
""" """
import bumblebee.input import bumblebee.input
@ -21,40 +25,40 @@ try:
except ImportError: except ImportError:
pass pass
SYMBOL = {
"GBP": u"£", "EUR": u"", "USD": u"$"
}
class Module(bumblebee.engine.Module): class Module(bumblebee.engine.Module):
def __init__(self, engine, config): def __init__(self, engine, config):
super(Module, self).__init__(engine, config, super(Module, self).__init__(engine, config,
bumblebee.output.Widget(full_text=self.price) bumblebee.output.Widget(full_text=self.price)
) )
self._price = "-" self._data = {}
self._interval = int(self.parameter("interval", "1")) self._interval = int(self.parameter("interval", 1))
self._base = self.parameter("source", "GBP")
self._symbols = self.parameter("destination", "USD,EUR")
self._nextcheck = 0 self._nextcheck = 0
self._valid = False
def price(self, widget): def price(self, widget):
if not self._valid: if self._data == {}:
return u"?" return "?"
return self._price
rates = []
for sym in self._data["rates"]:
rates.append(u"{}{}".format(self._data["rates"][sym], SYMBOL[sym] if sym in SYMBOL else sym))
return u"{}: {}".format(SYMBOL[self._base] if self._base in SYMBOL else self._base, u"/".join(rates))
def update(self, widgets): def update(self, widgets):
timestamp = int(time.time()) timestamp = int(time.time())
if self._nextcheck < int(time.time()): if self._nextcheck < int(time.time()):
try: self._data = {}
self._nextcheck = int(time.time()) + self._interval*60 self._nextcheck = int(time.time()) + self._interval*60
price_url = "http://api.fixer.io/latest?symbols=USD,EUR&base=GBP" url = "http://api.fixer.io/latest?symbols={}&base={}".format(self._symbols, self._base)
try: try:
price_json = json.loads( requests.get(price_url).text ) self._data = json.loads(requests.get(url).text)
gbpeur = str(price_json['rates']['EUR']) except Exception:
gbpusd = str(price_json['rates']['USD']) pass
except ValueError:
gbpeur = "-"
gbpusd = "-"
self._price = u"£/€ " + gbpeur + u" | £/$ " + gbpusd
self._valid = True
except RequestException:
self._price = u"£/€ - | £/$ -"
self._valid = True
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4