diff options
| author | 2021-09-11 09:11:59 -0400 | |
|---|---|---|
| committer | 2021-09-11 09:11:59 -0400 | |
| commit | 350b99c2196619681d2a62f9a7fb700b9dff0de7 (patch) | |
| tree | 517932b576782d222488cc0bfa76644cb76bd316 /bot | |
| parent | Move .json file to correct folder (diff) | |
| parent | Added "colour information" and "colour conversion" features (diff) | |
Merge branch 'color-677' of github.com:brad90four/sir-lancebot into color-677777777
Diffstat (limited to 'bot')
| -rw-r--r-- | bot/exts/utilities/color.py | 136 | 
1 files changed, 101 insertions, 35 deletions
| diff --git a/bot/exts/utilities/color.py b/bot/exts/utilities/color.py index d7fff503..6abfc006 100644 --- a/bot/exts/utilities/color.py +++ b/bot/exts/utilities/color.py @@ -1,4 +1,4 @@ -# import colorsys +import colorsys  import logging  import re  from io import BytesIO @@ -32,7 +32,7 @@ class Color(commands.Cog):          self.bot = bot      @commands.command(aliases=["colour"]) -    async def color(self, ctx: commands.Context, mode: str, user_color: str) -> None: +    async def color(self, ctx: commands.Context, mode: str, *, user_color: str) -> None:          """Send information on input color code or color name."""          logger.info(f"{mode = }")          logger.info(f"{user_color = }") @@ -76,44 +76,28 @@ class Color(commands.Cog):              await ctx.send(embed=wrong_mode_embed)              return -        main_embed = Embed( -            title=user_color,  # need to replace with fuzzymatch color name -            color=hex_color, -        )          async with ctx.typing(): -            file = await self._create_thumbnail_attachment(rgb_color) +            main_embed = Embed( +                title=user_color,  # need to replace with fuzzymatch color name +                description='(Approx..)', +                color=hex_color, +            ) + +            file = await self.create_thumbnail_attachment(rgb_color)              main_embed.set_thumbnail(url="attachment://color.png") -        main_embed.add_field( -            name="Hex", -            value=f">>Hex #{hex_color}", -            inline=False, -        ) -        main_embed.add_field( -            name="RGB", -            value=f">>RGB {rgb_color}", -            inline=False, -        ) -        """ -        main_embed.add_field( -            name="HSV", -            value=f">>HSV {hsv_color}", -            inline=False, -        ) -        main_embed.add_field( -            name="HSL", -            value=f">>HSL {hsl_color}", -            inline=False, -        ) -        main_embed.add_field( -            name="CMYK", -            value=f">>CMYK {cmyk_color}", -            inline=False, -        ) -        """ +            fields = self.get_color_fields(rgb_color) +            for field in fields: +                main_embed.add_field( +                    name=field['name'], +                    value=field['value'], +                    inline=False, +                ) +          await ctx.send(file=file, embed=main_embed) -    async def _create_thumbnail_attachment(self, color: str) -> File: +    @staticmethod +    async def create_thumbnail_attachment(color: str) -> File:          """Generate a thumbnail from `color`."""          thumbnail = Image.new("RGB", (100, 100), color=color)          bufferedio = BytesIO() @@ -124,6 +108,88 @@ class Color(commands.Cog):          return file +    @staticmethod +    def get_color_fields(rgb_color: tuple[int, int, int]) -> list[dict]: +        """Converts from `RGB` to `CMYK`, `HSV`, `HSL` and returns a list of fields.""" + +        def _rgb_to_hex(rgb_color: tuple[int, int, int]) -> str: +            """To convert from `RGB` to `Hex` notation.""" +            return '#' + ''.join(hex(color)[2:].zfill(2) for color in rgb_color).upper() + +        def _rgb_to_cmyk(rgb_color: tuple[int, int, int]) -> tuple[int, int, int, int]: +            """To convert from `RGB` to `CMYK` color space.""" +            r, g, b = rgb_color + +            # RGB_SCALE -> 255 +            # CMYK_SCALE -> 100 + +            if (r == g == b == 0): +                return 0, 0, 0, 100  # Representing Black + +            # rgb [0,RGB_SCALE] -> cmy [0,1] +            c = 1 - r / 255 +            m = 1 - g / 255 +            y = 1 - b / 255 + +            # extract out k [0, 1] +            min_cmy = min(c, m, y) +            c = (c - min_cmy) / (1 - min_cmy) +            m = (m - min_cmy) / (1 - min_cmy) +            y = (y - min_cmy) / (1 - min_cmy) +            k = min_cmy + +            # rescale to the range [0,CMYK_SCALE] and round off +            c = round(c * 100) +            m = round(m * 100) +            y = round(y * 100) +            k = round(k * 100) + +            return c, m, y, k + +        def _rgb_to_hsv(rgb_color: tuple[int, int, int]) -> tuple[int, int, int]: +            """To convert from `RGB` to `HSV` color space.""" +            r, g, b = rgb_color +            h, v, s = colorsys.rgb_to_hsv(r/float(255), g/float(255), b/float(255)) +            h = round(h*360) +            s = round(s*100) +            v = round(v*100) +            return h, s, v + +        def _rgb_to_hsl(rgb_color: tuple[int, int, int]) -> tuple[int, int, int]: +            """To convert from `RGB` to `HSL` color space.""" +            r, g, b = rgb_color +            h, l, s = colorsys.rgb_to_hls(r/float(255), g/float(255), b/float(255)) +            h = round(h*360) +            s = round(s*100) +            l = round(l*100)  # noqa: E741 It's little `L`, Reason: To maintain consistency. +            return h, s, l + +        hex_color = _rgb_to_hex(rgb_color) +        cmyk_color = _rgb_to_cmyk(rgb_color) +        hsv_color = _rgb_to_hsv(rgb_color) +        hsl_color = _rgb_to_hsl(rgb_color) + +        all_fields = [ +            { +                "name": "RGB", +                "value": f"» rgb {rgb_color}\n» hex {hex_color}" +            }, +            { +                "name": "CMYK", +                "value": f"» cmyk {cmyk_color}" +            }, +            { +                "name": "HSV", +                "value": f"» hsv {hsv_color}" +            }, +            { +                "name": "HSL", +                "value": f"» hsl {hsl_color}" +            }, +        ] + +        return all_fields +      # if user_color in color_lists:      #     # fuzzy match for color | 
