From 534c6d8d3b979e71f995995576d110d2d1a00ec4 Mon Sep 17 00:00:00 2001 From: beer-psi Date: Thu, 9 Oct 2025 08:38:16 +0700 Subject: [PATCH 1/2] fix: do not assume Python 3.14 has compression.zstd --- discord/utils.py | 42 ++++++++++++++---------------------------- 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/discord/utils.py b/discord/utils.py index a4aa2835a..cacfc2bbe 100644 --- a/discord/utils.py +++ b/discord/utils.py @@ -74,11 +74,6 @@ import logging import yarl -if sys.version_info >= (3, 14): - import compression.zstd -else: - import zlib - try: import orjson # type: ignore except ModuleNotFoundError: @@ -87,11 +82,18 @@ else: HAS_ORJSON = True try: - import zstandard # type: ignore -except ImportError: - _HAS_ZSTD = False -else: + from zstandard import ZstdDecompressor # type: ignore + _HAS_ZSTD = True +except ImportError: + try: + from compression.zstd import ZstdDecompressor + except ImportError: + import zlib + + _HAS_ZSTD = False + else: + _HAS_ZSTD = True __all__ = ( 'oauth_url', @@ -1429,32 +1431,16 @@ def _human_join(seq: Sequence[str], /, *, delimiter: str = ', ', final: str = 'o if _HAS_ZSTD: class _ZstdDecompressionContext: - __slots__ = ('context',) - - COMPRESSION_TYPE: str = 'zstd-stream' - - def __init__(self) -> None: - decompressor = zstandard.ZstdDecompressor() - self.context = decompressor.decompressobj() - - def decompress(self, data: bytes, /) -> str | None: - # Each WS message is a complete gateway message - return self.context.decompress(data).decode('utf-8') - - _ActiveDecompressionContext: Type[_DecompressionContext] = _ZstdDecompressionContext -elif sys.version_info >= (3, 14): - - class _ZstdDecompressionContext: - __slots__ = ('context',) + __slots__ = ('decompressor',) COMPRESSION_TYPE: str = 'zstd-stream' def __init__(self) -> None: - self.context = compression.zstd.ZstdDecompressor() + self.decompressor = ZstdDecompressor() def decompress(self, data: bytes, /) -> str | None: # Each WS message is a complete gateway message - return self.context.decompress(data).decode('utf-8') + return self.decompressor.decompress(data).decode('utf-8') _ActiveDecompressionContext: Type[_DecompressionContext] = _ZstdDecompressionContext else: From 71da99a7da346c3b45f1b2cb9f8672c84abdca8c Mon Sep 17 00:00:00 2001 From: beer-psi Date: Thu, 9 Oct 2025 08:46:58 +0700 Subject: [PATCH 2/2] appease pyright --- discord/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/discord/utils.py b/discord/utils.py index cacfc2bbe..986d166d3 100644 --- a/discord/utils.py +++ b/discord/utils.py @@ -87,7 +87,7 @@ try: _HAS_ZSTD = True except ImportError: try: - from compression.zstd import ZstdDecompressor + from compression.zstd import ZstdDecompressor # type: ignore except ImportError: import zlib