diff --git a/src/MessageStore.cpp b/src/MessageStore.cpp index 58db110ce..6bb20c368 100644 --- a/src/MessageStore.cpp +++ b/src/MessageStore.cpp @@ -114,34 +114,19 @@ const StoredMessage &MessageStore::addFromPacket(const meshtastic_MeshPacket &pa sm.textOffset = storeTextInPool(payload, len); sm.textLength = len; + // Determine sender uint32_t localNode = nodeDB->getNodeNum(); sm.sender = (packet.from == 0) ? localNode : packet.from; - sm.dest = packet.decoded.dest; - // DM detection: use decoded.dest if valid, otherwise fallback to header 'to' - bool isDM = false; - uint32_t actualDest = sm.dest; + sm.dest = packet.to; - if (actualDest == 0 || actualDest == 0xffffffff) { - actualDest = packet.to; - } + bool isDM = (sm.dest != 0 && sm.dest != NODENUM_BROADCAST); - if (actualDest != 0 && actualDest != NODENUM_BROADCAST && actualDest == localNode) { - isDM = true; - } - - // Incoming vs outgoing classification if (packet.from == 0) { - // Sent by us sm.type = isDM ? MessageType::DM_TO_US : MessageType::BROADCAST; sm.ackStatus = AckStatus::NONE; } else { - // Received from another node - if (isDM) { - sm.type = MessageType::DM_TO_US; - } else { - sm.type = MessageType::BROADCAST; - } + sm.type = isDM ? MessageType::DM_TO_US : MessageType::BROADCAST; sm.ackStatus = AckStatus::ACKED; } @@ -162,11 +147,11 @@ void MessageStore::addFromString(uint32_t sender, uint8_t channelIndex, const st sm.textOffset = storeTextInPool(text.c_str(), text.size()); sm.textLength = text.size(); - // Default manual adds to broadcast - sm.dest = NODENUM_BROADCAST; - sm.type = MessageType::BROADCAST; + // Use the provided destination + sm.dest = sender; + sm.type = MessageType::DM_TO_US; - // Outgoing messages start as NONE until ACK/NACK arrives + // Outgoing messages always start with unknown ack status sm.ackStatus = AckStatus::NONE; addLiveMessage(sm); diff --git a/src/graphics/draw/MessageRenderer.cpp b/src/graphics/draw/MessageRenderer.cpp index 671d66f90..fc66a3337 100644 --- a/src/graphics/draw/MessageRenderer.cpp +++ b/src/graphics/draw/MessageRenderer.cpp @@ -381,7 +381,7 @@ void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16 include = true; break; case ThreadMode::DIRECT: - if (m.type == MessageType::DM_TO_US && (m.sender == currentPeer || m.dest == currentPeer)) + if (m.dest != NODENUM_BROADCAST && (m.sender == currentPeer || m.dest == currentPeer)) include = true; break; } @@ -846,15 +846,6 @@ void handleNewMessage(const StoredMessage &sm, const meshtastic_MeshPacket &pack snprintf(contextBuf, sizeof(contextBuf), "in #%s", cname); else snprintf(contextBuf, sizeof(contextBuf), "in Ch%d", sm.channelIndex); - } else if (sm.type == MessageType::DM_TO_US) { - /* Commenting out to better understand if we need this info in the banner - uint32_t peer = (packet.from == 0) ? sm.dest : sm.sender; - const meshtastic_NodeInfoLite *peerNode = nodeDB->getMeshNode(peer); - if (peerNode && peerNode->has_user && peerNode->user.short_name) - snprintf(contextBuf, sizeof(contextBuf), "Direct: @%s", peerNode->user.short_name); - else - snprintf(contextBuf, sizeof(contextBuf), "Direct Message"); - */ } if (contextBuf[0]) { @@ -892,12 +883,11 @@ void handleNewMessage(const StoredMessage &sm, const meshtastic_MeshPacket &pack void setThreadFor(const StoredMessage &sm, const meshtastic_MeshPacket &packet) { - if (sm.dest == NODENUM_BROADCAST || sm.type == MessageType::BROADCAST) { - // Broadcast + if (packet.to == 0 || packet.to == NODENUM_BROADCAST) { setThreadMode(ThreadMode::CHANNEL, sm.channelIndex); } else { - // Direct message - uint32_t peer = (packet.from != 0) ? sm.sender : sm.dest; + uint32_t localNode = nodeDB->getNodeNum(); + uint32_t peer = (sm.sender == localNode) ? packet.to : sm.sender; setThreadMode(ThreadMode::DIRECT, -1, peer); } }