improved destination filtering

This commit is contained in:
HarukiToreda
2025-10-16 17:10:34 -04:00
parent 4aad9083bb
commit 4f79475b3c
2 changed files with 12 additions and 37 deletions

View File

@@ -114,34 +114,19 @@ const StoredMessage &MessageStore::addFromPacket(const meshtastic_MeshPacket &pa
sm.textOffset = storeTextInPool(payload, len); sm.textOffset = storeTextInPool(payload, len);
sm.textLength = len; sm.textLength = len;
// Determine sender
uint32_t localNode = nodeDB->getNodeNum(); uint32_t localNode = nodeDB->getNodeNum();
sm.sender = (packet.from == 0) ? localNode : packet.from; 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' sm.dest = packet.to;
bool isDM = false;
uint32_t actualDest = sm.dest;
if (actualDest == 0 || actualDest == 0xffffffff) { bool isDM = (sm.dest != 0 && sm.dest != NODENUM_BROADCAST);
actualDest = packet.to;
}
if (actualDest != 0 && actualDest != NODENUM_BROADCAST && actualDest == localNode) {
isDM = true;
}
// Incoming vs outgoing classification
if (packet.from == 0) { if (packet.from == 0) {
// Sent by us
sm.type = isDM ? MessageType::DM_TO_US : MessageType::BROADCAST; sm.type = isDM ? MessageType::DM_TO_US : MessageType::BROADCAST;
sm.ackStatus = AckStatus::NONE; sm.ackStatus = AckStatus::NONE;
} else { } else {
// Received from another node sm.type = isDM ? MessageType::DM_TO_US : MessageType::BROADCAST;
if (isDM) {
sm.type = MessageType::DM_TO_US;
} else {
sm.type = MessageType::BROADCAST;
}
sm.ackStatus = AckStatus::ACKED; 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.textOffset = storeTextInPool(text.c_str(), text.size());
sm.textLength = text.size(); sm.textLength = text.size();
// Default manual adds to broadcast // Use the provided destination
sm.dest = NODENUM_BROADCAST; sm.dest = sender;
sm.type = MessageType::BROADCAST; 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; sm.ackStatus = AckStatus::NONE;
addLiveMessage(sm); addLiveMessage(sm);

View File

@@ -381,7 +381,7 @@ void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
include = true; include = true;
break; break;
case ThreadMode::DIRECT: 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; include = true;
break; break;
} }
@@ -846,15 +846,6 @@ void handleNewMessage(const StoredMessage &sm, const meshtastic_MeshPacket &pack
snprintf(contextBuf, sizeof(contextBuf), "in #%s", cname); snprintf(contextBuf, sizeof(contextBuf), "in #%s", cname);
else else
snprintf(contextBuf, sizeof(contextBuf), "in Ch%d", sm.channelIndex); 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]) { 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) void setThreadFor(const StoredMessage &sm, const meshtastic_MeshPacket &packet)
{ {
if (sm.dest == NODENUM_BROADCAST || sm.type == MessageType::BROADCAST) { if (packet.to == 0 || packet.to == NODENUM_BROADCAST) {
// Broadcast
setThreadMode(ThreadMode::CHANNEL, sm.channelIndex); setThreadMode(ThreadMode::CHANNEL, sm.channelIndex);
} else { } else {
// Direct message uint32_t localNode = nodeDB->getNodeNum();
uint32_t peer = (packet.from != 0) ? sm.sender : sm.dest; uint32_t peer = (sm.sender == localNode) ? packet.to : sm.sender;
setThreadMode(ThreadMode::DIRECT, -1, peer); setThreadMode(ThreadMode::DIRECT, -1, peer);
} }
} }