diff options
| author | 2022-08-08 18:09:24 -0400 | |
|---|---|---|
| committer | 2022-08-08 18:09:24 -0400 | |
| commit | 6be0e91d1b7282febd39415fd33e6d3f6a0b0581 (patch) | |
| tree | e6ae70f23637bc659aa63bae9e5495e34cb64a23 | |
| parent | Add a check for whether an embed is already available via the embeds list, an... (diff) | |
Refactored methods _get_discord_message, _get_text_and_embed, and _convert_embed into bot/utils/messages.py
| -rw-r--r-- | bot/exts/fun/fun.py | 78 | ||||
| -rw-r--r-- | bot/exts/fun/uwu.py | 8 | ||||
| -rw-r--r-- | bot/utils/messages.py | 72 | 
3 files changed, 83 insertions, 75 deletions
diff --git a/bot/exts/fun/fun.py b/bot/exts/fun/fun.py index 9ec9b9ee..e7337cb6 100644 --- a/bot/exts/fun/fun.py +++ b/bot/exts/fun/fun.py @@ -3,16 +3,16 @@ import logging  import random  from collections.abc import Iterable  from pathlib import Path -from typing import Callable, Literal, Optional, Union +from typing import Literal  import pyjokes -from discord import Embed, Message +from discord import Embed  from discord.ext import commands -from discord.ext.commands import BadArgument, Cog, Context, MessageConverter, clean_content +from discord.ext.commands import BadArgument, Cog, Context, clean_content  from bot.bot import Bot  from bot.constants import Client, Colours, Emojis -from bot.utils import helpers +from bot.utils import helpers, messages  log = logging.getLogger(__name__) @@ -67,10 +67,10 @@ class Fun(Cog):              return "".join(                  char.upper() if round(random.random()) else char.lower() for char in text              ) -        text, embed = await Fun._get_text_and_embed(ctx, text) +        text, embed = await messages.get_text_and_embed(ctx, text)          # Convert embed if it exists          if embed is not None: -            embed = Fun._convert_embed(conversion_func, embed) +            embed = messages.convert_embed(conversion_func, embed)          converted_text = conversion_func(text)          converted_text = helpers.suppress_links(converted_text)          # Don't put >>> if only embed present @@ -116,10 +116,10 @@ class Fun(Cog):              """Encrypts the given string using the Caesar Cipher."""              return "".join(caesar_cipher(text, offset)) -        text, embed = await Fun._get_text_and_embed(ctx, msg) +        text, embed = await messages.get_text_and_embed(ctx, msg)          if embed is not None: -            embed = Fun._convert_embed(conversion_func, embed) +            embed = messages.convert_embed(conversion_func, embed)          converted_text = conversion_func(text) @@ -150,68 +150,6 @@ class Fun(Cog):          """          await self._caesar_cipher(ctx, offset, msg, left_shift=True) -    @staticmethod -    async def _get_text_and_embed(ctx: Context, text: str) -> tuple[str, Optional[Embed]]: -        """ -        Attempts to extract the text and embed from a possible link to a discord Message. - -        Does not retrieve the text and embed from the Message if it is in a channel the user does -        not have read permissions in. - -        Returns a tuple of: -            str: If `text` is a valid discord Message, the contents of the message, else `text`. -            Optional[Embed]: The embed if found in the valid Message, else None -        """ -        embed = None - -        msg = await Fun._get_discord_message(ctx, text) -        # Ensure the user has read permissions for the channel the message is in -        if isinstance(msg, Message): -            permissions = msg.channel.permissions_for(ctx.author) -            if permissions.read_messages: -                text = msg.clean_content -                # Take first embed because we can't send multiple embeds -                if msg.embeds: -                    embed = msg.embeds[0] - -        return (text, embed) - -    @staticmethod -    async def _get_discord_message(ctx: Context, text: str) -> Union[Message, str]: -        """ -        Attempts to convert a given `text` to a discord Message object and return it. - -        Conversion will succeed if given a discord Message ID or link. -        Returns `text` if the conversion fails. -        """ -        try: -            text = await MessageConverter().convert(ctx, text) -        except commands.BadArgument: -            log.debug(f"Input '{text:.20}...' is not a valid Discord Message") -        return text - -    @staticmethod -    def _convert_embed(func: Callable[[str, ], str], embed: Embed) -> Embed: -        """ -        Converts the text in an embed using a given conversion function, then return the embed. - -        Only modifies the following fields: title, description, footer, fields -        """ -        embed_dict = embed.to_dict() - -        embed_dict["title"] = func(embed_dict.get("title", "")) -        embed_dict["description"] = func(embed_dict.get("description", "")) - -        if "footer" in embed_dict: -            embed_dict["footer"]["text"] = func(embed_dict["footer"].get("text", "")) - -        if "fields" in embed_dict: -            for field in embed_dict["fields"]: -                field["name"] = func(field.get("name", "")) -                field["value"] = func(field.get("value", "")) - -        return Embed.from_dict(embed_dict) -      @commands.command()      async def joke(self, ctx: commands.Context, category: Literal["neutral", "chuck", "all"] = "all") -> None:          """Retrieves a joke of the specified `category` from the pyjokes api.""" diff --git a/bot/exts/fun/uwu.py b/bot/exts/fun/uwu.py index ed8925e5..60a5834d 100644 --- a/bot/exts/fun/uwu.py +++ b/bot/exts/fun/uwu.py @@ -9,7 +9,7 @@ from discord.ext import commands  from discord.ext.commands import Cog, Context, clean_content  from bot.bot import Bot -from bot.utils import helpers +from bot.utils import helpers, messages  if t.TYPE_CHECKING:      from bot.exts.fun.fun import Fun  # pragma: no cover @@ -185,14 +185,14 @@ class Uwu(Cog):          if fun_cog:              # Grabs the text from the embed for uwuification              if embeds: -                embed = fun_cog._convert_embed(self._uwuify, embeds[0]) +                embed = messages.convert_embed(self._uwuify, embeds[0])              else:                  # Parse potential message links in text -                text, embed = await fun_cog._get_text_and_embed(ctx, text) +                text, embed = await messages.get_text_and_embed(ctx, text)                  # If an embed is found, grab and uwuify its text                  if embed: -                    embed = fun_cog._convert_embed(self._uwuify, embed) +                    embed = messages.convert_embed(self._uwuify, embed)          else:              embed = None diff --git a/bot/utils/messages.py b/bot/utils/messages.py index a6c035f9..ccc8b61c 100644 --- a/bot/utils/messages.py +++ b/bot/utils/messages.py @@ -1,5 +1,12 @@ +import logging  import re -from typing import Optional +from typing import Callable, Optional, Union + +from discord import Embed, Message +from discord.ext import commands +from discord.ext.commands import Context, MessageConverter + +log = logging.getLogger(__name__)  def sub_clyde(username: Optional[str]) -> Optional[str]: @@ -17,3 +24,66 @@ def sub_clyde(username: Optional[str]) -> Optional[str]:          return re.sub(r"(clyd)(e)", replace_e, username, flags=re.I)      else:          return username  # Empty string or None + + +async def get_discord_message(ctx: Context, text: str) -> Union[Message, str]: +    """ +    Attempts to convert a given `text` to a discord Message object and return it. + +    Conversion will succeed if given a discord Message ID or link. +    Returns `text` if the conversion fails. +    """ +    try: +        text = await MessageConverter().convert(ctx, text) +    except commands.BadArgument: +        log.debug(f"Input '{text:.20}...' is not a valid Discord Message") + +    return text + + +async def get_text_and_embed(ctx: Context, text: str) -> tuple[str, Optional[Embed]]: +    """ +    Attempts to extract the text and embed from a possible link to a discord Message. + +    Does not retrieve the text and embed from the Message if it is in a channel the user does +    not have read permissions in. + +    Returns a tuple of: +        str: If `text` is a valid discord Message, the contents of the message, else `text`. +        Optional[Embed]: The embed if found in the valid Message, else None +    """ +    embed: Optional[Embed] = None + +    msg = await get_discord_message(ctx, text) +    # Ensure the user has read permissions for the channel the message is in +    if isinstance(msg, Message): +        permissions = msg.channel.permissions_for(ctx.author) +        if permissions.read_messages: +            text = msg.clean_content +            # Take first embed because we can't send multiple embeds +            if msg.embeds: +                embed = msg.embeds[0] + +    return (text, embed) + + +def convert_embed(func: Callable[[str, ], str], embed: Embed) -> Embed: +    """ +    Converts the text in an embed using a given conversion function, then return the embed. + +    Only modifies the following fields: title, description, footer, fields +    """ +    embed_dict = embed.to_dict() + +    embed_dict["title"] = func(embed_dict.get("title", "")) +    embed_dict["description"] = func(embed_dict.get("description", "")) + +    if "footer" in embed_dict: +        embed_dict["footer"]["text"] = func(embed_dict["footer"].get("text", "")) + +    if "fields" in embed_dict: +        for field in embed_dict["fields"]: +            field["name"] = func(field.get("name", "")) +            field["value"] = func(field.get("value", "")) + +    return Embed.from_dict(embed_dict)  |