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
This commit is contained in:
parent
2314277b94
commit
13a1caccd2
102
i3pystatus/exmo.py
Normal file
102
i3pystatus/exmo.py
Normal file
@ -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 <https://exmo.me/en/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)
|
Loading…
Reference in New Issue
Block a user