cleaned up

This commit is contained in:
ben 2022-11-24 23:31:22 +00:00
parent e6a3c63dd5
commit e84eedd66f
6 changed files with 81 additions and 257 deletions

View file

@ -1,18 +1,14 @@
from typing import List, Optional, Union
import httpx
from lnbits.helpers import urlsafe_short_hash
import time
import json
from loguru import logger
from . import db
from .models import (
Gerty,
Mempool,
Fees_recommended,
Hashrate_1w,
Hashrate_1m,
Statistics,
Difficulty_adjustment,
Tip_height)
from .models import Gerty, Mempool, MempoolEndpoint
async def create_gerty(wallet_id: str, data: Gerty) -> Gerty:
gerty_id = urlsafe_short_hash()
@ -21,9 +17,9 @@ async def create_gerty(wallet_id: str, data: Gerty) -> Gerty:
INSERT INTO gerty.gertys (
id,
name,
wallet,
utc_offset,
type,
wallet,
lnbits_wallets,
mempool_endpoint,
exchange,
@ -35,9 +31,9 @@ async def create_gerty(wallet_id: str, data: Gerty) -> Gerty:
(
gerty_id,
data.name,
data.wallet,
data.utc_offset,
data.type,
wallet_id,
data.lnbits_wallets,
data.mempool_endpoint,
data.exchange,
@ -82,124 +78,35 @@ async def delete_gerty(gerty_id: str) -> None:
#############MEMPOOL###########
async def get_fees_recommended(gerty) -> Optional[Fees_recommended]:
row = await db.fetchone("SELECT * FROM gerty.fees_recommended", ())
async def get_mempool_info(endPoint: str, gerty) -> Optional[Mempool]:
endpoints = MempoolEndpoint()
url = ""
for endpoint in endpoints:
logger.debug(endpoint)
if endPoint == endpoint[0]:
url = endpoint[1]
row = await db.fetchone("SELECT * FROM gerty.mempool WHERE endpoint = ?", (endPoint,))
if not row:
async with httpx.AsyncClient() as client:
response = await client.get(gerty.mempool_endpoint + url)
await db.execute(
"""
INSERT INTO gerty.mempool (
endpoint,
data,
time,
)
VALUES (?, ?, ?)
""",
(endPoint, json.dumps(response.json()), int(time.time())),
)
return response.json()
if int(time.time()) - row.time > 20:
async with httpx.AsyncClient() as client:
response = await client.get(gerty.mempool_endpoint + "/api/v1/fees/recommended")
if response.status_code == 200:
await db.execute(
"""
UPDATE gerty.fees_recommended
SET data = ?, time = ?
""",
(response.json(), int(time.time())),
)
return Fees_recommended(**response) if response else None
else:
return Fees_recommended(**row) if row else None
async def get_hashrate_1w(gerty) -> Optional[Hashrate_1w]:
row = await db.fetchone("SELECT * FROM gerty.hashrate_1w", ())
if int(time.time()) - row.time > 20:
async with httpx.AsyncClient() as client:
response = await client.get(gerty.mempool_endpoint + "/api/v1/mining/hashrate/1w")
if response.status_code == 200:
await db.execute(
"""
UPDATE gerty.hashrate_1w
SET data = ?, time = ?
""",
(response.json(), int(time.time())),
)
return Hashrate_1w(**response) if response else None
else:
return Hashrate_1w(**row) if row else None
async def get_hashrate_1m(gerty) -> Optional[Hashrate_1m]:
row = await db.fetchone("SELECT * FROM gerty.hashrate_1m", ())
if int(time.time()) - row.time > 20:
async with httpx.AsyncClient() as client:
response = await client.get(gerty.mempool_endpoint + "/api/v1/mining/hashrate/1m")
if response.status_code == 200:
await db.execute(
"""
UPDATE gerty.hashrate_1m
SET data = ?, time = ?
""",
(response.json(), int(time.time())),
)
return Hashrate_1m(**response) if response else None
else:
return Hashrate_1m(**row) if row else None
async def get_statistics(gerty) -> Optional[Statistics]:
row = await db.fetchone("SELECT * FROM gerty.statistics", ())
if int(time.time()) - row.time > 20:
async with httpx.AsyncClient() as client:
response = await client.get(gerty.mempool_endpoint + "/api/v1/lightning/statistics/latest")
if response.status_code == 200:
await db.execute(
"""
UPDATE gerty.statistics
SET data = ?, time = ?
""",
(response.json(), int(time.time())),
)
return Statistics(**response) if response else None
else:
return Statistics(**row) if row else None
async def get_difficulty_adjustment(gerty) -> Optional[Difficulty_adjustment]:
row = await db.fetchone("SELECT * FROM gerty.difficulty_adjustment", ())
logger.debug(int(time.time()))
logger.debug(row.time)
logger.debug(int(time.time()) - row.time)
if int(time.time()) - row.time > 20:
async with httpx.AsyncClient() as client:
response = await client.get(gerty.mempool_endpoint + "/api/v1/difficulty-adjustment")
if response.status_code == 200:
await db.execute(
"""
UPDATE gerty.difficulty_adjustment
SET data = ?, time = ?
""",
(response.json(), int(time.time())),
)
return Difficulty_adjustment(**response) if response else None
else:
return Difficulty_adjustment(**row) if row else None
async def get_tip_height() -> Optional[Tip_height]:
row = await db.fetchone("SELECT * FROM gerty.tip_height", ())
if int(time.time()) - row.time > 20:
async with httpx.AsyncClient() as client:
response = await client.get(gerty.mempool_endpoint + "/api/blocks/tip/height")
if response.status_code == 200:
await db.execute(
"""
UPDATE gerty.tip_height
SET data = ?, time = ?
""",
(response.json(), int(time.time())),
)
return Tip_height(**response) if response else None
else:
return Tip_height(**row) if row else None
async def get_mempool() -> Optional[Mempool]:
row = await db.fetchone("SELECT * FROM gerty.mempool", ())
if int(time.time()) - row.time > 20:
async with httpx.AsyncClient() as client:
response = await client.get(gerty.mempool_endpoint + "/api/mempool")
if response.status_code == 200:
await db.execute(
"""
UPDATE gerty.mempool
SET data = ?, time = ?
""",
(response.json(), int(time.time())),
)
return Mempool(**response) if response else None
else:
return Mempool(**row) if row else None
response = await client.get(gerty.mempool_endpoint + url)
await db.execute(
"UPDATE gerty.mempool SET data = ?, time = ? WHERE endpoint = ?",
(json.dumps(response.json()), int(time.time()), endPoint),
)
return response.json()
return json.loads(row.data)

View file

@ -4,15 +4,7 @@ from datetime import datetime, timedelta
import httpx
from loguru import logger
from .crud import (
get_fees_recommended,
get_hashrate_1w,
get_hashrate_1m,
get_statistics,
get_difficulty_adjustment,
get_tip_height,
get_mempool
)
from .crud import get_mempool_info
from .number_prefixer import *
@ -80,7 +72,7 @@ async def get_mining_dashboard(gerty):
if isinstance(gerty.mempool_endpoint, str):
async with httpx.AsyncClient() as client:
# current hashrate
r = await get_hashrate_1w(gerty)
r = await get_mempool_info("get_hashrate_1w", gerty)
data = r.json()
hashrateNow = data["currentHashrate"]
hashrateOneWeekAgo = data["hashrates"][6]["avgHashrate"]
@ -102,7 +94,7 @@ async def get_mining_dashboard(gerty):
)
areas.append(text)
r = await get_difficulty_adjustment(gerty)
r = await get_mempool_info("difficulty_adjustment", gerty)
# timeAvg
text = []
@ -132,7 +124,7 @@ async def get_mining_dashboard(gerty):
)
areas.append(text)
r = await get_hashrate_1m(gerty)
r = await get_mempool_info("hashrate_1m", gerty)
data = r.json()
stat = {}
stat["current"] = data["currentDifficulty"]
@ -144,7 +136,7 @@ async def get_mining_dashboard(gerty):
async def get_lightning_stats(gerty):
data = await get_statistics(gerty)
data = await get_mempool_info("statistics", gerty)
areas = []
text = []
@ -271,14 +263,14 @@ async def api_get_mining_stat(stat_slug: str, gerty):
stat = ""
if stat_slug == "mining_current_hash_rate":
async with httpx.AsyncClient() as client:
r = await get_hashrate_1m(gerty)
r = await get_mempool_info("hashrate_1m", gerty)
data = r.json()
stat = {}
stat['current'] = data['currentHashrate']
stat['1w'] = data['hashrates'][len(data['hashrates']) - 7]['avgHashrate']
elif stat_slug == "mining_current_difficulty":
async with httpx.AsyncClient() as client:
r = await get_hashrate_1m(gerty)
r = await get_mempool_info("hashrate_1m", gerty)
data = r.json()
stat = {}
stat['current'] = data['currentDifficulty']
@ -328,7 +320,7 @@ async def get_screen_data(screen_num: int, screens_list: dict, gerty):
elif screen_slug == "onchain_block_height":
logger.debug("iam block height")
text = []
text.append(get_text_item_dict(text=format_number(await get_tip_height(gerty)), font_size=80, gerty_type=gerty.type))
text.append(get_text_item_dict(text=format_number(await get_mempool_info("tip_height", gerty)), font_size=80, gerty_type=gerty.type))
areas.append(text)
elif screen_slug == "onchain_difficulty_retarget_date":
areas.append(await get_onchain_stat(screen_slug, gerty))
@ -383,7 +375,7 @@ async def get_dashboard(gerty):
# Mempool fees
text = []
text.append(get_text_item_dict(text=format_number(await get_tip_height(gerty)), font_size=40,gerty_type=gerty.type))
text.append(get_text_item_dict(text=format_number(await get_mempool_info("tip_height", gerty)), font_size=40,gerty_type=gerty.type))
text.append(get_text_item_dict(text="Current block height", font_size=15,gerty_type=gerty.type))
areas.append(text)
@ -467,7 +459,7 @@ async def get_onchain_stat(stat_slug: str, gerty):
):
async with httpx.AsyncClient() as client:
r = await get_difficulty_adjustment(gerty)
r = await get_mempool_info("difficulty_adjustment", gerty)
if stat_slug == "onchain_difficulty_epoch_progress":
stat = round(r.json()['progressPercent'])
text.append(get_text_item_dict(text="Progress through current difficulty epoch", font_size=15,gerty_type=gerty.type))
@ -491,7 +483,7 @@ async def get_onchain_dashboard(gerty):
areas = []
if isinstance(gerty.mempool_endpoint, str):
async with httpx.AsyncClient() as client:
r = await get_difficulty_adjustment(gerty)
r = await get_mempool_info("difficulty_adjustment", gerty)
text = []
stat = round(r.json()["progressPercent"])
text.append(get_text_item_dict(text="Progress through epoch", font_size=12,gerty_type=gerty.type))
@ -523,7 +515,7 @@ async def get_onchain_dashboard(gerty):
async def get_time_remaining_next_difficulty_adjustment(gerty):
if isinstance(gerty.mempool_endpoint, str):
async with httpx.AsyncClient() as client:
r = await get_difficulty_adjustment(gerty)
r = await get_mempool_info("difficulty_adjustment", gerty)
stat = r.json()["remainingTime"]
time = get_time_remaining(stat / 1000, 3)
return time
@ -534,7 +526,7 @@ async def get_mempool_stat(stat_slug: str, gerty):
if isinstance(gerty.mempool_endpoint, str):
async with httpx.AsyncClient() as client:
if stat_slug == "mempool_tx_count":
r = get_mempool(gerty)
r = get_mempool_info("mempool", gerty)
if stat_slug == "mempool_tx_count":
stat = round(r.json()["count"])
text.append(get_text_item_dict(text="Transactions in the mempool", font_size=15,gerty_type=gerty.type))
@ -543,7 +535,7 @@ async def get_mempool_stat(stat_slug: str, gerty):
)
elif stat_slug == "mempool_recommended_fees":
y_offset = 60
fees = await get_fees_recommended()
fees = await get_mempool_info("fees_recommended", gerty)
pos_y = 80 + y_offset
text.append(get_text_item_dict("mempool.space", 40, 160, pos_y, gerty.type))
pos_y = 180 + y_offset

View file

@ -6,9 +6,9 @@ async def m001_initial(db):
"""
CREATE TABLE gerty.gertys (
id TEXT PRIMARY KEY,
wallet TEXT NOT NULL,
refresh_time INT,
name TEXT NOT NULL,
wallet TEXT NOT NULL,
lnbits_wallets TEXT,
mempool_endpoint TEXT,
exchange TEXT,
@ -37,57 +37,10 @@ async def m004_initial(db):
"""
Initial Gertys table.
"""
await db.execute(
"""
CREATE TABLE gerty.fees_recommended (
data TEXT NOT NULL,
time TIMESTAMP
);
"""
)
await db.execute(
"""
CREATE TABLE gerty.hashrate_1w (
data TEXT NOT NULL,
time TIMESTAMP
);
"""
)
await db.execute(
"""
CREATE TABLE gerty.hashrate_1m (
data TEXT NOT NULL,
time TIMESTAMP
);
"""
)
await db.execute(
"""
CREATE TABLE gerty.statistics (
data TEXT NOT NULL,
time TIMESTAMP
);
"""
)
await db.execute(
"""
CREATE TABLE gerty.difficulty_adjustment (
data TEXT NOT NULL,
time TIMESTAMP
);
"""
)
await db.execute(
"""
CREATE TABLE gerty.tip_height (
data TEXT NOT NULL,
time TIMESTAMP
);
"""
)
await db.execute(
"""
CREATE TABLE gerty.mempool (
endpoint TEXT NOT NULL,
data TEXT NOT NULL,
time TIMESTAMP
);

View file

@ -27,30 +27,16 @@ class Gerty(BaseModel):
#########MEMPOOL MODELS###########
class Fees_recommended(BaseModel):
data: str = Query(None)
time: int = Query(None)
class Hashrate_1w(BaseModel):
data: str = Query(None)
time: int = Query(None)
class Hashrate_1m(BaseModel):
data: str = Query(None)
time: int = Query(None)
class Statistics(BaseModel):
data: str = Query(None)
time: int = Query(None)
class Difficulty_adjustment(BaseModel):
data: str = Query(None)
time: int = Query(None)
class Tip_height(BaseModel):
data: str = Query(None)
time: int = Query(None)
class MempoolEndpoint(BaseModel):
fees_recommended: str = "/api/v1/fees/recommended"
hashrate_1w: str = "/api/v1/mining/hashrate/1w"
hashrate_1m: str = "/api/v1/mining/hashrate/1m"
statistics: str = "/api/v1/lightning/statistics/latest"
difficulty_adjustment: str = "/api/v1/difficulty-adjustment"
tip_height: str = "/api/blocks/tip/height"
mempool: str = "/api/mempool"
class Mempool(BaseModel):
endpoint: str = Query(None)
data: str = Query(None)
time: int = Query(None)

View file

@ -135,14 +135,6 @@
:options="['Gerty', 'Mini Gerty']"
label="Gerty Type *"
></q-select>
<q-select
filled
dense
emit-value
v-model="formDialog.data.wallet"
:options="g.user.walletOptions"
label="Wallet *"
></q-select>
<q-select
filled
multiple
@ -350,7 +342,7 @@
<q-btn
unelevated
color="primary"
:disable="formDialog.data.wallet == null || formDialog.data.name == null"
:disable="formDialog.data.name == null"
type="submit"
class="q-mr-md"
v-if="!formDialog.data.id"
@ -360,7 +352,7 @@
v-else
unelevated
color="primary"
:disable="formDialog.data.wallet == null || formDialog.data.name == null"
:disable="formDialog.data.name == null"
type="submit"
>Update Gerty
</q-btn>
@ -661,7 +653,6 @@
this.formDialog.data.id = gerty.id
this.formDialog.data.name = gerty.name
this.formDialog.data.type = gerty.type
this.formDialog.data.wallet = gerty.wallet
this.formDialog.data.utc_offset = gerty.utc_offset
this.formDialog.data.lnbits_wallets = JSON.parse(gerty.lnbits_wallets)
this.formDialog.data.exchange = gerty.exchange,
@ -677,7 +668,6 @@
this.formDialog.data
)
} else {
{#console.log('sendFormDataGerty', this.formDialog.data)#}
this.createGerty(
this.g.user.wallets[0].adminkey,
this.formDialog.data
@ -687,7 +677,6 @@
createGerty: function () {
var data = {
name: this.formDialog.data.name,
wallet: this.formDialog.data.wallet,
utc_offset: this.formDialog.data.utc_offset,
type: this.formDialog.data.type,
lnbits_wallets: JSON.stringify(this.formDialog.data.lnbits_wallets),
@ -696,15 +685,13 @@
refresh_time: this.formDialog.data.refresh_time,
display_preferences: JSON.stringify(this.formDialog.data.display_preferences)
}
console.log('createGerty', data)
var self = this
LNbits.api
.request(
'POST',
'/gerty/api/v1/gerty',
_.findWhere(this.g.user.wallets, {id: this.formDialog.data.wallet})
.inkey,
this.g.user.wallets[0].inkey,
data
)
.then(function (response) {

View file

@ -28,17 +28,11 @@ from .crud import (
get_gerty,
get_gertys,
update_gerty,
get_fees_recommended,
get_hashrate_1w,
get_hashrate_1m,
get_statistics,
get_difficulty_adjustment,
get_tip_height,
get_mempool
get_mempool_info
)
from .helpers import *
from .models import Gerty
from .models import Gerty, MempoolEndpoint
@gerty_ext.get("/api/v1/gerty", status_code=HTTPStatus.OK)
async def api_gertys(
@ -164,37 +158,42 @@ async def api_gerty_json(gerty_id: str, p: int = None): # page number
@gerty_ext.get("/api/v1/gerty/fees-recommended/{gerty_id}")
async def api_gerty_get_fees_recommended(gerty_id):
logger.debug("gerty_id")
gerty = await get_gerty(gerty_id)
logger.debug(gerty)
return get_fees_recommended(gerty)
return await get_mempool_info("fees_recommended", gerty)
@gerty_ext.get("/api/v1/gerty/hashrate-1w/{gerty_id}")
async def api_gerty_get_hashrate_1w(gerty_id):
gerty = await get_gerty(gerty_id)
return get_hashrate_1w(gerty)
return await get_mempool_info("hashrate_1w", gerty)
@gerty_ext.get("/api/v1/gerty/hashrate-1m/{gerty_id}")
async def api_gerty_get_hashrate_1m(gerty_id):
gerty = await get_gerty(gerty_id)
return get_hashrate_1m(gerty)
return await get_mempool_info("hashrate_1m", gerty)
@gerty_ext.get("/api/v1/gerty/statistics/{gerty_id}")
async def api_gerty_get_statistics(gerty_id):
gerty = await get_gerty(gerty_id)
return get_statistics(gerty)
return await get_mempool_info("statistics", gerty)
@gerty_ext.get("/api/v1/gerty/difficulty-adjustment/{gerty_id}")
async def api_gerty_get_difficulty_adjustment(gerty_id):
gerty = await get_gerty(gerty_id)
return get_difficulty_adjustment(gerty)
return await get_mempool_info("difficulty_adjustment", gerty)
@gerty_ext.get("/api/v1/gerty/tip-height/{gerty_id}")
async def api_gerty_get_tip_height(gerty_id):
gerty = await get_gerty(gerty_id)
return get_tip_height(gerty)
return await get_mempool_info("tip_height", gerty)
@gerty_ext.get("/api/v1/gerty/mempool/{gerty_id}")
async def api_gerty_get_mempool(gerty_id):
gerty = await get_gerty(gerty_id)
return get_mempool(gerty)
return await get_mempool_info("mempool", gerty)
@gerty_ext.get("/api/v1/gerty/wibble/{gerty_id}")
async def api_gerty_get_wibble(gerty_id):
endPoint = "fees_recommended"
gerty = await get_gerty(gerty_id)
return await get_mempool_info("fees_recommended", gerty)