From 13a1caccd27b872da03c275d2c2bbbc112bca1e2 Mon Sep 17 00:00:00 2001 From: Fedor Date: Wed, 9 Aug 2017 13:46:25 +0300 Subject: [PATCH] Module for fetching and displays exchange rates with EXMO (#600) * Module for fetching and displays exchange rates with EXMO * Fix bug with default value for pair settings * Handle error with fetching data --- i3pystatus/exmo.py | 102 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 i3pystatus/exmo.py diff --git a/i3pystatus/exmo.py b/i3pystatus/exmo.py new file mode 100644 index 0000000..9778849 --- /dev/null +++ b/i3pystatus/exmo.py @@ -0,0 +1,102 @@ +# -*- coding: utf-8 -*- + +import requests + +from i3pystatus import IntervalModule, formatp +from i3pystatus.core.util import internet, require, user_open + + +class Exmo(IntervalModule): + """ + This module fetching and displays exchange rates with EXMO. + Using API . + + .. rubric:: Available formatters + + * {buy_price} + * {status} + * {pair} + + """ + + settings = ( + ('format', 'Format string used for output'), + ('pair', 'Currency pair for display on output'), + ('color', 'Standard color'), + ('colorize', 'Enable color change on price increase/decrease'), + ('color_up', 'Color for price increases'), + ('color_down', 'Color for price decreases'), + ('interval', 'Update interval.'), + 'status' + ) + format = '{buy_price}[ {status}] {pair}' + pair = 'BTC_USD' + color = '#FFFFFF' + colorize = False + color_up = '#00FF00' + color_down = '#FF0000' + interval = 60 + status = { + 'price_up': '▲', + 'price_down': '▼', + } + + _prev_price = 0 + _prev_status = '' + _prev_color = '#FFFFFF' + + def __init__(self, *args, **kwargs): + super(Exmo, self).__init__(*args, **kwargs) + self.on_leftclick = [ + 'open_something', + 'https://exmo.me/ru/trade#?pair={}'.format(self.pair) + ] + + def fetch_data(self): + response = requests.get('https://api.exmo.com/v1/ticker/') + return response.json() + + @require(internet) + def run(self): + try: + price_data = self.fetch_data().get(self.pair) + except Exception as e: + self.output = { + 'full_text': 'Failed fetching data from server: ' + str(e), + 'color': '#FF0000' + } + return + fdict = { + 'pair': self.pair.replace('_', '/'), + 'buy_price': price_data.get('buy_price', 0), + 'status': '' + } + color = self.color + + if self._prev_price and fdict['buy_price'] > self._prev_price: + color = self.color_up + fdict['status'] = self.status['price_up'] + elif self._prev_price and fdict['buy_price'] < self._prev_price: + color = self.color_down + fdict['status'] = self.status['price_down'] + else: + color = self._prev_color + fdict['status'] = self._prev_status + + self._prev_price = price_data.get('buy_price', 0) + self._prev_status = fdict['status'] + self._prev_color = color + + if not self.colorize: + color = self.color + + self.output = { + 'full_text': formatp(self.format, **fdict).strip(), + 'color': color + } + + def open_something(self, url_or_command): + """ + Wrapper function, to pass the arguments to user_open + """ + user_open(url_or_command)