summaryrefslogtreecommitdiffstats
path: root/py3status
diff options
context:
space:
mode:
authorAndré Doser <doser.andre@gmail.com>2015-01-26 18:50:06 +0100
committerAndré Doser <doser.andre@gmail.com>2015-01-26 18:50:06 +0100
commitc055b6c7842a48029d3326742d93a4ed685636ac (patch)
tree11a5954fd38f3009dc18207efe8117c4008d54b0 /py3status
parente64255f98b85820046e261027a1f20c67f766f41 (diff)
Bitcoin price checker
Diffstat (limited to 'py3status')
-rw-r--r--py3status/modules/bitcoin-price-checker.py102
1 files changed, 102 insertions, 0 deletions
diff --git a/py3status/modules/bitcoin-price-checker.py b/py3status/modules/bitcoin-price-checker.py
new file mode 100644
index 0000000..3549866
--- /dev/null
+++ b/py3status/modules/bitcoin-price-checker.py
@@ -0,0 +1,102 @@
+# -*- coding: utf-8 -*-
+"""
+Module for displaying bitcoin prices.
+
+Written and contributed by @tasse:
+ Andre Doser <doser.andre AT gmail.com>
+"""
+import json
+import urllib.request as ul
+from time import time
+from collections import defaultdict
+import re
+
+lastPrices = defaultdict(float)
+
+
+class Py3status:
+ # btc-e, api,bitfinex, bitstamp, bitpay
+ websites = 'btc-e, bitstamp'
+ value = 'last'
+ cache_timeout = 5
+
+ def __init__(self):
+ self._hoster = {'https://btc-e.com/api/2/btc_usd/ticker': self._get_btce,
+ 'https://bitstamp.net/api/ticker/': self._get_bitstamp,
+ 'https://api.bitfinex.com/v1/pubticker/BTCUSD': self._get_bitfinex,
+ 'https://bitpay.com/api/rates': self._get_bitpay}
+
+ # returns the price for a given site in USD
+ # value is elem of {high, low, avg, last}
+ def _get_btce(self, url, value):
+ try:
+ data = json.loads(ul.urlopen(url).read().decode())
+ # default is 'last' price
+ value = data['ticker'].get(value, data['ticker']['last'])
+ except:
+ value = 'N/A'
+ return 'BTC-e', value
+
+ def _get_bitstamp(self, url, value):
+ # bitstamp API is different in the following
+ if value == 'avg':
+ value = 'vwap'
+ try:
+ data = json.loads(ul.urlopen(url).read().decode())
+ value = data.get(value, data['last'])
+ except:
+ value = 'N/A'
+ return 'BS', value
+
+ def _get_bitfinex(self, url, value):
+ # bitfinex API is different in the following
+ if value == 'avg':
+ value = 'mid'
+ if value == 'last':
+ value = 'last_price'
+ try:
+ data = json.loads(ul.urlopen(url).read().decode())
+ value = data.get(value, data['last_price'])
+ except:
+ value = 'N/A'
+ return 'BF', value
+
+ def _get_bitpay(self, url, value):
+ try:
+ data = json.loads(ul.urlopen(url).read().decode())
+ value = [x['rate'] for x in data if x['code'] == 'USD'][0]
+ except:
+ value = 'N/A'
+ return 'BP', value
+
+ def get_rate(self, i3s_output_list, i3s_config):
+ response = {'full_text': '', 'name': 'bitcoin rates',
+ 'cached_until': time() + self.cache_timeout}
+ rates = []
+ cnt = 0
+ for url, f in self._hoster.items():
+ rgx = re.search('.*//(.*)\..*', url).group(1)
+ if rgx not in self.websites:
+ continue
+ name, rate = f(url, self.value)
+ rates.append('{}: '.format(name)
+ + ('N/A' if rate == 'N/A'
+ else ('{:.2f}$'.format(float(rate)))))
+ lastPrices[f] = rate
+ cnt += 1
+ # don't color multiple sites
+ if cnt == 1:
+ if rate < lastPrices[f]:
+ response['color'] = i3s_config['color_bad']
+ elif rate > lastPrices[f]:
+ response['color'] = i3s_config['color_good']
+ response['full_text'] = ', '.join(rates)
+ return response
+
+if __name__ == '__main__':
+ from time import sleep
+ x = Py3status()
+ while True:
+ print(x.get_rate([], {'color_good': 'green',
+ 'color_bad': 'red'}))
+ sleep(1)