From 5730beafa985ab1a0215df809ca5ad5071019e2f Mon Sep 17 00:00:00 2001 From: pdxlocations Date: Thu, 30 Jan 2025 12:51:31 -0800 Subject: [PATCH] change get name to sql db from nodedb --- db_handler.py | 40 ++++++++++++++++++++++++++++++++-- message_handlers/rx_handler.py | 6 ++--- message_handlers/tx_handler.py | 17 +++++++-------- ui/curses_ui.py | 17 ++++++++------- 4 files changed, 58 insertions(+), 22 deletions(-) diff --git a/db_handler.py b/db_handler.py index d5fe365..b5c1d2a 100644 --- a/db_handler.py +++ b/db_handler.py @@ -1,9 +1,10 @@ + import sqlite3 import time from datetime import datetime import logging -from utilities.utils import get_name_from_number +from utilities.utils import decimal_to_hex import default_config as config import globals @@ -133,7 +134,7 @@ def load_messages_from_db(): if user_id == str(globals.myNodeNum): formatted_message = (f"{config.sent_message_prefix}{ack_str}: ", message) else: - formatted_message = (f"{config.message_prefix} {get_name_from_number(int(user_id), 'short')}: ", message) + formatted_message = (f"{config.message_prefix} {get_name_from_database(int(user_id), 'short')}: ", message) hourly_messages[hour].append(formatted_message) @@ -285,3 +286,38 @@ def maybe_store_nodeinfo_in_db(packet): logging.error(f"SQLite error in maybe_store_nodeinfo_in_db: {e}") finally: db_connection.close() + + +def get_name_from_database(user_id, type="long"): + """ + Retrieve a user's name (long or short) from the node database. + + :param user_id: The user ID to look up. + :param type: "long" for long name, "short" for short name. + :return: The retrieved name or the hex of the user id + """ + try: + with sqlite3.connect(config.db_file_path) as db_connection: + db_cursor = db_connection.cursor() + + # Construct table name + table_name = f"{str(globals.myNodeNum)}_nodedb" + nodeinfo_table = f'"{table_name}"' # Quote table name for safety + + # Determine the correct column to fetch + column_name = "long_name" if type == "long" else "short_name" + + # Query the database + query = f"SELECT {column_name} FROM {nodeinfo_table} WHERE user_id = ?" + db_cursor.execute(query, (user_id,)) + result = db_cursor.fetchone() + + return result[0] if result else decimal_to_hex(user_id) + + except sqlite3.Error as e: + logging.error(f"SQLite error in get_name_from_database: {e}") + return "Unknown" + + except Exception as e: + logging.error(f"Unexpected error in get_name_from_database: {e}") + return "Unknown" \ No newline at end of file diff --git a/message_handlers/rx_handler.py b/message_handlers/rx_handler.py index 74e330c..4e0e311 100644 --- a/message_handlers/rx_handler.py +++ b/message_handlers/rx_handler.py @@ -1,8 +1,8 @@ import logging import time -from utilities.utils import get_node_list, get_name_from_number +from utilities.utils import get_node_list from ui.curses_ui import draw_packetlog_win, draw_node_list, draw_messages_window, draw_channel_list, add_notification -from db_handler import save_message_to_db, maybe_store_nodeinfo_in_db +from db_handler import save_message_to_db, maybe_store_nodeinfo_in_db, get_name_from_database import default_config as config import globals @@ -63,7 +63,7 @@ def on_receive(packet, interface): # Add received message to the messages list message_from_id = packet['from'] - message_from_string = get_name_from_number(message_from_id, type='short') + ":" + message_from_string = get_name_from_database(message_from_id, type='short') + ":" if globals.channel_list[channel_number] not in globals.all_messages: globals.all_messages[globals.channel_list[channel_number]] = [] diff --git a/message_handlers/tx_handler.py b/message_handlers/tx_handler.py index 74b585a..419cac0 100644 --- a/message_handlers/tx_handler.py +++ b/message_handlers/tx_handler.py @@ -3,8 +3,7 @@ import google.protobuf.json_format from meshtastic import BROADCAST_NUM from meshtastic.protobuf import mesh_pb2, portnums_pb2 -from db_handler import save_message_to_db, update_ack_nak -from utilities.utils import get_name_from_number +from db_handler import save_message_to_db, update_ack_nak, get_name_from_database import default_config as config import globals @@ -57,18 +56,18 @@ def on_response_traceroute(packet): msg_str = "Traceroute to:\n" - route_str = get_name_from_number(packet["to"], 'short') or f"{packet['to']:08x}" # Start with destination of response + route_str = get_name_from_database(packet["to"], 'short') or f"{packet['to']:08x}" # Start with destination of response # SNR list should have one more entry than the route, as the final destination adds its SNR also lenTowards = 0 if "route" not in msg_dict else len(msg_dict["route"]) snrTowardsValid = "snrTowards" in msg_dict and len(msg_dict["snrTowards"]) == lenTowards + 1 if lenTowards > 0: # Loop through hops in route and add SNR if available for idx, node_num in enumerate(msg_dict["route"]): - route_str += " --> " + (get_name_from_number(node_num, 'short') or f"{node_num:08x}") \ + route_str += " --> " + (get_name_from_database(node_num, 'short') or f"{node_num:08x}") \ + " (" + (str(msg_dict["snrTowards"][idx] / 4) if snrTowardsValid and msg_dict["snrTowards"][idx] != UNK_SNR else "?") + "dB)" # End with origin of response - route_str += " --> " + (get_name_from_number(packet["from"], 'short') or f"{packet['from']:08x}") \ + route_str += " --> " + (get_name_from_database(packet["from"], 'short') or f"{packet['from']:08x}") \ + " (" + (str(msg_dict["snrTowards"][-1] / 4) if snrTowardsValid and msg_dict["snrTowards"][-1] != UNK_SNR else "?") + "dB)" msg_str += route_str + "\n" # Print the route towards destination @@ -78,15 +77,15 @@ def on_response_traceroute(packet): backValid = "hopStart" in packet and "snrBack" in msg_dict and len(msg_dict["snrBack"]) == lenBack + 1 if backValid: msg_str += "Back:\n" - route_str = get_name_from_number(packet["from"], 'short') or f"{packet['from']:08x}" # Start with origin of response + route_str = get_name_from_database(packet["from"], 'short') or f"{packet['from']:08x}" # Start with origin of response if lenBack > 0: # Loop through hops in routeBack and add SNR if available for idx, node_num in enumerate(msg_dict["routeBack"]): - route_str += " --> " + (get_name_from_number(node_num, 'short') or f"{node_num:08x}") \ + route_str += " --> " + (get_name_from_database(node_num, 'short') or f"{node_num:08x}") \ + " (" + (str(msg_dict["snrBack"][idx] / 4) if msg_dict["snrBack"][idx] != UNK_SNR else "?") + "dB)" # End with destination of response (us) - route_str += " --> " + (get_name_from_number(packet["to"], 'short') or f"{packet['to']:08x}") \ + route_str += " --> " + (get_name_from_database(packet["to"], 'short') or f"{packet['to']:08x}") \ + " (" + (str(msg_dict["snrBack"][-1] / 4) if msg_dict["snrBack"][-1] != UNK_SNR else "?") + "dB)" msg_str += route_str + "\n" # Print the route back to us @@ -103,7 +102,7 @@ def on_response_traceroute(packet): add_notification(channel_number) refresh_channels = True - message_from_string = get_name_from_number(packet['from'], type='short') + ":\n" + message_from_string = get_name_from_database(packet['from'], type='short') + ":\n" if globals.channel_list[channel_number] not in globals.all_messages: globals.all_messages[globals.channel_list[channel_number]] = [] diff --git a/ui/curses_ui.py b/ui/curses_ui.py index 276873e..a88ab63 100644 --- a/ui/curses_ui.py +++ b/ui/curses_ui.py @@ -1,9 +1,10 @@ import curses import textwrap -from utilities.utils import get_name_from_number, get_channels, get_time_ago +from utilities.utils import get_channels, get_time_ago from settings import settings_menu from message_handlers.tx_handler import send_message, send_traceroute from ui.colors import setup_colors, get_color +from db_handler import get_name_from_database import default_config as config import ui.dialog import globals @@ -96,7 +97,7 @@ def highlight_line(highlight, window, line): if(window == 2): pad = nodes_pad - select_len = len(get_name_from_number(globals.node_list[line], "long")) + select_len = len(get_name_from_database(globals.node_list[line], "long")) pad.chgat(line, 1, select_len, nd_color | curses.A_REVERSE if highlight else nd_color) @@ -105,7 +106,7 @@ def highlight_line(highlight, window, line): win_width = channel_box.getmaxyx()[1] if(isinstance(channel, int)): - channel = get_name_from_number(channel, type="long") + channel = get_name_from_database(channel, type="long") select_len = min(len(channel), win_width - 4) if line == globals.selected_channel and highlight == False: @@ -171,7 +172,7 @@ def draw_channel_list(): for i, channel in enumerate(list(globals.all_messages.keys())): # Convert node number to long name if it's an integer if isinstance(channel, int): - channel = get_name_from_number(channel, type='long') + channel = get_name_from_database(channel, type='long') # Determine whether to add the notification notification = " " + config.notification_symbol if i in globals.notifications else "" @@ -243,9 +244,9 @@ def draw_node_list(): for i, node in enumerate(globals.node_list): if globals.selected_node == i and globals.current_window == 2: - nodes_pad.addstr(i, 1, get_name_from_number(node, "long"), get_color("node_list", reverse=True)) + nodes_pad.addstr(i, 1, get_name_from_database(node, "long"), get_color("node_list", reverse=True)) else: - nodes_pad.addstr(i, 1, get_name_from_number(node, "long"), get_color("node_list")) + nodes_pad.addstr(i, 1, get_name_from_database(node, "long"), get_color("node_list")) nodes_box.attrset(get_color("window_frame_selected") if globals.current_window == 2 else get_color("window_frame")) nodes_box.box() @@ -327,10 +328,10 @@ def draw_packetlog_win(): break # Format each field - from_id = get_name_from_number(packet['from'], 'short').ljust(columns[0]) + from_id = get_name_from_database(packet['from'], 'short').ljust(columns[0]) to_id = ( "BROADCAST".ljust(columns[1]) if str(packet['to']) == "4294967295" - else get_name_from_number(packet['to'], 'short').ljust(columns[1]) + else get_name_from_database(packet['to'], 'short').ljust(columns[1]) ) if 'decoded' in packet: port = packet['decoded']['portnum'].ljust(columns[2])