mirror of
https://github.com/pdxlocations/contact.git
synced 2026-11-02 00:55:46 +01:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5baef73c3c | ||
|
|
46a73fbc65 | ||
|
|
0145d84f3b | ||
|
|
ff656f20ad | ||
|
|
eef321cac7 | ||
|
|
cc33716222 |
No files matched your search
@@ -160,13 +160,28 @@ def get_time_ago(timestamp):
|
||||
REPLY_EXCERPT_LENGTH = 5
|
||||
|
||||
|
||||
def _local_short_name() -> str:
|
||||
"""Return this node's short name without depending on the message database."""
|
||||
nodes = getattr(interface_state.interface, "nodes", {}) or {}
|
||||
for node in nodes.values():
|
||||
if node.get("num") == interface_state.myNodeNum:
|
||||
short_name = node.get("user", {}).get("shortName")
|
||||
if short_name:
|
||||
return str(short_name)
|
||||
return ""
|
||||
|
||||
|
||||
def build_reply_prefix(prefix: str, message: str) -> str:
|
||||
"""Create Contact's local display marker for a native Meshtastic reply."""
|
||||
sender_text = re.sub(r"^\[[^]]+\]\s*", "", prefix).strip()
|
||||
sender_text = re.sub(r"^(?:>>|<<)\s*(?:\[[^]]+\]\s*)?", "", sender_text)
|
||||
sender_match = re.search(r"(.+?)\s*:\s*$", sender_text)
|
||||
sender = sender_match.group(1).strip() if sender_match else "me"
|
||||
excerpt = " ".join(message.replace("\x00", "").split())[:REPLY_EXCERPT_LENGTH]
|
||||
if sender_text.startswith(config.sent_message_prefix.strip()):
|
||||
sender = _local_short_name()
|
||||
else:
|
||||
sender_text = re.sub(r"^(?:>>|<<)\s*(?:\[[^]]+\]\s*)?", "", sender_text)
|
||||
sender_match = re.search(r"(.+?)\s*:\s*$", sender_text)
|
||||
sender = sender_match.group(1).strip() if sender_match else "me"
|
||||
message_without_reply_marker = re.sub(r"^<Re:\s*[^>]*>\s*", "", message.replace("\x00", ""))
|
||||
excerpt = " ".join(message_without_reply_marker.split())[:REPLY_EXCERPT_LENGTH]
|
||||
return f"<Re: {sender}: {excerpt}> "
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "contact"
|
||||
version = "1.5.8"
|
||||
version = "1.5.11"
|
||||
description = "This Python curses client for Meshtastic is a terminal-based client designed to manage device settings, enable mesh chat communication, and handle configuration backups and restores."
|
||||
authors = [
|
||||
{name = "Ben Lipsey",email = "ben@pdxlocations.com"}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import unittest
|
||||
from types import SimpleNamespace
|
||||
from unittest import mock
|
||||
|
||||
import contact.ui.default_config as config
|
||||
@@ -110,6 +111,23 @@ class ContactUiTests(unittest.TestCase):
|
||||
|
||||
self.assertEqual(reply, "<Re: B1G1: This > ")
|
||||
|
||||
def test_build_reply_prefix_uses_me_for_an_outgoing_message(self) -> None:
|
||||
contact_ui.interface_state.myNodeNum = 123
|
||||
contact_ui.interface_state.interface = SimpleNamespace(
|
||||
nodes={"!0000007b": {"num": 123, "user": {"shortName": "LRY"}}}
|
||||
)
|
||||
reply = contact_ui.build_reply_prefix("[06:27:25] >> Sent[☼]: ", "Thanks Lairy")
|
||||
|
||||
self.assertEqual(reply, "<Re: LRY: Thank> ")
|
||||
|
||||
def test_build_reply_prefix_does_not_nest_an_existing_reply_marker(self) -> None:
|
||||
reply = contact_ui.build_reply_prefix(
|
||||
"[06:27:25] >> xT1e: ",
|
||||
"<Re: CATS: Woot!> Woot indeed",
|
||||
)
|
||||
|
||||
self.assertEqual(reply, "<Re: xT1e: Woot > ")
|
||||
|
||||
def test_handle_ctrl_r_prefills_reply_for_message_at_cursor(self) -> None:
|
||||
ui_state.current_window = 1
|
||||
ui_state.channel_list = ["Primary"]
|
||||
|
||||
Reference in new issue
Block a user