From 2dd94ea6b5eca89613a4173605106b965cbb5ac7 Mon Sep 17 00:00:00 2001 From: Paillat-dev Date: Fri, 26 Dec 2025 14:11:20 +0100 Subject: [PATCH 1/5] :wastebasket: Deprecate theme-related `Colour` methods --- discord/colour.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/discord/colour.py b/discord/colour.py index 0ec77d5786..f810a0c5cd 100644 --- a/discord/colour.py +++ b/discord/colour.py @@ -29,6 +29,8 @@ import random from typing import Any, TypeVar +from typing_extensions import deprecated + __all__ = ( "Colour", "Color", @@ -299,6 +301,9 @@ def greyple(cls: type[CT]) -> CT: return cls(0x99AAB5) @classmethod + @deprecated( + "Colour.dark_theme is deprecated since version 2.7.1 and will be removed in version 3.0. This is not relevant anymore since Discord provides the custom themes feature." + ) def dark_theme(cls: type[CT]) -> CT: """A factory method that returns a :class:`Colour` with a value of ``0x36393F``. This will appear transparent on Discord's dark theme. @@ -332,6 +337,9 @@ def nitro_pink(cls: type[CT]) -> CT: return cls(0xF47FFF) @classmethod + @deprecated( + "Colour.embed_background is deprecated since version 2.7.1 and will be removed in version 3.0. This is not relevant anymore since Discord provides the custom themes feature." + ) def embed_background(cls: type[CT], theme: str = "dark") -> CT: """A factory method that returns a :class:`Colour` corresponding to the embed colours on discord clients, with a value of: From addf82c27592a8724490f2af02ae6c7149175e22 Mon Sep 17 00:00:00 2001 From: Paillat-dev Date: Fri, 26 Dec 2025 14:12:57 +0100 Subject: [PATCH 2/5] :memo: CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c8c0b6a3f..0ee4eb2141 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,9 @@ These changes are available on the `master` branch, but have not yet been releas ### Deprecated +- Deprecated `Colour.dark_theme()` and `Colour.embed_background()`. + ([#3043](https://github.com/Pycord-Development/pycord/pull/3043)) + ### Removed ## [2.7.0] - 2025-12-24 From 392eac0296286436162c600b80547b80e95c26fe Mon Sep 17 00:00:00 2001 From: Paillat-dev Date: Fri, 26 Dec 2025 15:27:06 +0100 Subject: [PATCH 3/5] :recycle: Update `Colour` class docstring to remove mention of roles --- discord/colour.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/discord/colour.py b/discord/colour.py index f810a0c5cd..df47bddce2 100644 --- a/discord/colour.py +++ b/discord/colour.py @@ -40,7 +40,7 @@ class Colour: - """Represents a Discord role colour. This class is similar + """Represents a Colour. This class is similar to a (red, green, blue) :class:`tuple`. There is an alias for this called Color. From 9ea4c57cfcc4668b2953295aaf346d431737bdb3 Mon Sep 17 00:00:00 2001 From: Paillat-dev Date: Fri, 26 Dec 2025 15:35:42 +0100 Subject: [PATCH 4/5] :label: Replace `type[CT]` with `type[Self]` and apply `@override` to relevant methods in `Colour` class --- discord/colour.py | 76 +++++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/discord/colour.py b/discord/colour.py index df47bddce2..3e8c1e85ba 100644 --- a/discord/colour.py +++ b/discord/colour.py @@ -29,7 +29,7 @@ import random from typing import Any, TypeVar -from typing_extensions import deprecated +from typing_extensions import Self, deprecated, override __all__ = ( "Colour", @@ -86,18 +86,22 @@ def __init__(self, value: int): def _get_byte(self, byte: int) -> int: return (self.value >> (8 * byte)) & 0xFF + @override def __eq__(self, other: Any) -> bool: return isinstance(other, Colour) and self.value == other.value + @override def __str__(self) -> str: return f"#{self.value:0>6x}" def __int__(self) -> int: return self.value + @override def __repr__(self) -> str: return f"" + @override def __hash__(self) -> int: return hash(self.value) @@ -121,27 +125,27 @@ def to_rgb(self) -> tuple[int, int, int]: return self.r, self.g, self.b @classmethod - def from_rgb(cls: type[CT], r: int, g: int, b: int) -> CT: + def from_rgb(cls: type[Self], r: int, g: int, b: int) -> Self: """Constructs a :class:`Colour` from an RGB tuple.""" return cls((r << 16) + (g << 8) + b) @classmethod - def from_hsv(cls: type[CT], h: float, s: float, v: float) -> CT: + def from_hsv(cls: type[Self], h: float, s: float, v: float) -> Self: """Constructs a :class:`Colour` from an HSV tuple.""" rgb = colorsys.hsv_to_rgb(h, s, v) return cls.from_rgb(*(int(x * 255) for x in rgb)) @classmethod - def default(cls: type[CT]) -> CT: + def default(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0``.""" return cls(0) @classmethod def random( - cls: type[CT], + cls: type[Self], *, seed: int | str | float | bytes | bytearray | None = None, - ) -> CT: + ) -> Self: """A factory method that returns a :class:`Colour` with a random hue. .. note:: @@ -162,17 +166,17 @@ def random( return cls.from_hsv(rand.random(), 1, 1) @classmethod - def teal(cls: type[CT]) -> CT: + def teal(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x1abc9c``.""" return cls(0x1ABC9C) @classmethod - def dark_teal(cls: type[CT]) -> CT: + def dark_teal(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x11806a``.""" return cls(0x11806A) @classmethod - def brand_green(cls: type[CT]) -> CT: + def brand_green(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x57F287``. .. versionadded:: 2.0 @@ -180,67 +184,67 @@ def brand_green(cls: type[CT]) -> CT: return cls(0x57F287) @classmethod - def green(cls: type[CT]) -> CT: + def green(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x2ecc71``.""" return cls(0x2ECC71) @classmethod - def dark_green(cls: type[CT]) -> CT: + def dark_green(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x1f8b4c``.""" return cls(0x1F8B4C) @classmethod - def blue(cls: type[CT]) -> CT: + def blue(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x3498db``.""" return cls(0x3498DB) @classmethod - def dark_blue(cls: type[CT]) -> CT: + def dark_blue(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x206694``.""" return cls(0x206694) @classmethod - def purple(cls: type[CT]) -> CT: + def purple(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x9b59b6``.""" return cls(0x9B59B6) @classmethod - def dark_purple(cls: type[CT]) -> CT: + def dark_purple(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x71368a``.""" return cls(0x71368A) @classmethod - def magenta(cls: type[CT]) -> CT: + def magenta(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0xe91e63``.""" return cls(0xE91E63) @classmethod - def dark_magenta(cls: type[CT]) -> CT: + def dark_magenta(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0xad1457``.""" return cls(0xAD1457) @classmethod - def gold(cls: type[CT]) -> CT: + def gold(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0xf1c40f``.""" return cls(0xF1C40F) @classmethod - def dark_gold(cls: type[CT]) -> CT: + def dark_gold(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0xc27c0e``.""" return cls(0xC27C0E) @classmethod - def orange(cls: type[CT]) -> CT: + def orange(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0xe67e22``.""" return cls(0xE67E22) @classmethod - def dark_orange(cls: type[CT]) -> CT: + def dark_orange(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0xa84300``.""" return cls(0xA84300) @classmethod - def brand_red(cls: type[CT]) -> CT: + def brand_red(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0xED4245``. .. versionadded:: 2.0 @@ -248,55 +252,55 @@ def brand_red(cls: type[CT]) -> CT: return cls(0xED4245) @classmethod - def red(cls: type[CT]) -> CT: + def red(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0xe74c3c``.""" return cls(0xE74C3C) @classmethod - def dark_red(cls: type[CT]) -> CT: + def dark_red(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x992d22``.""" return cls(0x992D22) @classmethod - def lighter_grey(cls: type[CT]) -> CT: + def lighter_grey(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x95a5a6``.""" return cls(0x95A5A6) lighter_gray = lighter_grey @classmethod - def dark_grey(cls: type[CT]) -> CT: + def dark_grey(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x607d8b``.""" return cls(0x607D8B) dark_gray = dark_grey @classmethod - def light_grey(cls: type[CT]) -> CT: + def light_grey(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x979c9f``.""" return cls(0x979C9F) light_gray = light_grey @classmethod - def darker_grey(cls: type[CT]) -> CT: + def darker_grey(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x546e7a``.""" return cls(0x546E7A) darker_gray = darker_grey @classmethod - def og_blurple(cls: type[CT]) -> CT: + def og_blurple(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x7289da``.""" return cls(0x7289DA) @classmethod - def blurple(cls: type[CT]) -> CT: + def blurple(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x5865F2``.""" return cls(0x5865F2) @classmethod - def greyple(cls: type[CT]) -> CT: + def greyple(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x99aab5``.""" return cls(0x99AAB5) @@ -304,7 +308,7 @@ def greyple(cls: type[CT]) -> CT: @deprecated( "Colour.dark_theme is deprecated since version 2.7.1 and will be removed in version 3.0. This is not relevant anymore since Discord provides the custom themes feature." ) - def dark_theme(cls: type[CT]) -> CT: + def dark_theme(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0x36393F``. This will appear transparent on Discord's dark theme. @@ -313,7 +317,7 @@ def dark_theme(cls: type[CT]) -> CT: return cls(0x36393F) @classmethod - def fuchsia(cls: type[CT]) -> CT: + def fuchsia(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0xEB459E``. .. versionadded:: 2.0 @@ -321,7 +325,7 @@ def fuchsia(cls: type[CT]) -> CT: return cls(0xEB459E) @classmethod - def yellow(cls: type[CT]) -> CT: + def yellow(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0xFEE75C``. .. versionadded:: 2.0 @@ -329,7 +333,7 @@ def yellow(cls: type[CT]) -> CT: return cls(0xFEE75C) @classmethod - def nitro_pink(cls: type[CT]) -> CT: + def nitro_pink(cls: type[Self]) -> Self: """A factory method that returns a :class:`Colour` with a value of ``0xf47fff``. .. versionadded:: 2.0 @@ -340,7 +344,7 @@ def nitro_pink(cls: type[CT]) -> CT: @deprecated( "Colour.embed_background is deprecated since version 2.7.1 and will be removed in version 3.0. This is not relevant anymore since Discord provides the custom themes feature." ) - def embed_background(cls: type[CT], theme: str = "dark") -> CT: + def embed_background(cls: type[Self], theme: str = "dark") -> Self: """A factory method that returns a :class:`Colour` corresponding to the embed colours on discord clients, with a value of: From 5bb6b81e920807f948b8d51e134debb4ffe93474 Mon Sep 17 00:00:00 2001 From: Paillat-dev Date: Sun, 28 Dec 2025 23:51:50 +0100 Subject: [PATCH 5/5] :coffin: Remove dead TypeVar --- discord/colour.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/discord/colour.py b/discord/colour.py index 3e8c1e85ba..aa4690dcf1 100644 --- a/discord/colour.py +++ b/discord/colour.py @@ -27,7 +27,7 @@ import colorsys import random -from typing import Any, TypeVar +from typing import Any from typing_extensions import Self, deprecated, override @@ -36,8 +36,6 @@ "Color", ) -CT = TypeVar("CT", bound="Colour") - class Colour: """Represents a Colour. This class is similar