wownero-funding-system/funding/bin/utils.py

89 lines
2.5 KiB
Python

import os
import json
from datetime import datetime, date
import pyqrcode
import requests
from flask import g, request
from flask.json import JSONEncoder
import settings
from funding.factory import cache
def json_encoder(obj):
if isinstance(obj, (datetime, date)):
return obj.isoformat()
raise TypeError ("Type %s not serializable" % type(obj))
class Summary:
@staticmethod
@cache.cached(timeout=300, key_prefix="fetch_prices")
def fetch_prices():
return {
'coin-btc': coin_btc_value(),
'btc-usd': price_cmc_btc_usd()
}
@staticmethod
@cache.cached(timeout=300, key_prefix="funding_stats")
def fetch_stats():
from funding.factory import db
from funding.orm.orm import Proposal, User, Comment
data = {}
categories = settings.FUNDING_CATEGORIES
statuses = settings.FUNDING_STATUSES.keys()
for cat in categories:
q = db.session.query(Proposal)
q = q.filter(Proposal.category == cat)
res = q.count()
data.setdefault('cats', {})
data['cats'][cat] = res
for status in statuses:
q = db.session.query(Proposal)
q = q.filter(Proposal.status == status)
res = q.count()
data.setdefault('statuses', {})
data['statuses'][status] = res
data.setdefault('users', {})
data['users']['count'] = db.session.query(User.id).count()
return data
def price_cmc_btc_usd():
headers = {'User-Agent': 'Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0'}
try:
r = requests.get('https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd', headers=headers)
r.raise_for_status()
data = r.json()
btc = next(c for c in data if c['symbol'] == 'btc')
return btc['current_price']
except:
return
def coin_btc_value():
headers = {'User-Agent': 'Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0'}
try:
r = requests.get('https://tradeogre.com/api/v1/ticker/BTC-WOW', headers=headers)
r.raise_for_status()
return float(r.json().get('high'))
except:
return
def coin_to_usd(amt: float, usd_per_btc: float, btc_per_coin: float):
try:
return round(usd_per_btc / (1.0 / (amt * btc_per_coin)), 2)
except:
pass
def get_ip():
return request.headers.get('X-Forwarded-For') or request.remote_addr