diff options
| -rw-r--r-- | bot/exts/backend/branding/_cog.py | 8 | ||||
| -rw-r--r-- | bot/exts/backend/branding/_repository.py | 35 |
2 files changed, 20 insertions, 23 deletions
diff --git a/bot/exts/backend/branding/_cog.py b/bot/exts/backend/branding/_cog.py index 7d4f80f13..d6c5b159b 100644 --- a/bot/exts/backend/branding/_cog.py +++ b/bot/exts/backend/branding/_cog.py @@ -145,10 +145,10 @@ class Branding(commands.Cog): """ log.info(f"Applying {asset_type.value} asset to the guild") - file = await self.repository.fetch_file(download_url) - - if file is None: - log.error(f"Failed to download {asset_type.value} from branding repository!") + try: + file = await self.repository.fetch_file(download_url) + except Exception as fetch_exc: + log.error(f"Failed to fetch '{asset_type.value}' asset: {fetch_exc}") return False await self.bot.wait_until_guild_available() diff --git a/bot/exts/backend/branding/_repository.py b/bot/exts/backend/branding/_repository.py index e14ff4226..715361c5d 100644 --- a/bot/exts/backend/branding/_repository.py +++ b/bot/exts/backend/branding/_repository.py @@ -100,33 +100,30 @@ class BrandingRepository: The directory will be represented by a mapping from file or sub-directory names to their corresponding instances of `RemoteObject`. Passing a custom `types` value allows only getting files or directories. - If the request fails, returns an empty dictionary. + An exception will be raised if the request fails, or if the response lacks the expected keys. """ full_url = f"{BRANDING_URL}/{path}" log.debug(f"Fetching directory from branding repository: {full_url}") async with self.bot.http_session.get(full_url, params=PARAMS, headers=HEADERS) as response: - if response.status == 200: - json_directory = await response.json() - else: - log.warning(f"Received non-200 response status: {response.status}") - return {} + if response.status != 200: + raise RuntimeError(f"Failed to fetch directory due to status: {response.status}") + json_directory = await response.json() return {file["name"]: RemoteObject(file) for file in json_directory if file["type"] in types} - async def fetch_file(self, download_url: str) -> t.Optional[bytes]: + async def fetch_file(self, download_url: str) -> bytes: """ - Fetch file from `download_url`. + Fetch file as bytes from `download_url`. - Returns the file as bytes unless the request fails, in which case None is given. + Raise an exception if the request does not succeed. """ log.debug(f"Fetching file from branding repository: {download_url}") async with self.bot.http_session.get(download_url, params=PARAMS, headers=HEADERS) as response: - if response.status == 200: - return await response.read() - else: - log.warning(f"Received non-200 response status: {response.status}") + if response.status != 200: + raise RuntimeError(f"Failed to fetch file due to status: {response.status}") + return await response.read() async def parse_meta_file(self, raw_file: bytes) -> MetaFile: """ @@ -170,16 +167,11 @@ class BrandingRepository: server_icons = await self.fetch_directory(contents["server_icons"].path, types=("file",)) - if server_icons is None: - raise BrandingMisconfiguration("Failed to fetch server icons!") if len(server_icons) == 0: raise BrandingMisconfiguration("Found no server icons!") meta_bytes = await self.fetch_file(contents["meta.md"].download_url) - if meta_bytes is None: - raise BrandingMisconfiguration("Failed to fetch 'meta.md' file!") - meta_file = await self.parse_meta_file(meta_bytes) return Event(directory.path, meta_file, contents["banner.png"], list(server_icons.values())) @@ -193,7 +185,12 @@ class BrandingRepository: """ log.debug("Discovering events in branding repository") - event_directories = await self.fetch_directory("events", types=("dir",)) # Skip files + try: + event_directories = await self.fetch_directory("events", types=("dir",)) # Skip files + except Exception as fetch_exc: + log.error(f"Failed to fetch 'events' directory: {fetch_exc}") + return [] + instances: t.List[Event] = [] for event_directory in event_directories.values(): |