Add Bitcoin module
This commit is contained in:
parent
33aba4b084
commit
82df60fdd6
130
i3pystatus/bitcoin.py
Normal file
130
i3pystatus/bitcoin.py
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
import urllib.request
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
|
||||||
|
from i3pystatus import IntervalModule
|
||||||
|
from i3pystatus.core.util import internet, require, user_open
|
||||||
|
|
||||||
|
|
||||||
|
class Bitcoin(IntervalModule):
|
||||||
|
|
||||||
|
"""
|
||||||
|
This module fetches and displays current Bitcoin market prices and
|
||||||
|
optionally monitors transactions to and from a list of user-specified
|
||||||
|
wallet addresses. Market data is pulled from the BitcoinAverage Price
|
||||||
|
Index API <https://bitcoinaverage.com> while transaction data is pulled
|
||||||
|
from blockchain.info <https://blockchain.info/api/blockchain_api>.
|
||||||
|
|
||||||
|
Available formatters:
|
||||||
|
|
||||||
|
* {last_price}
|
||||||
|
* {ask_price}
|
||||||
|
* {bid_price}
|
||||||
|
* {daily_average}
|
||||||
|
* {volume}
|
||||||
|
* {status}
|
||||||
|
* {last_tx_type}
|
||||||
|
* {last_tx_addr}
|
||||||
|
* {last_tx_value}
|
||||||
|
* {balance_btc}
|
||||||
|
* {balance_fiat}
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
settings = (
|
||||||
|
("format", "Format string used for output."),
|
||||||
|
("currency", "Base fiat currency used for pricing."),
|
||||||
|
("wallet_addresses", "List of wallet address(es) to monitor."),
|
||||||
|
("color", "Standard color"),
|
||||||
|
("colorize", "Enable color change on price increase/decrease"),
|
||||||
|
("color_up", "Color for price increases"),
|
||||||
|
("color_down", "Color for price decreases"),
|
||||||
|
("leftclick", "URL to visit or command to run on left click"),
|
||||||
|
("rightclick", "URL to visit or command to run on right click"),
|
||||||
|
("interval", "Update interval."),
|
||||||
|
"status"
|
||||||
|
)
|
||||||
|
format = "฿ {status}{last_price}"
|
||||||
|
currency = "USD"
|
||||||
|
wallet_addresses = ""
|
||||||
|
color = "#FFFFFF"
|
||||||
|
colorize = False
|
||||||
|
color_up = "#00FF00"
|
||||||
|
color_down = "#FF0000"
|
||||||
|
leftclick = "electrum"
|
||||||
|
rightclick = "https://bitcoinaverage.com/"
|
||||||
|
interval = 600
|
||||||
|
status = {
|
||||||
|
"price_up": "▲",
|
||||||
|
"price_down": "▼",
|
||||||
|
}
|
||||||
|
|
||||||
|
_price_prev = 0
|
||||||
|
|
||||||
|
def _fetch_price_data(self):
|
||||||
|
api = "https://api.bitcoinaverage.com/ticker/global/"
|
||||||
|
url = "{}{}".format(api, self.currency.upper())
|
||||||
|
return json.loads(urllib.request.urlopen(url).read().decode("utf-8"))
|
||||||
|
|
||||||
|
def _fetch_blockchain_data(self):
|
||||||
|
api = "https://blockchain.info/multiaddr?active="
|
||||||
|
addresses = "|".join(self.wallet_addresses)
|
||||||
|
url = "{}{}".format(api, addresses)
|
||||||
|
return json.loads(urllib.request.urlopen(url).read().decode("utf-8"))
|
||||||
|
|
||||||
|
|
||||||
|
@require(internet)
|
||||||
|
def run(self):
|
||||||
|
price_data = self._fetch_price_data()
|
||||||
|
fdict = {
|
||||||
|
"daily_average": price_data["24h_avg"],
|
||||||
|
"ask_price": price_data["ask"],
|
||||||
|
"bid_price": price_data["bid"],
|
||||||
|
"last_price": price_data["last"],
|
||||||
|
"volume": price_data["volume_btc"],
|
||||||
|
}
|
||||||
|
|
||||||
|
if self._price_prev and fdict["last_price"] > self._price_prev:
|
||||||
|
color = self.color_up
|
||||||
|
fdict["status"] = self.status["price_up"]
|
||||||
|
elif self._price_prev and fdict["last_price"] > self._price_prev:
|
||||||
|
color = self.color_down
|
||||||
|
fdict["status"] = self.status["price_down"]
|
||||||
|
else:
|
||||||
|
color = self.color
|
||||||
|
fdict["status"] = ""
|
||||||
|
self._price_prev = fdict["last_price"]
|
||||||
|
|
||||||
|
if not self.colorize:
|
||||||
|
color = self.color
|
||||||
|
|
||||||
|
if self.wallet_addresses:
|
||||||
|
blockchain_data = self._fetch_blockchain_data()
|
||||||
|
wallet_data = blockchain_data["wallet"]
|
||||||
|
balance_btc = wallet_data["final_balance"]/100000000
|
||||||
|
fdict["balance_btc"] = round(balance_btc, 2)
|
||||||
|
balance_fiat = fdict["balance_btc"] * fdict["last_price"]
|
||||||
|
fdict["balance_fiat"] = round(balance_fiat, 2)
|
||||||
|
fdict["total_sent"] = wallet_data["total_sent"]
|
||||||
|
fdict["total_received"] = wallet_data["total_received"]
|
||||||
|
fdict["transactions"] = wallet_data["n_tx"]
|
||||||
|
|
||||||
|
if fdict["transactions"]:
|
||||||
|
last_tx = blockchain_data["txs"][0]
|
||||||
|
fdict["last_tx_addr"] = last_tx["out"][0]["addr"]
|
||||||
|
fdict["last_tx_value"] = last_tx["out"][0]["value"]/100000000
|
||||||
|
if fdict["last_tx_addr"] in self.wallet_addresses:
|
||||||
|
fdict["last_tx_type"] = "recv"
|
||||||
|
else:
|
||||||
|
fdict["last_tx_type"] = "sent"
|
||||||
|
|
||||||
|
self.output = {
|
||||||
|
"full_text": self.format.format(**fdict),
|
||||||
|
"color": color,
|
||||||
|
}
|
||||||
|
|
||||||
|
def on_leftclick(self):
|
||||||
|
user_open(self.leftclick)
|
||||||
|
|
||||||
|
def on_rightclick(self):
|
||||||
|
user_open(self.rightclick)
|
Loading…
Reference in New Issue
Block a user