diff options
author | 2023-08-10 15:35:32 +0700 | |
---|---|---|
committer | 2023-08-10 15:35:32 +0700 | |
commit | f19a5ee67dfaa5b5343fb1f02259540767267de1 (patch) | |
tree | fb5c19d804f36012c7fb88e972621160754bda79 | |
parent | Applied `isort` to `rfc.py` (diff) |
Added cache to RFC command
-rw-r--r-- | bot/exts/utilities/rfc.py | 97 |
1 files changed, 66 insertions, 31 deletions
diff --git a/bot/exts/utilities/rfc.py b/bot/exts/utilities/rfc.py index 78f88a83..bbe6efc4 100644 --- a/bot/exts/utilities/rfc.py +++ b/bot/exts/utilities/rfc.py @@ -1,6 +1,7 @@ import datetime import logging +import pydantic from discord import Embed from discord.ext import commands @@ -9,55 +10,89 @@ from bot.constants import Colours logger = logging.getLogger(__name__) -BASE_URL = "https://datatracker.ietf.org/doc/rfc{query}/doc.json" +BASE_URL = "https://datatracker.ietf.org/doc/rfc{rfc_id}/doc.json" + + +class RfcDocument(pydantic.BaseModel): + """Represents an RFC document.""" + + title: str + description: str + revisions: str + created: datetime.datetime class Rfc(commands.Cog): - """Retrieve RFCs from their ID.""" + """Retrieves RFCs by their ID.""" def __init__(self, bot: Bot): self.bot = bot + self.cache: dict[int, RfcDocument] = {} - @commands.cooldown(1, 10, commands.BucketType.user) - @commands.command() - async def rfc(self, ctx: commands.Context, query: int) -> None: - """Sends the corresponding RFC with the given ID.""" - async with self.bot.http_session.get(BASE_URL.format(query=query)) as resp: - if resp.status != 200: - error = Embed( - title="RFC not found", - description=f"RFC {query} was not found.", - colour=Colours.soft_red, - ) + async def retrieve_data(self, rfc_id: int) -> RfcDocument | None: + """Retrieves the RFC from the cache or API, and adds to the cache if it does not exist.""" + if rfc_id in self.cache: + return self.cache[rfc_id] - await ctx.send(embed=error) - return + async with self.bot.http_session.get(BASE_URL.format(rfc_id=rfc_id)) as resp: + if resp.status != 200: + return None data = await resp.json() - description = ( - data["abstract"] - or f"[Link](https://datatracker.ietf.org/doc/rfc{query})" - ) - title = data["title"] + description = ( + data["abstract"] or f"[Link](https://datatracker.ietf.org/doc/rfc{rfc_id})" + ) + + revisions = data["rev"] or len(data["rev_history"]) + + raw_date = data["rev_history"][0]["published"] + creation_date = datetime.datetime.strptime(raw_date, "%Y-%m-%dT%H:%M:%S%z") + document = RfcDocument( + title=data["title"], + description=description, + revisions=revisions, + created=creation_date, + ) + + self.cache[rfc_id] = document + + return document + + @commands.cooldown(1, 10, commands.BucketType.user) + @commands.command() + async def rfc(self, ctx: commands.Context, rfc_id: int) -> None: + """Sends the corresponding RFC with the given ID.""" + document = await self.retrieve_data(rfc_id) + + if not document: embed = Embed( - title=f"RFC {query} - {title}", - description=description, - colour=Colours.gold, + title="RFC not found", + description=f"RFC {rfc_id} does not exist.", + colour=Colours.soft_red, ) - embed.add_field( - name="Current Revision", - value=data["rev"] or len(data["rev_history"]), - ) + await ctx.send(embed=embed) - created = data["rev_history"][0]["published"] - created = datetime.datetime.strptime(created, "%Y-%m-%dT%H:%M:%S%z") + return - embed.add_field(name="Created", value=created.strftime("%Y-%m-%d")) + embed = Embed( + title=f"RFC {rfc_id} - {document.title}", + description=document.description, + colour=Colours.gold, + ) - await ctx.send(embed=embed) + embed.add_field( + name="Current Revision", + value=document.revisions, + ) + + embed.add_field( + name="Created", + value=document.created.strftime("%Y-%m-%d"), + ) + await ctx.send(embed=embed) async def setup(bot: Bot) -> None: |