1 Commits
Author SHA1 Message Date
Michael A. CojocariandClaude Opus 5.5 cb68782b88 touch: emoji reactions from MeshCore Open and MeshCore One read as reactions (#791)
MeshCore has no reaction packet. MeshCore Open (and Offband, meshcore-web)
sends "r:<hash>:<index>", MeshCore One "@[target]<emoji>\n<hash>" in
channels and "<emoji>\n<hash>" in DMs, all as plain text, so a reaction
landed as a raw bubble ("r:6801:02").

- ReactionCodec.h (host-tested): both parsers, MeshCore Open's v1 form
  (shown, not matched), the Dart String.hashCode hash over UTF-16 units,
  the SHA-256 / Crockford Base32 hash, and MeshCore Open's 184-entry
  emoji table in its wire order. test/test_reaction_codec.cpp runs
  meshmonitor's known-answer vectors (PR #5771) for both hashes and the
  table digest.
- newMsgImpl stores and shows '<emoji> reacted to "<start of target>"'
  when a recent message in the thread hashes to the reaction, and
  '<emoji> reacted' when none does. After the Lua hook (apps still get
  the wire text), before the chime and the glance.
- Sent bubbles keep the packet's timestamp (mesh RTC + uniqueness bump)
  instead of the system clock appendMessage stamped, within the same
  sanity window as incoming ones. The hash is over the on-air time, so a
  bubble a second off was a reaction to your own message that never
  matched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01He9DHDrX4s3uz37C3QzfdU
2026-11-01 19:46:35 -05:00