grzejnik/grzejnik.py

103 lines
2.5 KiB
Python

import bs4
import flask
import functools
import re
import requests
import time
app = flask.Flask(__name__)
def _cached(f):
f._cache = None
f._cache_time = None
@functools.wraps(f)
def wrapper(*args, **kwargs):
if f._cache is None or f._cache_time + 60 < time.time():
res = f(*args, **kwargs)
f._cache_time = time.time()
f._cache = res
return res
else:
return f._cache
return wrapper
@_cached
def get_stats():
t = requests.get("http://xpm.syware.de/?a=AT1tRrSHYEBSy9tA24GgHy3qKyDKhfAwys").text
soup = bs4.BeautifulSoup(t)
pre = str(soup.body.pre)
m = re.search(r"([0-9\.]+) [0-9\.]+\t([0-9\.]+) XPM/h", pre)
speed = float(m.group(2))
m = re.search(r"([0-9]+)\t([0-9][0-9]\.[0-9][0-9])\. ([0-9][0-9]:[0-9][0-9])\t([0-9\.]+)\t\+([0-9\.]+)\t([0-9\.]+)", pre)
block, date, time, total, add, balance = m.groups()
return speed, (date, time, total, add, balance)
@_cached
def get_exchange_rate():
j = requests.get('https://crypto-trade.com/rfetch/23').json()
rate = j["values"][-1][2]
return rate
@app.template_filter('real_money')
def real_money(xpm):
xpm = float(xpm)
return '{:.2f} USD'.format(xpm * get_exchange_rate())
MINERS = {}
MINER_TIMEOUT = 120
def get_miners():
# first, get rid of stale miners
global MINERS
to_delete = set()
for name, miner in MINERS.iteritems():
if miner['time'] + MINER_TIMEOUT < time.time():
to_delete.add(name)
for td in to_delete:
del MINERS[td]
return MINERS
@app.route('/report-miner/<name>/<int:threads>')
def view_report_miner(name, threads):
MINERS[name] = { 'name': name, 'threads': threads,
'time': time.time()}
return flask.jsonify({'status': 'ok'})
@app.route('/')
def view_index():
speed, (date, time, total, add, balance) = get_stats()
# hack
at = '{}.2014 {}'.format(date, time)
return flask.render_template('status.html', speed=speed, add=add, at=at,
total=total, miners=get_miners())
@app.route('/api')
def view_api():
speed, (date, time, total, add, balance) = get_stats()
result = {
'speed': float(speed),
'total': float(total),
'last_share': {
'time': time,
'date': date,
'add': add
},
'power_used': '1.21 jiggowats',
}
return flask.jsonify(result)
if __name__ == '__main__':
app.run(debug=True)