Skip to content

Commit 29f355b

Browse files
authored
Merge pull request #719 from ianmcorvidae/ignore-nodes
Support setting nodes ignored in nodedb (with 2.5.13+ firmware)
2 parents a765bcc + 4b6d7a8 commit 29f355b

File tree

4 files changed

+113
-0
lines changed

4 files changed

+113
-0
lines changed

meshtastic/__main__.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,16 @@ def onConnected(interface):
454454
waitForAckNak = True
455455
interface.getNode(args.dest, False, **getNode_kwargs).removeFavorite(args.remove_favorite_node)
456456

457+
if args.set_ignored_node:
458+
closeNow = True
459+
waitForAckNak = True
460+
interface.getNode(args.dest, False, **getNode_kwargs).setIgnored(args.set_ignored_node)
461+
462+
if args.remove_ignored_node:
463+
closeNow = True
464+
waitForAckNak = True
465+
interface.getNode(args.dest, False, **getNode_kwargs).removeIgnored(args.remove_ignored_node)
466+
457467
if args.reset_nodedb:
458468
closeNow = True
459469
waitForAckNak = True
@@ -1722,6 +1732,16 @@ def addRemoteAdminArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPars
17221732
help="Tell the destination node to set the specified node to be un-favorited on the NodeDB on the device, by number or ID",
17231733
metavar="!xxxxxxxx"
17241734
)
1735+
group.add_argument(
1736+
"--set-ignored-node",
1737+
help="Tell the destination node to set the specified node to be ignored on the NodeDB on the devicein its DB, by number or ID",
1738+
metavar="!xxxxxxxx"
1739+
)
1740+
group.add_argument(
1741+
"--remove-ignored-node",
1742+
help="Tell the destination node to set the specified node to be un-ignored on the NodeDB on the device, by number or ID",
1743+
metavar="!xxxxxxxx"
1744+
)
17251745
group.add_argument(
17261746
"--reset-nodedb",
17271747
help="Tell the destination node to clear its list of nodes",

meshtastic/node.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,42 @@ def removeFavorite(self, nodeId: Union[int, str]):
704704
onResponse = self.onAckNak
705705
return self._sendAdmin(p, onResponse=onResponse)
706706

707+
def setIgnored(self, nodeId: Union[int, str]):
708+
"""Tell the node to set the specified node ID to be ignored on the NodeDB on the device"""
709+
self.ensureSessionKey()
710+
if isinstance(nodeId, str):
711+
if nodeId.startswith("!"):
712+
nodeId = int(nodeId[1:], 16)
713+
else:
714+
nodeId = int(nodeId)
715+
716+
p = admin_pb2.AdminMessage()
717+
p.set_ignored_node = nodeId
718+
719+
if self == self.iface.localNode:
720+
onResponse = None
721+
else:
722+
onResponse = self.onAckNak
723+
return self._sendAdmin(p, onResponse=onResponse)
724+
725+
def removeIgnored(self, nodeId: Union[int, str]):
726+
"""Tell the node to set the specified node ID to be un-ignored on the NodeDB on the device"""
727+
self.ensureSessionKey()
728+
if isinstance(nodeId, str):
729+
if nodeId.startswith("!"):
730+
nodeId = int(nodeId[1:], 16)
731+
else:
732+
nodeId = int(nodeId)
733+
734+
p = admin_pb2.AdminMessage()
735+
p.remove_ignored_node = nodeId
736+
737+
if self == self.iface.localNode:
738+
onResponse = None
739+
else:
740+
onResponse = self.onAckNak
741+
return self._sendAdmin(p, onResponse=onResponse)
742+
707743
def resetNodeDb(self):
708744
"""Tell the node to reset its list of nodes."""
709745
self.ensureSessionKey()

meshtastic/tests/test_main.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2683,3 +2683,33 @@ def test_remove_favorite_node():
26832683
main()
26842684

26852685
mocked_node.removeFavorite.assert_called_once_with("!12345678")
2686+
2687+
@pytest.mark.unit
2688+
@pytest.mark.usefixtures("reset_mt_config")
2689+
def test_set_ignored_node():
2690+
"""Test --set-ignored-node node"""
2691+
sys.argv = ["", "--set-ignored-node", "!12345678"]
2692+
mt_config.args = sys.argv
2693+
mocked_node = MagicMock(autospec=Node)
2694+
iface = MagicMock(autospec=SerialInterface)
2695+
iface.getNode.return_value = mocked_node
2696+
with patch("meshtastic.serial_interface.SerialInterface", return_value=iface):
2697+
main()
2698+
2699+
mocked_node.setIgnored.assert_called_once_with("!12345678")
2700+
2701+
2702+
@pytest.mark.unit
2703+
@pytest.mark.usefixtures("reset_mt_config")
2704+
def test_remove_ignored_node():
2705+
"""Test --remove-ignored-node node"""
2706+
sys.argv = ["", "--remove-ignored-node", "!12345678"]
2707+
mt_config.args = sys.argv
2708+
mocked_node = MagicMock(autospec=Node)
2709+
iface = MagicMock(autospec=SerialInterface)
2710+
iface.getNode.return_value = mocked_node
2711+
mocked_node.iface = iface
2712+
with patch("meshtastic.serial_interface.SerialInterface", return_value=iface):
2713+
main()
2714+
2715+
mocked_node.removeIgnored.assert_called_once_with("!12345678")

meshtastic/tests/test_node.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1453,6 +1453,33 @@ def test_remove_favorite(favorite):
14531453
iface.sendData.assert_called_once()
14541454

14551455

1456+
@pytest.mark.unit
1457+
@pytest.mark.parametrize("ignored", ["!1dec0ded", 502009325])
1458+
def test_set_ignored(ignored):
1459+
"""Test setFavorite"""
1460+
iface = MagicMock(autospec=SerialInterface)
1461+
node = Node(iface, 12345678)
1462+
amesg = admin_pb2.AdminMessage()
1463+
with patch("meshtastic.admin_pb2.AdminMessage", return_value=amesg):
1464+
node.setIgnored(ignored)
1465+
assert amesg.set_ignored_node == 502009325
1466+
iface.sendData.assert_called_once()
1467+
1468+
1469+
@pytest.mark.unit
1470+
@pytest.mark.parametrize("ignored", ["!1dec0ded", 502009325])
1471+
def test_remove_ignored(ignored):
1472+
"""Test setFavorite"""
1473+
iface = MagicMock(autospec=SerialInterface)
1474+
node = Node(iface, 12345678)
1475+
amesg = admin_pb2.AdminMessage()
1476+
with patch("meshtastic.admin_pb2.AdminMessage", return_value=amesg):
1477+
node.removeIgnored(ignored)
1478+
1479+
assert amesg.remove_ignored_node == 502009325
1480+
iface.sendData.assert_called_once()
1481+
1482+
14561483
# TODO
14571484
# @pytest.mark.unitslow
14581485
# def test_waitForConfig():

0 commit comments

Comments
 (0)