From 72f12d80e5e132156db70019e245730ce23842f8 Mon Sep 17 00:00:00 2001 From: Jack Kingsman Date: Mon, 16 Feb 2026 18:59:39 -0800 Subject: [PATCH] Fix repeater command timestamp field usage --- app/routers/contacts.py | 7 +++++-- tests/test_repeater_routes.py | 22 +++++++++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/app/routers/contacts.py b/app/routers/contacts.py index 20c32a4..3a0441a 100644 --- a/app/routers/contacts.py +++ b/app/routers/contacts.py @@ -518,9 +518,12 @@ async def send_repeater_command(public_key: str, request: CommandRequest) -> Com command=request.command, response=f"(error: {response_event.payload})" ) - # Extract the response text and timestamp from the payload + # CONTACT_MSG_RECV payloads use sender_timestamp in meshcore. response_text = response_event.payload.get("text", str(response_event.payload)) - sender_timestamp = response_event.payload.get("timestamp") + sender_timestamp = response_event.payload.get( + "sender_timestamp", + response_event.payload.get("timestamp"), + ) logger.info("Received response from %s: %s", contact.public_key[:12], response_text) return CommandResponse( diff --git a/tests/test_repeater_routes.py b/tests/test_repeater_routes.py index 371c3bc..e4db4be 100644 --- a/tests/test_repeater_routes.py +++ b/tests/test_repeater_routes.py @@ -184,7 +184,27 @@ class TestRepeaterCommandRoute: mc.start_auto_message_fetching.assert_awaited_once() @pytest.mark.asyncio - async def test_success_returns_command_response_text_and_timestamp(self, test_db): + async def test_success_returns_command_response_text_and_sender_timestamp(self, test_db): + mc = _mock_mc() + await _insert_contact(KEY_A, name="Repeater", contact_type=2) + mc.commands.send_cmd = AsyncMock(return_value=_radio_result(EventType.OK)) + mc.wait_for_event = AsyncMock(return_value=MagicMock()) + mc.commands.get_msg = AsyncMock( + return_value=_radio_result( + EventType.CONTACT_MSG_RECV, + {"text": "firmware: v1.2.3", "sender_timestamp": 1700000000}, + ) + ) + + with patch("app.routers.contacts.require_connected", return_value=mc): + response = await send_repeater_command(KEY_A, CommandRequest(command="ver")) + + assert response.command == "ver" + assert response.response == "firmware: v1.2.3" + assert response.sender_timestamp == 1700000000 + + @pytest.mark.asyncio + async def test_success_falls_back_to_legacy_timestamp_field(self, test_db): mc = _mock_mc() await _insert_contact(KEY_A, name="Repeater", contact_type=2) mc.commands.send_cmd = AsyncMock(return_value=_radio_result(EventType.OK))