diff options
| -rw-r--r-- | bot/seasons/evergreen/issues.py | 85 |
1 files changed, 45 insertions, 40 deletions
diff --git a/bot/seasons/evergreen/issues.py b/bot/seasons/evergreen/issues.py index 438ab475..a0969e50 100644 --- a/bot/seasons/evergreen/issues.py +++ b/bot/seasons/evergreen/issues.py @@ -3,55 +3,60 @@ import logging import discord from discord.ext import commands -from bot.constants import Colours -from bot.decorators import override_in_channel - log = logging.getLogger(__name__) +icons = {"issue": "https://i.imgur.com/HFV0nv9.png", + "issue-closed": "https://i.imgur.com/uZSX7as.png", + "pull-request": "https://i.imgur.com/zHhnALX.png", + "pull-request-closed": "https://i.imgur.com/JYmTn5P.png", + "merge": "https://i.imgur.com/xzQZxXe.png"} -class Issues(commands.Cog): - """Cog that allows users to retrieve issues from GitHub.""" +respValue = {404: "Issue/pull request not located! Please enter a valid number!", + 403: "rate limit has been hit! Please try again later!"} - def __init__(self, bot: commands.Bot): - self.bot = bot - - @commands.command(aliases=("issues",)) - @override_in_channel() - async def issue( - self, ctx: commands.Context, number: int, repository: str = "seasonalbot", user: str = "python-discord" - ) -> None: - """Command to retrieve issues from a GitHub repository.""" - api_url = f"https://api.github.com/repos/{user}/{repository}/issues/{number}" - failed_status = { - 404: f"Issue #{number} doesn't exist in the repository {user}/{repository}.", - 403: f"Rate limit exceeded. Please wait a while before trying again!" - } - - async with self.bot.http_session.get(api_url) as r: - json_data = await r.json() - response_code = r.status - if response_code in failed_status: - return await ctx.send(failed_status[response_code]) - - repo_url = f"https://github.com/{user}/{repository}" - issue_embed = discord.Embed(colour=Colours.bright_green) - issue_embed.add_field(name="Repository", value=f"[{user}/{repository}]({repo_url})", inline=False) - issue_embed.add_field(name="Issue Number", value=f"#{number}", inline=False) - issue_embed.add_field(name="Status", value=json_data["state"].title()) - issue_embed.add_field(name="Link", value=json_data["html_url"], inline=False) +class Issues(commands.Cog): + """Cog that allows users to retrieve issues from GitHub""" - description = json_data["body"] - if len(description) > 1024: - placeholder = " [...]" - description = f"{description[:1024 - len(placeholder)]}{placeholder}" + def __init__(self, bot): + self.bot = bot - issue_embed.add_field(name="Description", value=description, inline=False) + @commands.command(aliases=("pr",)) + async def issues(self, ctx, number: int, repository: str = "seasonalbot", user: str = "python-discord"): + """Command to get issues/pull request from GitHub""" + url = f"https://api.github.com/repos/{user}/{repository}/issues/{str(number)}" + mergeURL = f"https://api.github.com/repos/{user}/{repository}/pulls/{str(number)}/merge" - await ctx.send(embed=issue_embed) + async with self.bot.http_session.get(url) as r: + json_data = await r.json() + if r.status in respValue: + return await ctx.send(f"[{str(r.status)}] {respValue.get(r.status)}") + + if "issues" in json_data.get("html_url"): + if json_data.get("state") == "open": + iconURL = icons.get("issue") + else: + iconURL = icons.get("issue_closed") + else: + async with self.bot.http_session.get(mergeURL) as m: + if json_data.get("state") == "open": + iconURL = icons.get("pull-request") + elif m.status == 204: + iconURL = icons.get("merge") + else: + iconURL = icons.get("pull-request-closed") + + resp = discord.Embed(colour=0x6CC644) + resp.set_author( + name=f"[{repository}] #{number} {json_data.get('title')}", + url=json_data.get("html_url"), + icon_url=iconURL) + await ctx.send(embed=resp) + + +def setup(bot): + """Cog Retrieves Issues From Github""" -def setup(bot: commands.Bot) -> None: - """Github Issues Cog Load.""" bot.add_cog(Issues(bot)) log.info("Issues cog loaded") |