fix : avoid our node to be a relaynode candidate (#4037)

This commit is contained in:
emp3r0r7
2025-12-18 15:25:18 +01:00
committed by GitHub
parent 9833795864
commit d8a1f88bda
3 changed files with 20 additions and 5 deletions

View File

@@ -82,15 +82,23 @@ data class Packet(
companion object {
const val RELAY_NODE_SUFFIX_MASK = 0xFF
fun getRelayNode(relayNodeId: Int, nodes: List<Node>): Node? {
fun getRelayNode(relayNodeId: Int, nodes: List<Node>, ourNodeNum: Int?): Node? {
val relayNodeIdSuffix = relayNodeId and RELAY_NODE_SUFFIX_MASK
val candidateRelayNodes = nodes.filter { (it.num and RELAY_NODE_SUFFIX_MASK) == relayNodeIdSuffix }
val candidateRelayNodes =
nodes.filter {
it.num != ourNodeNum &&
it.lastHeard != 0 &&
(it.num and RELAY_NODE_SUFFIX_MASK) == relayNodeIdSuffix
}
val closestRelayNode =
if (candidateRelayNodes.size == 1) {
candidateRelayNodes.first()
} else {
candidateRelayNodes.minByOrNull { it.hopsAway }
}
return closestRelayNode
}
}

View File

@@ -116,6 +116,7 @@ internal fun MessageListPaged(
MessageStatusDialog(
message = message,
nodes = state.nodes,
ourNode = state.ourNode,
resendOption = message.status?.equals(MessageStatus.ERROR) ?: false,
onResend = {
handlers.onDeleteMessages(listOf(message.uuid))
@@ -439,15 +440,18 @@ internal fun UnreadMessagesDivider(modifier: Modifier = Modifier) {
internal fun MessageStatusDialog(
message: Message,
nodes: List<Node>,
ourNode: Node?,
resendOption: Boolean,
onResend: () -> Unit,
onDismiss: () -> Unit,
) {
val (title, text) = message.getStatusStringRes()
val relayNodeName by
remember(message.relayNode, nodes) {
remember(message.relayNode, nodes, ourNode) {
derivedStateOf {
message.relayNode?.let { relayNodeId -> Packet.getRelayNode(relayNodeId, nodes)?.user?.longName }
message.relayNode?.let { relayNodeId ->
Packet.getRelayNode(relayNodeId, nodes, ourNode?.num)?.user?.longName
}
}
}
DeliveryInfo(

View File

@@ -297,7 +297,10 @@ constructor(
val placeholder = "___RELAY_NODE___"
if (relayNode != 0) {
Packet.getRelayNode(relayNode, nodeRepository.nodeDBbyNum.value.values.toList())?.let { node ->
val myNodeNum = nodeRepository.myNodeInfo.value?.myNodeNum
val nodeList = nodeRepository.nodeDBbyNum.value.values.toList()
Packet.getRelayNode(relayNode, nodeList, myNodeNum)?.let { node ->
val relayId = node.user.id
val relayName = node.user.longName
val regex = Regex("""\brelay_node: ${relayNode.toUInt()}\b""")