diff --git a/i3pystatus/coin.py b/i3pystatus/coin.py new file mode 100644 index 0000000..aa55a7f --- /dev/null +++ b/i3pystatus/coin.py @@ -0,0 +1,80 @@ +import requests +import json + +from i3pystatus import IntervalModule +from i3pystatus.core.util import internet, require + + +class Coin(IntervalModule): + """ + Fetches live data of all cryptocurrencies availible at coinmarketcap . + Coin setting should be equal to the 'id' field of your coin in . + + Example coin settings: bitcoin, bitcoin-cash, ethereum, litecoin, dash, lisk. + Example currency settings: usd, eur, huf. + + .. rubric:: Available formatters + + * {symbol} + * {price} + * {rank} + * {24h_volume} + * {market_cap} + * {available_supply} + * {total_supply} + * {max_supply} + * {percent_change_1h} + * {percent_change_24h} + * {percent_change_7d} + * {last_updated} - time of last update on the API's part + * {status} + """ + + settings = ( + ("format", "format string used for output."), + ("coin", "cryptocurrency to fetch"), + ("currency", "fiat currency to show fiscal data"), + ("symbol", "coin symbol"), + ("interval", "update interval in seconds"), + ("status_interval", "percent change status in the last: '1h' / '24h' / '7d'") + ) + + symbol = "¤" + format = "{symbol} {price}{status}" + coin = "ethereum" + currency = "USD" + interval = 600 + status_interval = "24h" + + def fetch_data(self): + response = requests.get("https://api.coinmarketcap.com/v1/ticker/{}/?convert={}".format(self.coin, self.currency)) + coin_data = response.json()[0] + coin_data["price"] = coin_data.pop("price_{}".format(self.currency.lower())) + coin_data["24h_volume"] = coin_data.pop("24h_volume_{}".format(self.currency.lower())) + coin_data["market_cap"] = coin_data.pop("market_cap_{}".format(self.currency.lower())) + coin_data["symbol"] = self.symbol + return coin_data + + def set_status(self, change): + if change > 10: + return '⮅' + elif change > 0: + return '⭡' + elif change < -10: + return '⮇' + elif change < 0: + return '⭣' + else: + return '' + + @require(internet) + def run(self): + fdict = self.fetch_data() + + symbols = dict(bitcoin='฿', ethereum='Ξ', litecoin='Ł', dash='Đ') + if self.coin in symbols: + fdict["symbol"] = symbols[self.coin] + fdict["status"] = self.set_status(float(fdict["percent_change_{}".format(self.status_interval)])) + + self.data = fdict + self.output = {"full_text": self.format.format(**fdict)}