From 0c2b36a2068d0251942ded03ece13adccce681c6 Mon Sep 17 00:00:00 2001 From: SpudGunMan Date: Thu, 16 Oct 2025 15:55:12 -0700 Subject: [PATCH] refactor handle_messages @mesb1 give this one a test https://github.com/SpudGunMan/meshing-around/issues/213 --- config.template | 2 +- mesh_bot.py | 71 +++++++++++++++++++++------------------------ modules/settings.py | 2 +- 3 files changed, 35 insertions(+), 40 deletions(-) diff --git a/config.template b/config.template index f461064..702a402 100644 --- a/config.template +++ b/config.template @@ -394,7 +394,7 @@ splitDelay = 2.5 MESSAGE_CHUNK_SIZE = 160 # Request Acknowledgement of message OTA wantAck = False -# Max limit buffer for radio testing +# Max limit buffer for radio testing in bytes maxBuffer = 200 #Enable Extra logging of Hop count data enableHopLogs = False diff --git a/mesh_bot.py b/mesh_bot.py index 347e4b5..fa2dc23 100755 --- a/mesh_bot.py +++ b/mesh_bot.py @@ -1096,47 +1096,42 @@ def handle_messages(message, deviceID, channel_number, msg_history, publicChanne if "?" in message and isDM: return message.split("?")[0].title() + " command returns the last " + str(storeFlimit) + " messages sent on a channel." else: + # Filter messages for this device/channel + filtered_msgs = [ + msgH for msgH in msg_history + if msgH[4] == deviceID and (msgH[2] == channel_number or msgH[2] == publicChannel) + ] + + # Choose order and slice + # Oldest first, take first N + filtered_msgs = filtered_msgs[-storeFlimit:][::-1] + if reverseSF: + # reverse that + filtered_msgs = filtered_msgs[::-1] + response = "" header = f"📨Msgs:\n" - # Calculate safe byte limit (account for header and some overhead) - header_bytes = len(header.encode('utf-8')) - available_bytes = max_bytes - header_bytes - - # Reverse the message history to show most recent first - for msgH in reversed(msg_history): - # number of messages to return +1 for the header line - if len(response.split("\n")) >= storeFlimit + 1: - break - # if the message is for this deviceID and channel or publicChannel - if msgH[4] == deviceID: - if msgH[2] == channel_number or msgH[2] == publicChannel: - new_line = f"\n{msgH[0]}: {msgH[1]}" - # Check if adding this line would exceed byte limit - test_response = response + new_line - if len(test_response.encode('utf-8')) > available_bytes: - # Try to add truncated version of the message - msg_text = msgH[1] - truncated = False - trunc_marker = "..." - while len(msg_text) > 0 and len((response + f"\n{msgH[0]}: {msg_text}{trunc_marker}").encode('utf-8')) > available_bytes: - msg_text = msg_text[:-1] - truncated = True - if len(msg_text) > 10: - if truncated: - response += f"\n{msgH[0]}: {msg_text}{trunc_marker}" - else: - response += f"\n{msgH[0]}: {msg_text}" - break - continue + for msgH in filtered_msgs: + new_line = f"\n{msgH[0]}: {msgH[1]}" + test_response = response + new_line + if len(test_response.encode('utf-8')) > maxBuffer: + # Truncate message if needed + msg_text = msgH[1] + truncated = False + trunc_marker = "..." + while len(msg_text) > 0 and len((response + f"\n{msgH[0]}: {msg_text}{trunc_marker}").encode('utf-8')) > maxBuffer: + msg_text = msg_text[:-1] + truncated = True + if len(msg_text) > 10: + if truncated: + response += f"\n{msgH[0]}: {msg_text}{trunc_marker}" else: - response += new_line + response += f"\n{msgH[0]}: {msg_text}" + break + continue + else: + response += new_line - if reverseSF: - # segassem reverse the order of the messages - response_lines = response.split("\n") - response_lines.reverse() - response = "\n".join(response_lines) - if len(response) > 0: return header + response else: @@ -1765,7 +1760,7 @@ async def start_rx(): logger.debug(f"System: HighFly Enabled using {highfly_altitude}m limit reporting to channel:{highfly_channel}") if store_forward_enabled: - logger.debug(f"System: S&F(messages command) Enabled using limit: {storeFlimit}") + logger.debug(f"System: S&F(messages command) Enabled using limit: {storeFlimit} and reverse queue:{reverseSF}") if enableEcho: logger.debug("System: Echo command Enabled") diff --git a/modules/settings.py b/modules/settings.py index 3a4447c..f01830a 100644 --- a/modules/settings.py +++ b/modules/settings.py @@ -413,7 +413,7 @@ try: splitDelay = config['messagingSettings'].getfloat('splitDelay', 0) # default 0 MESSAGE_CHUNK_SIZE = config['messagingSettings'].getint('MESSAGE_CHUNK_SIZE', 160) # default 160 chars wantAck = config['messagingSettings'].getboolean('wantAck', False) # default False - maxBuffer = config['messagingSettings'].getint('maxBuffer', 200) # default 200 + maxBuffer = config['messagingSettings'].getint('maxBuffer', 200) # default 200 bytes enableHopLogs = config['messagingSettings'].getboolean('enableHopLogs', False) # default False debugMetadata = config['messagingSettings'].getboolean('debugMetadata', False) # default False metadataFilter = config['messagingSettings'].get('metadataFilter', '').split(',') # default empty