fix(v2): Parse sender name from channel message text format

Channel messages from meshcore arrive as "SenderName: message text".
The library doesn't provide sender name separately. Now parsing it
from the text (split on first colon), matching v1 parser behavior.

Also:
- Look up DM sender names from mc.contacts instead of event payload
- Fix SNR field name (uppercase 'SNR' from meshcore library)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
MarekWo
2026-03-01 11:10:13 +01:00
parent 65eb44d0ff
commit 64860ba178
+18 -6
View File
@@ -255,17 +255,25 @@ class DeviceManager:
try:
data = getattr(event, 'payload', {})
ts = data.get('timestamp', int(time.time()))
sender = data.get('sender_name', data.get('name', 'Unknown'))
content = data.get('text', '')
raw_text = data.get('text', '')
channel_idx = data.get('channel_idx', 0)
# Parse sender from "SenderName: message" format
if ':' in raw_text:
sender, content = raw_text.split(':', 1)
sender = sender.strip()
content = content.strip()
else:
sender = 'Unknown'
content = raw_text
msg_id = self.db.insert_channel_message(
channel_idx=channel_idx,
sender=sender,
content=content,
timestamp=ts,
sender_timestamp=data.get('sender_timestamp'),
snr=data.get('snr'),
snr=data.get('SNR', data.get('snr')),
path_len=data.get('path_len'),
pkt_payload=data.get('pkt_payload'),
raw_json=json.dumps(data, default=str),
@@ -294,8 +302,12 @@ class DeviceManager:
content = data.get('text', '')
sender_key = data.get('public_key', data.get('pubkey_prefix', ''))
# Ensure contact exists
sender_name = data.get('sender_name', data.get('name', 'Unknown'))
# Look up sender name from contacts (event doesn't include it)
sender_name = 'Unknown'
if sender_key and self.mc:
contact = self.mc.get_contact_by_key_prefix(sender_key)
if contact:
sender_name = contact.get('name', sender_key[:8])
if sender_key:
self.db.upsert_contact(
public_key=sender_key,
@@ -309,7 +321,7 @@ class DeviceManager:
content=content,
timestamp=ts,
sender_timestamp=data.get('sender_timestamp'),
snr=data.get('snr'),
snr=data.get('SNR', data.get('snr')),
path_len=data.get('path_len'),
pkt_payload=data.get('pkt_payload'),
raw_json=json.dumps(data, default=str),