diff options
| -rw-r--r-- | bot/cogs/utils.py | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/bot/cogs/utils.py b/bot/cogs/utils.py index 303a8c1fb..55164faf1 100644 --- a/bot/cogs/utils.py +++ b/bot/cogs/utils.py @@ -2,13 +2,13 @@ import difflib import logging import re import unicodedata +from datetime import datetime, timedelta from email.parser import HeaderParser from io import StringIO from typing import Dict, Optional, Tuple, Union from discord import Colour, Embed from discord.ext.commands import BadArgument, Cog, Context, command -from discord.ext.tasks import loop from bot.bot import Bot from bot.constants import Channels, MODERATION_ROLES, STAFF_ROLES @@ -53,7 +53,8 @@ class Utils(Cog): self.peps_listing_api_url = "https://api.github.com/repos/python/peps/contents?ref=master" self.peps: Dict[int, str] = {} - self.refresh_peps_urls.start() + self.last_refreshed_peps: Optional[datetime] = None + self.bot.loop.create_task(self.refresh_peps_urls()) @command() @in_whitelist(channels=(Channels.bot_commands,), roles=STAFF_ROLES) @@ -193,7 +194,6 @@ class Utils(Cog): # PEPs area - @loop(hours=3) async def refresh_peps_urls(self) -> None: """Refresh PEP URLs listing in every 3 hours.""" # Wait until HTTP client is available @@ -211,6 +211,7 @@ class Utils(Cog): pep_number = name.replace("pep-", "").split(".")[0] self.peps[int(pep_number)] = file["download_url"] + self.last_refreshed_peps = datetime.now() log.info("Successfully refreshed PEP URLs listing.") @command(name='pep', aliases=('get_pep', 'p')) @@ -223,7 +224,7 @@ class Utils(Cog): if pep_number == 0: pep_embed = self.get_pep_zero_embed() else: - pep_embed = await self.get_pep_embed(pep_number, ctx) + pep_embed = await self.get_pep_embed(ctx, pep_number) if pep_embed: await ctx.send(embed=pep_embed) @@ -244,15 +245,20 @@ class Utils(Cog): return pep_embed - @async_cache(arg_offset=1) - async def get_pep_embed(self, pep_nr: int, ctx: Context) -> Optional[Embed]: + @async_cache(arg_offset=2) + async def get_pep_embed(self, ctx: Context, pep_nr: int) -> Optional[Embed]: """Fetch, generate and return PEP embed.""" - if pep_nr not in self.peps: - log.trace(f"PEP {pep_nr} was not found") - not_found = f"PEP {pep_nr} does not exist." - embed = Embed(title="PEP not found", description=not_found, colour=Colour.red()) - await ctx.send(embed=embed) - return + while True: + if pep_nr not in self.peps and (self.last_refreshed_peps + timedelta(minutes=30)) > datetime.now(): + log.trace(f"PEP {pep_nr} was not found") + not_found = f"PEP {pep_nr} does not exist." + embed = Embed(title="PEP not found", description=not_found, colour=Colour.red()) + await ctx.send(embed=embed) + return + elif pep_nr not in self.peps: + await self.refresh_peps_urls() + else: + break response = await self.bot.http_session.get(self.peps[pep_nr]) |