neroswap/app/routes/meta.py

82 lines
2.6 KiB
Python

import arrow
from statistics import mean
from flask import redirect, url_for, request, Blueprint, render_template
from sqlalchemy import func
from app.models import Swap
from app.routes.api import get_prices, perform_conversion
from app.library.crypto import monero, wownero, wow_wallet, xmr_wallet
from app import config
bp = Blueprint('meta', 'meta')
@bp.route('/')
def index():
return render_template('index.html')
@bp.route('/stats')
def stats():
total_earnings = get_total_earnings()
broken_down_earnings = get_broken_down_earnings()
stats = get_swap_stats()
token = config.STATS_TOKEN == request.args.get('token')
swaps = Swap.query.all()
if not request.args.get('all'):
swaps = [s for s in swaps if s.hours_elapsed() < 120]
return render_template(
'stats.html',
wow_balances=wow_wallet.balances(),
xmr_balances=xmr_wallet.balances(),
earnings=total_earnings,
breakdown=broken_down_earnings,
stats=stats,
token=token,
swaps=swaps
)
def get_swap_stats():
details = {
'completed': Swap.query.filter(Swap.completed == True).count(),
'pending': Swap.query.filter(Swap.completed == False, Swap.funds_received == False).count(),
'total': Swap.query.count(),
'in_progress': Swap.query.filter(Swap.completed == False, Swap.funds_received == True).count(),
'wow_to_xmr': Swap.query.filter(Swap.wow_to_xmr == True).count(),
'xmr_to_wow': Swap.query.filter(Swap.wow_to_xmr == False).count(),
}
return details
def get_total_earnings():
fees = {
'wow': 0,
'xmr': 0,
}
prices = get_prices()
swaps = Swap.query.filter(Swap.completed == True)
for swap in swaps:
fees[swap.send_coin()] += swap.fee_amount_atomic
wow_amt = wownero.as_real(wownero.from_atomic(fees['wow']))
xmr_amt = monero.as_real(monero.from_atomic(fees['xmr']))
fee_totals = perform_conversion(wow_amt, xmr_amt)
return fee_totals
def get_broken_down_earnings():
fees = {
'wow': {},
'xmr': {}
}
swaps = Swap.query.filter(Swap.completed == True)
for swap in swaps:
d = arrow.get(swap.date).format('YYYY-MM')
_t = fees[swap.send_coin()]
if d not in _t:
_t[d] = 0
_t[d] += swap.fee_amount_atomic
for coin in fees:
for d in fees[coin]:
if coin == 'wow':
fees[coin][d] = float(wownero.from_atomic(fees[coin][d]))
else:
fees[coin][d] = float(monero.from_atomic(fees[coin][d]))
return fees