diff options
Diffstat (limited to 'bot/exts')
| -rw-r--r-- | bot/exts/evergreen/issues.py | 85 | 
1 files changed, 47 insertions, 38 deletions
| diff --git a/bot/exts/evergreen/issues.py b/bot/exts/evergreen/issues.py index 0f83731b..d909ae6e 100644 --- a/bot/exts/evergreen/issues.py +++ b/bot/exts/evergreen/issues.py @@ -23,51 +23,60 @@ class Issues(commands.Cog):      @commands.command(aliases=("pr",))      @override_in_channel(WHITELISTED_CHANNELS + (Channels.dev_contrib,))      async def issue( -        self, ctx: commands.Context, number: int, repository: str = "seasonalbot", user: str = "python-discord" +            self, ctx: commands.Context, numbers: commands.Greedy[int], repository: str = "seasonalbot", +            user: str = "python-discord"      ) -> None: -        """Command to retrieve issues from a GitHub repository.""" -        url = f"https://api.github.com/repos/{user}/{repository}/issues/{number}" -        merge_url = f"https://api.github.com/repos/{user}/{repository}/pulls/{number}/merge" - -        log.trace(f"Querying GH issues API: {url}") -        async with self.bot.http_session.get(url) as r: -            json_data = await r.json() - -        if r.status in BAD_RESPONSE: -            log.warning(f"Received response {r.status} from: {url}") -            return await ctx.send(f"[{str(r.status)}] {BAD_RESPONSE.get(r.status)}") - -        # The initial API request is made to the issues API endpoint, which will return information -        # if the issue or PR is present. However, the scope of information returned for PRs differs -        # from issues: if the 'issues' key is present in the response then we can pull the data we -        # need from the initial API call. -        if "issues" in json_data.get("html_url"): -            if json_data.get("state") == "open": -                icon_url = Emojis.issue -            else: -                icon_url = Emojis.issue_closed - -        # If the 'issues' key is not contained in the API response and there is no error code, then -        # we know that a PR has been requested and a call to the pulls API endpoint is necessary -        # to get the desired information for the PR. -        else: -            log.trace(f"PR provided, querying GH pulls API for additional information: {merge_url}") -            async with self.bot.http_session.get(merge_url) as m: +        """Command to retrieve issue(s) from a GitHub repository.""" +        links = [] + +        for number in set(numbers): +            # Convert from list to set to remove duplicates, if any. +            url = f"https://api.github.com/repos/{user}/{repository}/issues/{number}" +            merge_url = f"https://api.github.com/repos/{user}/{repository}/pulls/{number}/merge" + +            log.trace(f"Querying GH issues API: {url}") +            async with self.bot.http_session.get(url) as r: +                json_data = await r.json() + +            if r.status in BAD_RESPONSE: +                log.warning(f"Received response {r.status} from: {url}") +                return await ctx.send(f"[{str(r.status)}] #{number} {BAD_RESPONSE.get(r.status)}") + +            # The initial API request is made to the issues API endpoint, which will return information +            # if the issue or PR is present. However, the scope of information returned for PRs differs +            # from issues: if the 'issues' key is present in the response then we can pull the data we +            # need from the initial API call. +            if "issues" in json_data.get("html_url"):                  if json_data.get("state") == "open": -                    icon_url = Emojis.pull_request -                # When the status is 204 this means that the state of the PR is merged -                elif m.status == 204: -                    icon_url = Emojis.merge +                    icon_url = Emojis.issue                  else: -                    icon_url = Emojis.pull_request_closed +                    icon_url = Emojis.issue_closed -        issue_url = json_data.get("html_url") -        description_text = f"[{repository}] #{number} {json_data.get('title')}" +            # If the 'issues' key is not contained in the API response and there is no error code, then +            # we know that a PR has been requested and a call to the pulls API endpoint is necessary +            # to get the desired information for the PR. +            else: +                log.trace(f"PR provided, querying GH pulls API for additional information: {merge_url}") +                async with self.bot.http_session.get(merge_url) as m: +                    if json_data.get("state") == "open": +                        icon_url = Emojis.pull_request +                    # When the status is 204 this means that the state of the PR is merged +                    elif m.status == 204: +                        icon_url = Emojis.merge +                    else: +                        icon_url = Emojis.pull_request_closed + +            issue_url = json_data.get("html_url") +            links.append([icon_url, f"[{repository}] #{number} {json_data.get('title')}", issue_url]) + +        # Issue/PR format: emoji to show if open/closed/merged, number and the title as a singular link. +        description_list = ["{0} [{1}]({2})".format(*link) for link in links]          resp = discord.Embed(              colour=Colours.bright_green, -            description=f"{icon_url} [{description_text}]({issue_url})" +            description='\n'.join(description_list)          ) -        resp.set_author(name="GitHub", url=issue_url) + +        resp.set_author(name="GitHub", url=f"https://github.com/{user}/{repository}")          await ctx.send(embed=resp) | 
