From 324460a64560b6654fd37ebf1f96ca7f84aa1d4e Mon Sep 17 00:00:00 2001 From: Rob Wainwright <47543882+apex2504@users.noreply.github.com> Date: Sat, 16 Apr 2022 02:35:35 +0100 Subject: [PATCH 1/8] Add support for getting plugins --- lavalink/client.py | 19 ++++++++++++++++++- lavalink/models.py | 18 ++++++++++++++++++ lavalink/node.py | 13 +++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/lavalink/client.py b/lavalink/client.py index 11003b9e..204b90c1 100644 --- a/lavalink/client.py +++ b/lavalink/client.py @@ -27,7 +27,7 @@ import random from collections import defaultdict from inspect import getmembers, ismethod -from typing import Set, Union +from typing import List, Set, Union from urllib.parse import quote import aiohttp @@ -329,6 +329,23 @@ async def routeplanner_free_all_failing(self, node: Node) -> bool: return await self._post_request('{}/routeplanner/free/all'.format(node.http_uri), headers={'Authorization': node.password}) + async def get_node_plugins(self, node: Node) -> List[dict]: + """|coro| + Retrieves a list of plugins active on the target node. + + Parameters + ---------- + node: :class:`Node` + The node to use for the query. + + Returns + ------- + List[:class:`dict`] + A list of dicts representing the currently active plugins. + """ + return await self._post_request('{}/plugins'.format(node.http_uri), + headers={'Authorization': node.password}) + async def voice_update_handler(self, data): """|coro| This function intercepts websocket data from your Discord library and diff --git a/lavalink/models.py b/lavalink/models.py index 3b6335a7..43d606d1 100644 --- a/lavalink/models.py +++ b/lavalink/models.py @@ -22,6 +22,7 @@ SOFTWARE. """ from abc import ABC, abstractmethod +from dataclasses import dataclass from enum import Enum from random import randrange from time import time @@ -922,3 +923,20 @@ async def change_node(self, node): await self._apply_filters() await self.node._dispatch_event(NodeChangedEvent(self, old_node, node)) + + +@dataclass +class Plugin: + """ + Represents a Lavalink server plugin. + + Attributes + ---------- + name: :class:`str` + The name of the plugin. + version: :class:`str` + The version of the plugin. + """ + + name: str + version: str diff --git a/lavalink/node.py b/lavalink/node.py index 90f1e154..92c1fd16 100644 --- a/lavalink/node.py +++ b/lavalink/node.py @@ -22,6 +22,7 @@ SOFTWARE. """ from .events import Event +from .models import Plugin from .stats import Stats from .websocket import WebSocket @@ -164,6 +165,18 @@ async def routeplanner_free_all_failing(self): """ return await self._manager._lavalink.routeplanner_free_all_failing(self) + async def get_plugins(self): + """|coro| + Retrieves a list of plugins active on this node. + + Returns + ------- + List[:class:`Plugin`] + A list of active plugins. + """ + data = await self._manager._lavalink.get_node_plugins(self) + return [Plugin(plugin['name'], plugin['version']) for plugin in data] + async def _dispatch_event(self, event: Event): """|coro| Dispatches the given event to all registered hooks. From 4e7f061508a8eeb804c7376f4b66cf7a25334be2 Mon Sep 17 00:00:00 2001 From: Rob Wainwright <47543882+apex2504@users.noreply.github.com> Date: Sat, 16 Apr 2022 02:39:32 +0100 Subject: [PATCH 2/8] Doc for plugins --- docs/lavalink.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/lavalink.rst b/docs/lavalink.rst index 3a5bedcf..ffeb75e5 100644 --- a/docs/lavalink.rst +++ b/docs/lavalink.rst @@ -121,6 +121,9 @@ Models .. autoclass:: DefaultPlayer :members: +.. autoclass:: Plugin + :members: + Node ---- .. autoclass:: Node From d24c2feee7da590ac67e496b096fd19a69b0cc8f Mon Sep 17 00:00:00 2001 From: Rob Wainwright <47543882+apex2504@users.noreply.github.com> Date: Sat, 16 Apr 2022 17:31:47 +0100 Subject: [PATCH 3/8] remove dataclass for py3.5 and return List[Plugin] --- lavalink/client.py | 11 ++++++----- lavalink/models.py | 13 +++++++++---- lavalink/node.py | 3 +-- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lavalink/client.py b/lavalink/client.py index 204b90c1..b94083fd 100644 --- a/lavalink/client.py +++ b/lavalink/client.py @@ -34,7 +34,7 @@ from .errors import AuthenticationError, NodeError from .events import Event -from .models import DefaultPlayer, LoadResult, Source +from .models import DefaultPlayer, LoadResult, Plugin, Source from .node import Node from .nodemanager import NodeManager from .playermanager import PlayerManager @@ -329,7 +329,7 @@ async def routeplanner_free_all_failing(self, node: Node) -> bool: return await self._post_request('{}/routeplanner/free/all'.format(node.http_uri), headers={'Authorization': node.password}) - async def get_node_plugins(self, node: Node) -> List[dict]: + async def get_node_plugins(self, node: Node) -> List[Plugin]: """|coro| Retrieves a list of plugins active on the target node. @@ -340,11 +340,12 @@ async def get_node_plugins(self, node: Node) -> List[dict]: Returns ------- - List[:class:`dict`] - A list of dicts representing the currently active plugins. + List[:class:`Plugin`] + A list of Plugins active on the target node. """ - return await self._post_request('{}/plugins'.format(node.http_uri), + data = await self._post_request('{}/plugins'.format(node.http_uri), headers={'Authorization': node.password}) + return [Plugin(plugin) for plugin in data] async def voice_update_handler(self, data): """|coro| diff --git a/lavalink/models.py b/lavalink/models.py index 43d606d1..541ee7f7 100644 --- a/lavalink/models.py +++ b/lavalink/models.py @@ -22,7 +22,6 @@ SOFTWARE. """ from abc import ABC, abstractmethod -from dataclasses import dataclass from enum import Enum from random import randrange from time import time @@ -925,11 +924,15 @@ async def change_node(self, node): await self.node._dispatch_event(NodeChangedEvent(self, old_node, node)) -@dataclass class Plugin: """ Represents a Lavalink server plugin. + Parameters + ---------- + data: :class:`dict` + The data to initialise a Plugin from. + Attributes ---------- name: :class:`str` @@ -937,6 +940,8 @@ class Plugin: version: :class:`str` The version of the plugin. """ + __slots__ = ('name', 'version') - name: str - version: str + def __init__(self, data: dict): + self.name: str = data['name'] + self.version: str = data['version'] diff --git a/lavalink/node.py b/lavalink/node.py index 92c1fd16..d523df55 100644 --- a/lavalink/node.py +++ b/lavalink/node.py @@ -174,8 +174,7 @@ async def get_plugins(self): List[:class:`Plugin`] A list of active plugins. """ - data = await self._manager._lavalink.get_node_plugins(self) - return [Plugin(plugin['name'], plugin['version']) for plugin in data] + return await self._manager._lavalink.get_node_plugins(self) async def _dispatch_event(self, event: Event): """|coro| From 840560fed21ec41c202de198989bf6e2b456a711 Mon Sep 17 00:00:00 2001 From: Rob Wainwright <47543882+apex2504@users.noreply.github.com> Date: Thu, 26 May 2022 22:26:23 +0100 Subject: [PATCH 4/8] POST is not GET --- lavalink/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lavalink/client.py b/lavalink/client.py index 9f93f2e5..7e1de6d2 100644 --- a/lavalink/client.py +++ b/lavalink/client.py @@ -326,7 +326,7 @@ async def routeplanner_free_all_failing(self, node: Node) -> bool: :class:`bool` True if all failing addresses were freed, False otherwise. """ - return await self._post_request('{}/routeplanner/free/all'.format(node.http_uri), + return await self._get_request('{}/routeplanner/free/all'.format(node.http_uri), headers={'Authorization': node.password}) async def get_node_plugins(self, node: Node) -> List[Plugin]: From 53f56d3943e146c079bfcc5f9a5bd1b92b763ab9 Mon Sep 17 00:00:00 2001 From: Rob Wainwright <47543882+apex2504@users.noreply.github.com> Date: Thu, 26 May 2022 22:29:47 +0100 Subject: [PATCH 5/8] =?UTF-8?q?changed=20the=20wrong=20line=20=F0=9F=91=8D?= =?UTF-8?q?=F0=9F=91=8D=F0=9F=91=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lavalink/client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lavalink/client.py b/lavalink/client.py index 7e1de6d2..1e033e5f 100644 --- a/lavalink/client.py +++ b/lavalink/client.py @@ -326,7 +326,7 @@ async def routeplanner_free_all_failing(self, node: Node) -> bool: :class:`bool` True if all failing addresses were freed, False otherwise. """ - return await self._get_request('{}/routeplanner/free/all'.format(node.http_uri), + return await self._post_request('{}/routeplanner/free/all'.format(node.http_uri), headers={'Authorization': node.password}) async def get_node_plugins(self, node: Node) -> List[Plugin]: @@ -343,7 +343,7 @@ async def get_node_plugins(self, node: Node) -> List[Plugin]: List[:class:`Plugin`] A list of Plugins active on the target node. """ - data = await self._post_request('{}/plugins'.format(node.http_uri), + data = await self._get_request('{}/plugins'.format(node.http_uri), headers={'Authorization': node.password}) return [Plugin(plugin) for plugin in data] From b75f7c71f271331a673b7df00fedc7ba1215aa49 Mon Sep 17 00:00:00 2001 From: Rob Wainwright <47543882+apex2504@users.noreply.github.com> Date: Thu, 26 May 2022 22:50:51 +0100 Subject: [PATCH 6/8] repr for plugin --- lavalink/models.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lavalink/models.py b/lavalink/models.py index e44b6e6d..d5b25996 100644 --- a/lavalink/models.py +++ b/lavalink/models.py @@ -1008,3 +1008,6 @@ class Plugin: def __init__(self, data: dict): self.name: str = data['name'] self.version: str = data['version'] + + def __repr__(self): + return '{0.name} v{0.version}'.format(self) From ba0400569487e4f0b27707f4a3ea3b0c29585fcb Mon Sep 17 00:00:00 2001 From: Rob Wainwright <47543882+apex2504@users.noreply.github.com> Date: Thu, 26 May 2022 22:53:50 +0100 Subject: [PATCH 7/8] plugin str --- lavalink/models.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lavalink/models.py b/lavalink/models.py index d5b25996..8e1fd341 100644 --- a/lavalink/models.py +++ b/lavalink/models.py @@ -1009,5 +1009,8 @@ def __init__(self, data: dict): self.name: str = data['name'] self.version: str = data['version'] - def __repr__(self): + def __str__(self): return '{0.name} v{0.version}'.format(self) + + def __repr__(self): + return ''.format(self) From fa8b78f344ddf03940a653d73ace90b5de46f33a Mon Sep 17 00:00:00 2001 From: Rob Wainwright <47543882+apex2504@users.noreply.github.com> Date: Thu, 26 May 2022 23:00:45 +0100 Subject: [PATCH 8/8] cleanups --- lavalink/client.py | 2 +- lavalink/node.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lavalink/client.py b/lavalink/client.py index 1e033e5f..8d458997 100644 --- a/lavalink/client.py +++ b/lavalink/client.py @@ -344,7 +344,7 @@ async def get_node_plugins(self, node: Node) -> List[Plugin]: A list of Plugins active on the target node. """ data = await self._get_request('{}/plugins'.format(node.http_uri), - headers={'Authorization': node.password}) + headers={'Authorization': node.password}) return [Plugin(plugin) for plugin in data] async def voice_update_handler(self, data): diff --git a/lavalink/node.py b/lavalink/node.py index d523df55..352801ce 100644 --- a/lavalink/node.py +++ b/lavalink/node.py @@ -22,7 +22,6 @@ SOFTWARE. """ from .events import Event -from .models import Plugin from .stats import Stats from .websocket import WebSocket