From d9088ccd68dafb2fd5049300f1413eecddf8b9a8 Mon Sep 17 00:00:00 2001 From: Russell Schmidt Date: Mon, 31 Mar 2025 21:29:24 -0500 Subject: [PATCH 1/2] Add favorite node support Press Ctrl+F to favorite/unfavorite a node. Favorite nodes always appear at the top of the node list --- ui/curses_ui.py | 34 +++++++++++++++++++++++++++++++++- utilities/utils.py | 1 + 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/ui/curses_ui.py b/ui/curses_ui.py index 7547cfd..7687896 100644 --- a/ui/curses_ui.py +++ b/ui/curses_ui.py @@ -4,6 +4,7 @@ import logging import traceback from utilities.utils import get_channels, get_readable_duration, get_time_ago, refresh_node_list from settings import settings_menu +from utilities.input_handlers import get_list_input from message_handlers.tx_handler import send_message, send_traceroute from ui.colors import setup_colors, get_color from utilities.db_handler import get_name_from_database, update_node_info_in_db, is_chat_archived @@ -293,10 +294,41 @@ def main_ui(stdscr): draw_channel_list() draw_messages_window() + # ^/ elif char == chr(31): if(globals.current_window == 2 or globals.current_window == 0): search(globals.current_window) + # ^F + elif char == chr(6): + if globals.current_window == 2: + selectedNode = globals.interface.nodesByNum[globals.node_list[globals.selected_node]] + if 'isFavorite' not in selectedNode or selectedNode['isFavorite'] == False: + curses.curs_set(0) + confirmation = get_list_input(f"Set {get_name_from_database(globals.node_list[globals.selected_node])} as Favorite?", "no", ["yes", "no"]) + if confirmation == "yes": + globals.interface.localNode.setFavorite(globals.node_list[globals.selected_node]) + # Maybe we shouldn't be modifying the nodedb, but maybe it should update itself + globals.interface.nodesByNum[globals.node_list[globals.selected_node]]['isFavorite'] = True + + refresh_node_list() + draw_node_list() + draw_channel_list() + draw_messages_window() + + else: + curses.curs_set(0) + confirmation = get_list_input(f"Remove {get_name_from_database(globals.node_list[globals.selected_node])} from Favorites?", "no", ["yes", "no"]) + if confirmation == "yes": + globals.interface.localNode.removeFavorite(globals.node_list[globals.selected_node]) + # Maybe we shouldn't be modifying the nodedb, but maybe it should update itself + globals.interface.nodesByNum[globals.node_list[globals.selected_node]]['isFavorite'] = False + + refresh_node_list() + draw_node_list() + draw_channel_list() + draw_messages_window() + else: # Append typed character to input text if(isinstance(char, str)): @@ -618,7 +650,7 @@ def draw_node_details(): draw_centered_text_field(function_win, nodestr, 0, get_color("commands")) def draw_help(): - cmds = ["↑→↓← = Select", " ENTER = Send", " ` = Settings", " ^P = Packet Log", " ESC = Quit", " ^t = Traceroute", " ^d = Archive Chat"] + cmds = ["↑→↓← = Select", " ENTER = Send", " ` = Settings", " ^P = Packet Log", " ESC = Quit", " ^t = Traceroute", " ^d = Archive Chat", " ^f = Favorite"] function_str = "" for s in cmds: if(len(function_str) + len(s) < function_win.getmaxyx()[1] - 2): diff --git a/utilities/utils.py b/utilities/utils.py index ce8d567..d92d17f 100644 --- a/utilities/utils.py +++ b/utilities/utils.py @@ -48,6 +48,7 @@ def get_node_list(): else: return node sorted_nodes = sorted(globals.interface.nodes.values(), key = node_sort) + sorted_nodes = sorted(sorted_nodes, key = lambda node: node['isFavorite'] if 'isFavorite' in node else False, reverse = True) node_list = [node['num'] for node in sorted_nodes if node['num'] != my_node_num] return [my_node_num] + node_list # Ensuring your node is always first return [] From 8ff55c3de99839180588dc47356e6173561e6bff Mon Sep 17 00:00:00 2001 From: Russell Schmidt Date: Mon, 31 Mar 2025 21:56:23 -0500 Subject: [PATCH 2/2] Add ignore node support Press Ctrl+G to ignore/unignore a node. --- ui/curses_ui.py | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/ui/curses_ui.py b/ui/curses_ui.py index 7687896..69bc960 100644 --- a/ui/curses_ui.py +++ b/ui/curses_ui.py @@ -303,8 +303,10 @@ def main_ui(stdscr): elif char == chr(6): if globals.current_window == 2: selectedNode = globals.interface.nodesByNum[globals.node_list[globals.selected_node]] + + curses.curs_set(0) + if 'isFavorite' not in selectedNode or selectedNode['isFavorite'] == False: - curses.curs_set(0) confirmation = get_list_input(f"Set {get_name_from_database(globals.node_list[globals.selected_node])} as Favorite?", "no", ["yes", "no"]) if confirmation == "yes": globals.interface.localNode.setFavorite(globals.node_list[globals.selected_node]) @@ -312,12 +314,8 @@ def main_ui(stdscr): globals.interface.nodesByNum[globals.node_list[globals.selected_node]]['isFavorite'] = True refresh_node_list() - draw_node_list() - draw_channel_list() - draw_messages_window() else: - curses.curs_set(0) confirmation = get_list_input(f"Remove {get_name_from_database(globals.node_list[globals.selected_node])} from Favorites?", "no", ["yes", "no"]) if confirmation == "yes": globals.interface.localNode.removeFavorite(globals.node_list[globals.selected_node]) @@ -325,9 +323,27 @@ def main_ui(stdscr): globals.interface.nodesByNum[globals.node_list[globals.selected_node]]['isFavorite'] = False refresh_node_list() - draw_node_list() - draw_channel_list() - draw_messages_window() + + handle_resize(stdscr, False) + + elif char == chr(7): + if globals.current_window == 2: + selectedNode = globals.interface.nodesByNum[globals.node_list[globals.selected_node]] + + curses.curs_set(0) + + if 'isIgnored' not in selectedNode or selectedNode['isIgnored'] == False: + confirmation = get_list_input(f"Set {get_name_from_database(globals.node_list[globals.selected_node])} as Ignored?", "no", ["yes", "no"]) + if confirmation == "yes": + globals.interface.localNode.setIgnored(globals.node_list[globals.selected_node]) + globals.interface.nodesByNum[globals.node_list[globals.selected_node]]['isIgnored'] = True + else: + confirmation = get_list_input(f"Remove {get_name_from_database(globals.node_list[globals.selected_node])} from Ignored?", "no", ["yes", "no"]) + if confirmation == "yes": + globals.interface.localNode.removeIgnored(globals.node_list[globals.selected_node]) + globals.interface.nodesByNum[globals.node_list[globals.selected_node]]['isIgnored'] = False + + handle_resize(stdscr, False) else: # Append typed character to input text @@ -650,7 +666,7 @@ def draw_node_details(): draw_centered_text_field(function_win, nodestr, 0, get_color("commands")) def draw_help(): - cmds = ["↑→↓← = Select", " ENTER = Send", " ` = Settings", " ^P = Packet Log", " ESC = Quit", " ^t = Traceroute", " ^d = Archive Chat", " ^f = Favorite"] + cmds = ["↑→↓← = Select", " ENTER = Send", " ` = Settings", " ^P = Packet Log", " ESC = Quit", " ^t = Traceroute", " ^d = Archive Chat", " ^f = Favorite", " ^g = Ignore"] function_str = "" for s in cmds: if(len(function_str) + len(s) < function_win.getmaxyx()[1] - 2):