From 2841fb12a5847096412d57bf2797297e7064b1c3 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Thu, 1 Feb 2024 19:46:39 -0500 Subject: [PATCH] fix(bible): fixing error handling --- bible/bible.py | 102 +++++++++++++++++++++--------------------------- bible/errors.py | 29 ++++++++++++-- 2 files changed, 70 insertions(+), 61 deletions(-) diff --git a/bible/bible.py b/bible/bible.py index 5040cff..b543afb 100644 --- a/bible/bible.py +++ b/bible/bible.py @@ -44,7 +44,7 @@ class Bible(commands.Cog): for book in books: if book_name in (book["abbreviation"], book["name"]): return book["id"] - raise ValueError(f"Book {book_name} not found.") + raise ValueError(error(f"Book {book_name} not found.")) async def _get_passage( self, bible_id: str, passage_id: str, include_verse_numbers: bool @@ -67,13 +67,11 @@ class Bible(commands.Cog): "_get_passage executed with a response code of: %s", response.status ) if response.status == 401: - raise bible.errors.Unauthorized("Missing/Invalid API key.") + raise bible.errors.Unauthorized() if response.status == 403: - raise bible.errors.BibleAccessError( - "The provided API key cannot retrieve sections from the configured Bible." - ) + raise bible.errors.BibleAccessError() if response.status == 404: - raise bible.errors.NotFound("The requested passage was not found.") + raise bible.errors.NotFound() data = await response.json() return data["data"] @@ -87,11 +85,9 @@ class Bible(commands.Cog): "_get_books executed with a response code of: %s", response.status ) if response.status == 401: - raise bible.errors.Unauthorized("Missing/Invalid API key.") + raise bible.errors.Unauthorized() if response.status == 403: - raise bible.errors.BibleAccessError( - "The provided API key cannot retrieve sections from the configured Bible." - ) + raise bible.errors.BibleAccessError() data = await response.json() return data["data"] @@ -105,11 +101,9 @@ class Bible(commands.Cog): "_get_chapters executed with a response code of: %s", response.status ) if response.status == 401: - raise bible.errors.Unauthorized("Missing/Invalid API key.") + raise bible.errors.Unauthorized() if response.status == 403: - raise bible.errors.BibleAccessError( - "The provided API key cannot retrieve sections from the configured Bible." - ) + raise bible.errors.BibleAccessError() data = await response.json() return data["data"] @@ -123,11 +117,9 @@ class Bible(commands.Cog): "_get_verses executed with a response code of: %s", response.status ) if response.status == 401: - raise bible.errors.Unauthorized("Missing/Invalid API key.") + raise bible.errors.Unauthorized() if response.status == 403: - raise bible.errors.BibleAccessError( - "The provided API key cannot retrieve sections from the configured Bible." - ) + raise bible.errors.BibleAccessError() data = await response.json() return data["data"] @@ -150,17 +142,25 @@ class Bible(commands.Cog): await ctx.send(str(e)) return - if len(passage.split("-")) == 2: - from_verse, to_verse = passage.replace(":", ".").split("-") - if "." not in to_verse: - to_verse = f"{from_verse.split('.')[0]}.{to_verse}" - passage = await self._get_passage( - bible_id, f"{book_id}.{from_verse}-{book_id}.{to_verse}", True - ) - else: - passage = await self._get_passage( - bible_id, f"{book_id}.{passage.replace(':', '.')}", False - ) + try: + if len(passage.split("-")) == 2: + from_verse, to_verse = passage.replace(":", ".").split("-") + if "." not in to_verse: + to_verse = f"{from_verse.split('.')[0]}.{to_verse}" + passage = await self._get_passage( + bible_id, f"{book_id}.{from_verse}-{book_id}.{to_verse}", True + ) + else: + passage = await self._get_passage( + bible_id, f"{book_id}.{passage.replace(':', '.')}", False + ) + except ( + bible.errors.BibleAccessError, + bible.errors.NotFound, + bible.errors.Unauthorized, + ) as e: + await ctx.send(e.message) + return if len(passage["content"]) > 4096: await ctx.send("The passage is too long to send.") @@ -179,16 +179,24 @@ class Bible(commands.Cog): """Get a random Bible verse.""" bible_id = await self.config.bible() - books = await self._get_books(bible_id) - book = random.choice(books) + try: + books = await self._get_books(bible_id) + book = random.choice(books) - chapters = await self._get_chapters(bible_id, book["id"]) - chapter = random.choice(chapters) + chapters = await self._get_chapters(bible_id, book["id"]) + chapter = random.choice(chapters) - verses = await self._get_verses(bible_id, book["id"], chapter["number"]) - verse = random.choice(verses)["id"] + verses = await self._get_verses(bible_id, book["id"], chapter["number"]) + verse = random.choice(verses)["id"] - passage = await self._get_passage(bible_id, verse, False) + passage = await self._get_passage(bible_id, verse, False) + except ( + bible.errors.BibleAccessError, + bible.errors.NotFound, + bible.errors.Unauthorized, + ) as e: + await ctx.send(e.message) + return embed = Embed( title=f"{passage['reference']}", @@ -197,25 +205,3 @@ class Bible(commands.Cog): ) embed.set_footer(text=f"{ctx.prefix}bible random - Powered by API.bible") await ctx.send(embed=embed) - - @bible_passage.error - @bible_random.error - async def error_handler(self, ctx: commands.Context, err): - if isinstance(err, bible.errors.Unauthorized): - await ctx.send( - error( - """The API key for API.bible is missing or invalid. Please report this to the bot owner. - If you are the bot owner, please check the documentation [here](https://seacogs.coastalcommits.com/bible/#setup).""" - ) - ) - return - elif isinstance(err, bible.errors.BibleAccessError): - await ctx.send( - error( - "The provided API key cannot retrieve sections from the configured Bible. Please report this to the bot owner." - ) - ) - return - elif isinstance(err, bible.errors.NotFound): - await ctx.send(error("The requested passage was not found.")) - return diff --git a/bible/errors.py b/bible/errors.py index ac9d9f0..ab8c70a 100644 --- a/bible/errors.py +++ b/bible/errors.py @@ -1,10 +1,33 @@ +from redbot.core.utils.chat_formatting import error + + class BibleAccessError(Exception): - pass + def __init__( + self, + message: str = error( + "The provided API key cannot retrieve sections from the configured Bible. Please report this to the bot owner." + ), + ): + super().__init__(message) + self.message = message class Unauthorized(Exception): - pass + def __init__( + self, + message: str = error( + """The API key for API.bible is missing or invalid. Please report this to the bot owner. + If you are the bot owner, please check the documentation [here](https://seacogs.coastalcommits.com/bible/#setup).""" + ), + ): + super().__init__(message) + self.message = message class NotFound(Exception): - pass + def __init__( + self, + message: str = error("The requested passage was not found."), + ): + super().__init__(message) + self.message = message