Skip to content

Commit a26cfa4

Browse files
authored
feat(node): support unavailable node handling (#98)
* feat(node): support unavailable node handling * chore(docs): add undocumented events
1 parent 1104d6b commit a26cfa4

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

docs/api/events.rst

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,17 @@ Callbacks
7272

7373
:param node: The node that sent the statistics.
7474
:type node: :class:`Node`
75+
76+
.. function:: on_node_ready()
77+
78+
Called when Lavalink node is ready.
79+
80+
:param node: The node that was ready.
81+
:type node: :class:`Node`
82+
83+
.. function:: on_node_unavailable()
84+
85+
Called when Lavalink node becomes unavailable.
86+
87+
:param node: The node that became unavailable.
88+
:type node: :class:`Node`

mafic/node.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,7 +759,9 @@ async def _ws_listener(self) -> None:
759759

760760
if _type is aiohttp.WSMsgType.CLOSED:
761761
self._available = False
762+
self._client.dispatch("node_unavailable", self)
762763
close_code = self._ws.close_code
764+
self._ready.clear()
763765
self._ws = None
764766

765767
wait_time = backoff.delay()

mafic/pool.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,8 @@ def label_to_node(cls) -> dict[str, Node[ClientT]]:
9191

9292
@classproperty
9393
def nodes(cls) -> list[Node[ClientT]]:
94-
"""Get the list of all nodes."""
95-
return list(cls._nodes.values())
94+
"""Get the list of all available nodes."""
95+
return list(filter(lambda n: n.available, cls._nodes.values()))
9696

9797
async def create_node(
9898
self,
@@ -366,7 +366,10 @@ def get_random_node(cls) -> Node[ClientT]:
366366
ValueError
367367
If there are no nodes.
368368
"""
369-
if node := choice(list(cls._nodes.values())):
369+
# It is a classproperty.
370+
nodes = cast(list[Node[ClientT]], cls.nodes) # pyright: ignore # noqa: PGH003
371+
372+
if node := choice(nodes):
370373
return node
371374

372375
raise NoNodesAvailable

0 commit comments

Comments
 (0)