From 8457799a601c18f7d1136d012dc415e5aaed566e Mon Sep 17 00:00:00 2001 From: Jack Kingsman Date: Mon, 16 Feb 2026 18:26:05 -0800 Subject: [PATCH] Use contact object on broadcast from DB rather than hand-rolling --- app/event_handlers.py | 5 ++++- app/packet_processor.py | 24 +++++++----------------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/app/event_handlers.py b/app/event_handlers.py index 71cbd76..a968b35 100644 --- a/app/event_handlers.py +++ b/app/event_handlers.py @@ -221,7 +221,10 @@ async def on_new_contact(event: "Event") -> None: } await ContactRepository.upsert(contact_data) - broadcast_event("contact", contact_data) + # Read back from DB so the broadcast includes all fields (last_contacted, + # last_read_at, etc.) matching the REST Contact shape exactly. + db_contact = await ContactRepository.get_by_key(public_key) + broadcast_event("contact", (db_contact.model_dump() if db_contact else contact_data)) async def on_ack(event: "Event") -> None: diff --git a/app/packet_processor.py b/app/packet_processor.py index 1755ab4..1aa9d86 100644 --- a/app/packet_processor.py +++ b/app/packet_processor.py @@ -697,23 +697,13 @@ async def _process_advertisement( advert.public_key[:12], ) - # Broadcast contact update to connected clients - broadcast_event( - "contact", - { - "public_key": advert.public_key.lower(), - "name": advert.name, - "type": contact_type, - "flags": existing.flags if existing else 0, - "last_path": path_hex, - "last_path_len": path_len, - "last_advert": advert.timestamp if advert.timestamp > 0 else timestamp, - "lat": advert.lat, - "lon": advert.lon, - "last_seen": timestamp, - "on_radio": existing.on_radio if existing else False, - }, - ) + # Read back from DB so the broadcast includes all fields (last_contacted, + # last_read_at, flags, on_radio, etc.) matching the REST Contact shape exactly. + db_contact = await ContactRepository.get_by_key(advert.public_key.lower()) + if db_contact: + broadcast_event("contact", db_contact.model_dump()) + else: + broadcast_event("contact", contact_data) # For new contacts, optionally attempt to decrypt any historical DMs we may have stored # This is controlled by the auto_decrypt_dm_on_advert setting