From 367a215b05c7fb652a7058696bc307ecb16a05c4 Mon Sep 17 00:00:00 2001 From: NiceAesth Date: Mon, 13 Mar 2023 15:15:27 +0200 Subject: [PATCH 1/5] feat: allow disabling logging handler; fix: code quality --- docs/hdi/pool.md | 4 ++++ pomice/player.py | 10 +++------- pomice/pool.py | 34 +++++++++++++++++++++++----------- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/docs/hdi/pool.md b/docs/hdi/pool.md index 12f8a4b..790570e 100644 --- a/docs/hdi/pool.md +++ b/docs/hdi/pool.md @@ -70,6 +70,10 @@ After you have initialized your function, we need to fill in the proper paramete - `LogLevel` - The logging level for the node. The default logging level is `LogLevel.INFO`. +* - `log_handler` + - `Optional[logging.Handler]` + - The logging handler for the node. Set to `None` to disable the default logging handler. + ::: diff --git a/pomice/player.py b/pomice/player.py index 93aae48..ecc180b 100644 --- a/pomice/player.py +++ b/pomice/player.py @@ -131,12 +131,8 @@ class Player(VoiceProtocol): "_player_endpoint_uri", ) - def __call__(self, client: Client, channel: VoiceChannel): - self.client: Client = client - self.channel: VoiceChannel = channel - self._guild: Guild = channel.guild - - return self + def __call__(self, client: Client, channel: VoiceChannel) -> Player: + return self.__class__(client, channel) def __init__( self, @@ -262,7 +258,7 @@ class Player(VoiceProtocol): """ return self.guild.id not in self._node._players - def _adjust_end_time(self): + def _adjust_end_time(self) -> Optional[str]: if self._node._version >= LavalinkVersion(3, 7, 5): return None diff --git a/pomice/pool.py b/pomice/pool.py index ae97773..6526293 100644 --- a/pomice/pool.py +++ b/pomice/pool.py @@ -17,6 +17,7 @@ from urllib.parse import quote import aiohttp from discord import Client from discord.ext import commands +from discord.utils import MISSING from . import __version__ from . import applemusic @@ -86,6 +87,7 @@ class Node: "_apple_music_client", "_route_planner", "_log", + "_log_handler", "_stats", "available", ) @@ -108,6 +110,7 @@ class Node: apple_music: bool = False, fallback: bool = False, log_level: LogLevel = LogLevel.INFO, + log_handler: Optional[logging.Handler] = MISSING, ): self._bot: commands.Bot = bot self._host: str = host @@ -119,6 +122,7 @@ class Node: self._secure: bool = secure self._fallback: bool = fallback self._log_level: LogLevel = log_level + self._log_handler = log_handler self._websocket_uri: str = f"{'wss' if self._secure else 'ws'}://{self._host}:{self._port}" self._rest_uri: str = f"{'https' if self._secure else 'http'}://{self._host}:{self._port}" @@ -130,7 +134,7 @@ class Node: self._session_id: Optional[str] = None self._available: bool = False - self._version: LavalinkVersion = None + self._version: LavalinkVersion = LavalinkVersion(0, 0, 0) self._route_planner = RoutePlanner(self) self._log = self._setup_logging(self._log_level) @@ -212,19 +216,25 @@ class Node: def _setup_logging(self, level: LogLevel) -> logging.Logger: logger = logging.getLogger("pomice") - handler = logging.StreamHandler() - dt_fmt = "%Y-%m-%d %H:%M:%S" - formatter = logging.Formatter( - "[{asctime}] [{levelname:<8}] {name}: {message}", - dt_fmt, - style="{", - ) - handler.setFormatter(formatter) logger.setLevel(level) - logger.addHandler(handler) + + if self._log_handler is not None: + handler = self._log_handler + + elif self._log_handler is MISSING: + handler = logging.StreamHandler() + dt_fmt = "%Y-%m-%d %H:%M:%S" + formatter = logging.Formatter( + "[{asctime}] [{levelname:<8}] {name}: {message}", + dt_fmt, + style="{", + ) + handler.setFormatter(formatter) + logger.addHandler(handler) + return logger - async def _handle_version_check(self, version: str): + async def _handle_version_check(self, version: str) -> None: if version.endswith("-SNAPSHOT"): # we're just gonna assume all snapshot versions correlate with v4 self._version = LavalinkVersion(major=4, minor=0, fix=0) @@ -877,6 +887,7 @@ class NodePool: apple_music: bool = False, fallback: bool = False, log_level: LogLevel = LogLevel.INFO, + log_handler: Optional[logging.Handler] = None, ) -> Node: """Creates a Node object to be then added into the node pool. For Spotify searching capabilites, pass in valid Spotify API credentials. @@ -902,6 +913,7 @@ class NodePool: apple_music=apple_music, fallback=fallback, log_level=log_level, + log_handler=log_handler, ) await node.connect() From 0d78b00342174159c20373838142c89ad5221fbe Mon Sep 17 00:00:00 2001 From: NiceAesth Date: Mon, 13 Mar 2023 15:30:25 +0200 Subject: [PATCH 2/5] fix: type __call__ function --- Pipfile | 2 ++ pomice/player.py | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Pipfile b/Pipfile index c76e209..c0aebbe 100644 --- a/Pipfile +++ b/Pipfile @@ -13,6 +13,8 @@ pre-commit = "*" furo = "*" sphinx = "*" myst-parser = "*" +black = "*" +typing-extensions = "*" [requires] python_version = "3.8" diff --git a/pomice/player.py b/pomice/player.py index ecc180b..e1e84e8 100644 --- a/pomice/player.py +++ b/pomice/player.py @@ -132,7 +132,11 @@ class Player(VoiceProtocol): ) def __call__(self, client: Client, channel: VoiceChannel) -> Player: - return self.__class__(client, channel) + self.client = client + self.channel = channel + self._guild = channel.guild + + return self def __init__( self, From b0e0bba27b36cf42076d8cfec887df8cc7cf9059 Mon Sep 17 00:00:00 2001 From: NiceAesth Date: Mon, 13 Mar 2023 15:35:01 +0200 Subject: [PATCH 3/5] fix: add handler if exists --- pomice/pool.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pomice/pool.py b/pomice/pool.py index 6526293..88d8701 100644 --- a/pomice/pool.py +++ b/pomice/pool.py @@ -217,6 +217,7 @@ class Node: def _setup_logging(self, level: LogLevel) -> logging.Logger: logger = logging.getLogger("pomice") logger.setLevel(level) + handler = None if self._log_handler is not None: handler = self._log_handler @@ -230,6 +231,8 @@ class Node: style="{", ) handler.setFormatter(formatter) + + if handler: logger.addHandler(handler) return logger From a8a586bfb1394067f04dc4a42289560e64c884f0 Mon Sep 17 00:00:00 2001 From: NiceAesth Date: Mon, 13 Mar 2023 15:43:24 +0200 Subject: [PATCH 4/5] fix: clear handlers on add --- pomice/pool.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pomice/pool.py b/pomice/pool.py index 88d8701..4d1056c 100644 --- a/pomice/pool.py +++ b/pomice/pool.py @@ -233,6 +233,7 @@ class Node: handler.setFormatter(formatter) if handler: + logger.handlers.clear() logger.addHandler(handler) return logger From 9c262c7455e00c54f8b334af6cb2823eb765ae86 Mon Sep 17 00:00:00 2001 From: NiceAesth Date: Mon, 13 Mar 2023 16:21:56 +0200 Subject: [PATCH 5/5] feat: use regex for version matching --- pomice/pool.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/pomice/pool.py b/pomice/pool.py index 4d1056c..f55224c 100644 --- a/pomice/pool.py +++ b/pomice/pool.py @@ -50,6 +50,8 @@ __all__ = ( "NodePool", ) +VERSION_REGEX = re.compile(r"(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:[a-zA-Z0-9_-]+)?") + class Node: """The base class for a node. @@ -244,15 +246,24 @@ class Node: self._version = LavalinkVersion(major=4, minor=0, fix=0) return - # this crazy ass line maps the split version string into - # an iterable with ints instead of strings and then - # turns that iterable into a tuple. yeah, i know + _version_rx = VERSION_REGEX.match(version) + if not _version_rx: + self._available = False + raise LavalinkVersionIncompatible( + "The Lavalink version you're using is incompatible. " + "Lavalink version 3.7.0 or above is required to use this library.", + ) - split = tuple(map(int, tuple(version.split(".")))) - self._version = LavalinkVersion(*split) - if not version.endswith("-SNAPSHOT") and ( - self._version.major == 3 and self._version.minor < 7 - ): + _version_groups = _version_rx.groups() + major, minor, fix = ( + int(_version_groups[0] or 0), + int(_version_groups[1] or 0), + int(_version_groups[2] or 0), + ) + + self._log.debug(f"Parsed Lavalink version: {major}.{minor}.{fix}") + self._version = LavalinkVersion(major=major, minor=minor, fix=fix) + if self._version < LavalinkVersion(3, 7, 0): self._available = False raise LavalinkVersionIncompatible( "The Lavalink version you're using is incompatible. "