Added lightning network dashboard
This commit is contained in:
parent
6ecf27e168
commit
662e637758
3 changed files with 74 additions and 71 deletions
|
|
@ -4,6 +4,9 @@ from loguru import logger
|
||||||
|
|
||||||
from .number_prefixer import *
|
from .number_prefixer import *
|
||||||
|
|
||||||
|
def get_percent_difference(current, previous, precision=4):
|
||||||
|
difference = (current - previous) / current * 100
|
||||||
|
return "{0}{1}%".format("+" if difference > 0 else "", round(difference, precision))
|
||||||
|
|
||||||
# A helper function get a nicely formated dict for the text
|
# A helper function get a nicely formated dict for the text
|
||||||
def get_text_item_dict(text: str, font_size: int, x_pos: int = None, y_pos: int = None):
|
def get_text_item_dict(text: str, font_size: int, x_pos: int = None, y_pos: int = None):
|
||||||
|
|
@ -43,8 +46,8 @@ def get_text_item_dict(text: str, font_size: int, x_pos: int = None, y_pos: int
|
||||||
return text
|
return text
|
||||||
|
|
||||||
# format a number for nice display output
|
# format a number for nice display output
|
||||||
def format_number(number):
|
def format_number(number, precision=None):
|
||||||
return ("{:,}".format(round(number)))
|
return ("{:,}".format(round(number, precision)))
|
||||||
|
|
||||||
|
|
||||||
async def get_mempool_recommended_fees(gerty):
|
async def get_mempool_recommended_fees(gerty):
|
||||||
|
|
@ -71,6 +74,51 @@ async def api_get_mining_stat(stat_slug: str, gerty):
|
||||||
stat['previous'] = data['difficulty'][len(data['difficulty']) - 2]['difficulty']
|
stat['previous'] = data['difficulty'][len(data['difficulty']) - 2]['difficulty']
|
||||||
return stat
|
return stat
|
||||||
|
|
||||||
|
async def api_get_lightning_stats(gerty):
|
||||||
|
stat = {}
|
||||||
|
if isinstance(gerty.mempool_endpoint, str):
|
||||||
|
async with httpx.AsyncClient() as client:
|
||||||
|
r = await client.get(gerty.mempool_endpoint + "/api/v1/lightning/statistics/latest")
|
||||||
|
data = r.json()
|
||||||
|
return data
|
||||||
|
|
||||||
|
async def get_lightning_stats(gerty):
|
||||||
|
data = await api_get_lightning_stats(gerty)
|
||||||
|
areas = []
|
||||||
|
|
||||||
|
logger.debug(data['latest']['channel_count'])
|
||||||
|
|
||||||
|
text = []
|
||||||
|
text.append(get_text_item_dict("Channel Count", 12))
|
||||||
|
text.append(get_text_item_dict(format_number(data['latest']['channel_count']), 20))
|
||||||
|
difference = get_percent_difference(current=data['latest']['channel_count'],
|
||||||
|
previous=data['previous']['channel_count'])
|
||||||
|
text.append(get_text_item_dict("{0} in last 7 days".format(difference), 12))
|
||||||
|
areas.append(text)
|
||||||
|
|
||||||
|
text = []
|
||||||
|
text.append(get_text_item_dict("Number of Nodes", 12))
|
||||||
|
text.append(get_text_item_dict(format_number(data['latest']['node_count']), 20))
|
||||||
|
difference = get_percent_difference(current=data['latest']['node_count'], previous=data['previous']['node_count'])
|
||||||
|
text.append(get_text_item_dict("{0} in last 7 days".format(difference), 12))
|
||||||
|
areas.append(text)
|
||||||
|
|
||||||
|
text = []
|
||||||
|
text.append(get_text_item_dict("Total Capacity", 12))
|
||||||
|
avg_capacity = float(data['latest']['total_capacity']) / float(100000000)
|
||||||
|
text.append(get_text_item_dict("{0} BTC".format(format_number(avg_capacity, 2)), 20))
|
||||||
|
difference = get_percent_difference(current=data['latest']['total_capacity'], previous=data['previous']['total_capacity'])
|
||||||
|
text.append(get_text_item_dict("{0} in last 7 days".format(difference), 12))
|
||||||
|
areas.append(text)
|
||||||
|
|
||||||
|
text = []
|
||||||
|
text.append(get_text_item_dict("Average Channel Capacity", 12))
|
||||||
|
text.append(get_text_item_dict("{0} sats".format(format_number(data['latest']['avg_capacity'])), 20))
|
||||||
|
difference = get_percent_difference(current=data['latest']['avg_capacity'], previous=data['previous']['avg_capacity'])
|
||||||
|
text.append(get_text_item_dict("{0} in last 7 days".format(difference), 12))
|
||||||
|
areas.append(text)
|
||||||
|
|
||||||
|
return areas
|
||||||
|
|
||||||
async def get_mining_stat(stat_slug: str, gerty):
|
async def get_mining_stat(stat_slug: str, gerty):
|
||||||
text = []
|
text = []
|
||||||
|
|
@ -81,15 +129,15 @@ async def get_mining_stat(stat_slug: str, gerty):
|
||||||
text.append(get_text_item_dict("Current Mining Hashrate", 20))
|
text.append(get_text_item_dict("Current Mining Hashrate", 20))
|
||||||
text.append(get_text_item_dict(current, 40))
|
text.append(get_text_item_dict(current, 40))
|
||||||
# compare vs previous time period
|
# compare vs previous time period
|
||||||
difference = (stat['current'] - stat['1w']) / stat['current'] * 100
|
difference = get_percent_difference(current=stat['current'], previous=stat['1w'])
|
||||||
text.append(get_text_item_dict("{0}{1}% in last 7 days".format("+" if difference > 0 else "", round(difference, 4)), 12))
|
text.append(get_text_item_dict("{0} in last 7 days".format(difference), 12))
|
||||||
elif stat_slug == "mining_current_difficulty":
|
elif stat_slug == "mining_current_difficulty":
|
||||||
stat = await api_get_mining_stat(stat_slug, gerty)
|
stat = await api_get_mining_stat(stat_slug, gerty)
|
||||||
text.append(get_text_item_dict("Current Mining Difficulty", 20))
|
text.append(get_text_item_dict("Current Mining Difficulty", 20))
|
||||||
text.append(get_text_item_dict(format_number(stat['current']), 40))
|
text.append(get_text_item_dict(format_number(stat['current']), 40))
|
||||||
difference = (stat['current'] - stat['previous']) / stat['current'] * 100
|
difference = get_percent_difference(current=stat['current'], previous=stat['previous'])
|
||||||
text.append(
|
text.append(get_text_item_dict("{0} since last adjustment".format(difference), 12))
|
||||||
get_text_item_dict("{0}{1}% since last adjustment".format("+" if difference > 0 else "", round(difference, 4)),
|
|
||||||
15))
|
|
||||||
# text.append(get_text_item_dict("Required threshold for mining proof-of-work", 12))
|
# text.append(get_text_item_dict("Required threshold for mining proof-of-work", 12))
|
||||||
return text
|
return text
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -305,40 +305,8 @@
|
||||||
label="Lightning Network"
|
label="Lightning Network"
|
||||||
>
|
>
|
||||||
<q-toggle
|
<q-toggle
|
||||||
v-model="toggleStates.lightning"
|
v-model="formDialog.data.display_preferences.lightning_dashboard"
|
||||||
label="Toggle all"
|
label="Lightning Dashboard"
|
||||||
>
|
|
||||||
<q-tooltip>Toggle all</q-tooltip>
|
|
||||||
</q-toggle>
|
|
||||||
<br>
|
|
||||||
<q-toggle
|
|
||||||
v-model="formDialog.data.display_preferences.lightning_channel_count"
|
|
||||||
label="Channel count"
|
|
||||||
></q-toggle>
|
|
||||||
|
|
||||||
<q-toggle
|
|
||||||
v-model="formDialog.data.display_preferences.lightning_node_count"
|
|
||||||
label="Number of nodes"
|
|
||||||
></q-toggle>
|
|
||||||
|
|
||||||
<q-toggle
|
|
||||||
v-model="formDialog.data.display_preferences.lightning_tor_node_count"
|
|
||||||
label="Number of Tor nodes"
|
|
||||||
></q-toggle>
|
|
||||||
|
|
||||||
<q-toggle
|
|
||||||
v-model="formDialog.data.display_preferences.lightning_clearnet_nodes"
|
|
||||||
label="Number of clearnet nodes"
|
|
||||||
></q-toggle>
|
|
||||||
|
|
||||||
<q-toggle
|
|
||||||
v-model="formDialog.data.display_preferences.lightning_unannounced_nodes"
|
|
||||||
label="Number of unannounced nodes"
|
|
||||||
></q-toggle>
|
|
||||||
|
|
||||||
<q-toggle
|
|
||||||
v-model="formDialog.data.display_preferences.lightning_average_channel_capacity"
|
|
||||||
label="Average channel capacity"
|
|
||||||
></q-toggle>
|
></q-toggle>
|
||||||
</q-expansion-item>
|
</q-expansion-item>
|
||||||
<div class="row q-mt-lg">
|
<div class="row q-mt-lg">
|
||||||
|
|
@ -614,12 +582,7 @@
|
||||||
mempool_tx_count: true,
|
mempool_tx_count: true,
|
||||||
mining_current_hash_rate: true,
|
mining_current_hash_rate: true,
|
||||||
mining_current_difficulty: true,
|
mining_current_difficulty: true,
|
||||||
lightning_channel_count: true,
|
lightning_dashboard: true
|
||||||
lightning_node_count: true,
|
|
||||||
lightning_tor_node_count: true,
|
|
||||||
lightning_clearnet_nodes: true,
|
|
||||||
lightning_unannounced_nodes: true,
|
|
||||||
lightning_average_channel_capacity: true,
|
|
||||||
},
|
},
|
||||||
lnbits_wallets: [],
|
lnbits_wallets: [],
|
||||||
mempool_endpoint: "https://mempool.space",
|
mempool_endpoint: "https://mempool.space",
|
||||||
|
|
|
||||||
|
|
@ -133,16 +133,10 @@ async def api_gerty_json(
|
||||||
enabled_screens.append(screen_slug)
|
enabled_screens.append(screen_slug)
|
||||||
|
|
||||||
logger.debug("Screeens " + str(enabled_screens))
|
logger.debug("Screeens " + str(enabled_screens))
|
||||||
text = await get_screen_text(p, enabled_screens, gerty)
|
data = await get_screen_data(p, enabled_screens, gerty)
|
||||||
|
|
||||||
next_screen_number = 0 if ((p + 1) >= enabled_screen_count) else p + 1;
|
next_screen_number = 0 if ((p + 1) >= enabled_screen_count) else p + 1;
|
||||||
|
|
||||||
# ln = []
|
|
||||||
# if gerty.ln_stats and isinstance(gerty.mempool_endpoint, str):
|
|
||||||
# async with httpx.AsyncClient() as client:
|
|
||||||
# r = await client.get(gerty.mempool_endpoint + "/api/v1/lightning/statistics/latest")
|
|
||||||
# if r:
|
|
||||||
# ln.append(r.json())
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"settings": {
|
"settings": {
|
||||||
|
|
@ -155,7 +149,8 @@ async def api_gerty_json(
|
||||||
"screen": {
|
"screen": {
|
||||||
"slug": get_screen_slug_by_index(p, enabled_screens),
|
"slug": get_screen_slug_by_index(p, enabled_screens),
|
||||||
"group": get_screen_slug_by_index(p, enabled_screens),
|
"group": get_screen_slug_by_index(p, enabled_screens),
|
||||||
"areas": text
|
"title": data['title'],
|
||||||
|
"areas": data['areas']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -166,12 +161,14 @@ def get_screen_slug_by_index(index: int, screens_list):
|
||||||
|
|
||||||
|
|
||||||
# Get a list of text items for the screen number
|
# Get a list of text items for the screen number
|
||||||
async def get_screen_text(screen_num: int, screens_list: dict, gerty):
|
async def get_screen_data(screen_num: int, screens_list: dict, gerty):
|
||||||
screen_slug = get_screen_slug_by_index(screen_num, screens_list)
|
screen_slug = get_screen_slug_by_index(screen_num, screens_list)
|
||||||
# first get the relevant slug from the display_preferences
|
# first get the relevant slug from the display_preferences
|
||||||
logger.debug('screen_slug')
|
logger.debug('screen_slug')
|
||||||
logger.debug(screen_slug)
|
logger.debug(screen_slug)
|
||||||
areas = []
|
areas = []
|
||||||
|
title = ""
|
||||||
|
|
||||||
if screen_slug == "dashboard":
|
if screen_slug == "dashboard":
|
||||||
areas = await get_dashboard(gerty)
|
areas = await get_dashboard(gerty)
|
||||||
if screen_slug == "lnbits_wallets_balance":
|
if screen_slug == "lnbits_wallets_balance":
|
||||||
|
|
@ -198,20 +195,15 @@ async def get_screen_text(screen_num: int, screens_list: dict, gerty):
|
||||||
areas.append(await get_mining_stat(screen_slug, gerty))
|
areas.append(await get_mining_stat(screen_slug, gerty))
|
||||||
elif screen_slug == "mining_current_difficulty":
|
elif screen_slug == "mining_current_difficulty":
|
||||||
areas.append(await get_mining_stat(screen_slug, gerty))
|
areas.append(await get_mining_stat(screen_slug, gerty))
|
||||||
elif screen_slug == "lightning_channel_count":
|
elif screen_slug == "lightning_dashboard":
|
||||||
areas.append(await get_placeholder_text())
|
title = "Lightning Network"
|
||||||
elif screen_slug == "lightning_node_count":
|
areas = await get_lightning_stats(gerty)
|
||||||
areas.append(await get_placeholder_text())
|
|
||||||
elif screen_slug == "lightning_tor_node_count":
|
|
||||||
areas.append(await get_placeholder_text())
|
|
||||||
elif screen_slug == "lightning_clearnet_nodes":
|
|
||||||
areas.append(await get_placeholder_text())
|
|
||||||
elif screen_slug == "lightning_unannounced_nodes":
|
|
||||||
areas.append(await get_placeholder_text())
|
|
||||||
elif screen_slug == "lightning_average_channel_capacity":
|
|
||||||
areas.append(await get_placeholder_text())
|
|
||||||
|
|
||||||
return areas
|
data = {}
|
||||||
|
data['title'] = title
|
||||||
|
data['areas'] = areas
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
# Get the dashboard screen
|
# Get the dashboard screen
|
||||||
async def get_dashboard(gerty):
|
async def get_dashboard(gerty):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue