diff options
Diffstat (limited to 'bot/exts/info/pypi.py')
| -rw-r--r-- | bot/exts/info/pypi.py | 68 | 
1 files changed, 38 insertions, 30 deletions
| diff --git a/bot/exts/info/pypi.py b/bot/exts/info/pypi.py index 3e326e8bb..2e42e7d6b 100644 --- a/bot/exts/info/pypi.py +++ b/bot/exts/info/pypi.py @@ -1,19 +1,23 @@  import itertools  import logging  import random +import re  from discord import Embed  from discord.ext.commands import Cog, Context, command  from discord.utils import escape_markdown  from bot.bot import Bot -from bot.constants import Colours, NEGATIVE_REPLIES +from bot.constants import Colours, NEGATIVE_REPLIES, RedirectOutput  URL = "https://pypi.org/pypi/{package}/json" -FIELDS = ("author", "requires_python", "summary", "license")  PYPI_ICON = "https://cdn.discordapp.com/emojis/766274397257334814.png" +  PYPI_COLOURS = itertools.cycle((Colours.yellow, Colours.blue, Colours.white)) +ILLEGAL_CHARACTERS = re.compile(r"[^-_.a-zA-Z0-9]+") +INVALID_INPUT_DELETE_DELAY = RedirectOutput.delete_delay +  log = logging.getLogger(__name__) @@ -26,43 +30,47 @@ class PyPi(Cog):      @command(name="pypi", aliases=("package", "pack"))      async def get_package_info(self, ctx: Context, package: str) -> None:          """Provide information about a specific package from PyPI.""" -        embed = Embed( -            title=random.choice(NEGATIVE_REPLIES), -            colour=Colours.soft_red -        ) +        embed = Embed(title=random.choice(NEGATIVE_REPLIES), colour=Colours.soft_red)          embed.set_thumbnail(url=PYPI_ICON) -        async with self.bot.http_session.get(URL.format(package=package)) as response: -            if response.status == 404: -                embed.description = "Package could not be found." +        error = True + +        if characters := re.search(ILLEGAL_CHARACTERS, package): +            embed.description = f"Illegal character(s) passed into command: '{escape_markdown(characters.group(0))}'" + +        else: +            async with self.bot.http_session.get(URL.format(package=package)) as response: +                if response.status == 404: +                    embed.description = "Package could not be found." + +                elif response.status == 200 and response.content_type == "application/json": +                    response_json = await response.json() +                    info = response_json["info"] -            elif response.status == 200 and response.content_type == "application/json": -                response_json = await response.json() -                info = response_json["info"] +                    embed.title = f"{info['name']} v{info['version']}" -                embed.title = f"{info['name']} v{info['version']}" -                embed.url = info['package_url'] -                embed.colour = next(PYPI_COLOURS) +                    embed.url = info["package_url"] +                    embed.colour = next(PYPI_COLOURS) -                for field in FIELDS: -                    field_data = info[field] +                    summary = escape_markdown(info["summary"]) -                    # Field could be completely empty, in some cases can be a string with whitespaces, or None. -                    if field_data and not field_data.isspace(): -                        if '\n' in field_data and field == "license": -                            field_data = field_data.split('\n')[0] +                    # Summary could be completely empty, or just whitespace. +                    if summary and not summary.isspace(): +                        embed.description = summary +                    else: +                        embed.description = "No summary provided." -                        embed.add_field( -                            name=field.replace("_", " ").title(), -                            value=escape_markdown(field_data), -                            inline=False, -                        ) +                    error = False -            else: -                embed.description = "There was an error when fetching your PyPi package." -                log.trace(f"Error when fetching PyPi package: {response.status}.") +                else: +                    embed.description = "There was an error when fetching your PyPi package." +                    log.trace(f"Error when fetching PyPi package: {response.status}.") -        await ctx.send(embed=embed) +        if error: +            await ctx.send(embed=embed, delete_after=INVALID_INPUT_DELETE_DELAY) +            await ctx.message.delete(delay=INVALID_INPUT_DELETE_DELAY) +        else: +            await ctx.send(embed=embed)  def setup(bot: Bot) -> None: | 
