From 662e637758370127c03b0da80ab430bdecc74353 Mon Sep 17 00:00:00 2001 From: Black Coffee Date: Thu, 6 Oct 2022 16:12:48 +0100 Subject: [PATCH] Added lightning network dashboard --- lnbits/extensions/gerty/helpers.py | 66 ++++++++++++++++--- .../gerty/templates/gerty/index.html | 43 +----------- lnbits/extensions/gerty/views_api.py | 36 ++++------ 3 files changed, 74 insertions(+), 71 deletions(-) diff --git a/lnbits/extensions/gerty/helpers.py b/lnbits/extensions/gerty/helpers.py index d2048814..cae05ff4 100644 --- a/lnbits/extensions/gerty/helpers.py +++ b/lnbits/extensions/gerty/helpers.py @@ -4,6 +4,9 @@ from loguru import logger 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 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 # format a number for nice display output -def format_number(number): - return ("{:,}".format(round(number))) +def format_number(number, precision=None): + return ("{:,}".format(round(number, precision))) 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'] 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): 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, 40)) # compare vs previous time period - difference = (stat['current'] - stat['1w']) / stat['current'] * 100 - text.append(get_text_item_dict("{0}{1}% in last 7 days".format("+" if difference > 0 else "", round(difference, 4)), 12)) + difference = get_percent_difference(current=stat['current'], previous=stat['1w']) + text.append(get_text_item_dict("{0} in last 7 days".format(difference), 12)) elif stat_slug == "mining_current_difficulty": 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(format_number(stat['current']), 40)) - difference = (stat['current'] - stat['previous']) / stat['current'] * 100 - text.append( - get_text_item_dict("{0}{1}% since last adjustment".format("+" if difference > 0 else "", round(difference, 4)), - 15)) + difference = get_percent_difference(current=stat['current'], previous=stat['previous']) + text.append(get_text_item_dict("{0} since last adjustment".format(difference), 12)) # text.append(get_text_item_dict("Required threshold for mining proof-of-work", 12)) - return text \ No newline at end of file + return text + + diff --git a/lnbits/extensions/gerty/templates/gerty/index.html b/lnbits/extensions/gerty/templates/gerty/index.html index d341ce98..5975ef52 100644 --- a/lnbits/extensions/gerty/templates/gerty/index.html +++ b/lnbits/extensions/gerty/templates/gerty/index.html @@ -305,40 +305,8 @@ label="Lightning Network" > - Toggle all - -
- - - - - - - - - - -
@@ -614,12 +582,7 @@ mempool_tx_count: true, mining_current_hash_rate: true, mining_current_difficulty: true, - lightning_channel_count: true, - lightning_node_count: true, - lightning_tor_node_count: true, - lightning_clearnet_nodes: true, - lightning_unannounced_nodes: true, - lightning_average_channel_capacity: true, + lightning_dashboard: true }, lnbits_wallets: [], mempool_endpoint: "https://mempool.space", diff --git a/lnbits/extensions/gerty/views_api.py b/lnbits/extensions/gerty/views_api.py index 0be8531e..cc79cb65 100644 --- a/lnbits/extensions/gerty/views_api.py +++ b/lnbits/extensions/gerty/views_api.py @@ -133,16 +133,10 @@ async def api_gerty_json( enabled_screens.append(screen_slug) 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; - # 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 { "settings": { @@ -155,7 +149,8 @@ async def api_gerty_json( "screen": { "slug": 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 -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) # first get the relevant slug from the display_preferences logger.debug('screen_slug') logger.debug(screen_slug) areas = [] + title = "" + if screen_slug == "dashboard": areas = await get_dashboard(gerty) 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)) elif screen_slug == "mining_current_difficulty": areas.append(await get_mining_stat(screen_slug, gerty)) - elif screen_slug == "lightning_channel_count": - areas.append(await get_placeholder_text()) - elif screen_slug == "lightning_node_count": - 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()) + elif screen_slug == "lightning_dashboard": + title = "Lightning Network" + areas = await get_lightning_stats(gerty) - return areas + data = {} + data['title'] = title + data['areas'] = areas + + return data # Get the dashboard screen async def get_dashboard(gerty):