103 lines
2.5 KiB
Python
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)
|