From 4a72cdda750a3eeed87affc5cd1b42b8205d1b9d Mon Sep 17 00:00:00 2001 From: l5y <220195275+l5yth@users.noreply.github.com> Date: Tue, 16 Sep 2025 10:35:11 +0200 Subject: [PATCH] Fix extraction of packet sender ids (#84) --- data/mesh.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/data/mesh.py b/data/mesh.py index 690d40f..44e411f 100644 --- a/data/mesh.py +++ b/data/mesh.py @@ -16,6 +16,7 @@ import dataclasses import json, os, time, threading, signal, urllib.request, urllib.error +from collections.abc import Mapping from meshtastic.serial_interface import SerialInterface from pubsub import pub @@ -107,17 +108,27 @@ def _iso(ts: int | float) -> str: ) -def _first(d: dict, *names, default=None): +def _first(d, *names, default=None): """Return first present key from names (supports nested 'a.b' lookups).""" + + def _mapping_get(obj, key): + if isinstance(obj, Mapping) and key in obj: + return True, obj[key] + if hasattr(obj, "__getitem__"): + try: + return True, obj[key] + except Exception: + pass + if hasattr(obj, key): + return True, getattr(obj, key) + return False, None + for name in names: cur = d - parts = name.split(".") ok = True - for p in parts: - if isinstance(cur, dict) and p in cur: - cur = cur[p] - else: - ok = False + for part in name.split("."): + ok, cur = _mapping_get(cur, part) + if not ok: break if ok: return cur