From 80dcf7705f1773593dd0973ffb3041c07d6d81b4 Mon Sep 17 00:00:00 2001 From: Toricane Date: Sun, 16 Oct 2022 18:24:38 -0700 Subject: [PATCH 01/16] chore: debug --- interactions/api/http/request.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index 39dc3d5d0..b9afc1a1f 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -146,14 +146,21 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: async with self._session.request( route.method, route.__api__ + route.path, **kwargs ) as response: + if response.content_type == "application/json": + data = await response.json() + else: + data = None - data = await response.json(content_type=None) reset_after: float = float( - response.headers.get("X-RateLimit-Reset-After", "0.0") + response.headers.get( + "X-RateLimit-Reset-After", response.headers.get("Retry-After", "0.0") + ) ) remaining: str = response.headers.get("X-RateLimit-Remaining") _bucket: str = response.headers.get("X-RateLimit-Bucket") is_global: bool = response.headers.get("X-RateLimit-Global", False) + code: int = response.status + message: str = data.get("message") log.debug(f"{route.method}: {route.__api__ + route.path}: {kwargs}") @@ -161,28 +168,21 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: self.buckets[route.endpoint] = _bucket # real-time replacement/update/add if needed. if isinstance(data, dict) and ( - data.get("errors") - or ((code := data.get("code")) and code != 429 and data.get("message")) + data.get("errors") or (code and code != 429 and message) ): - log.debug( - f"RETURN {response.status}: {dumps(data, indent=4, sort_keys=True)}" - ) + log.debug(f"RETURN {code}: {dumps(data, indent=4, sort_keys=True)}") # This "redundant" debug line is for debug use and tracing back the error codes. - raise LibraryException( - message=data["message"], code=data["code"], severity=40, data=data - ) - elif isinstance(data, dict) and data.get("code") == 0 and data.get("message"): - log.debug( - f"RETURN {response.status}: {dumps(data, indent=4, sort_keys=True)}" - ) + raise LibraryException(message=message, code=code, severity=40, data=data) + elif isinstance(data, dict) and code == 0 and message: + log.debug(f"RETURN {code}: {dumps(data, indent=4, sort_keys=True)}") # This "redundant" debug line is for debug use and tracing back the error codes. raise LibraryException( - message=f"'{data['message']}'. Make sure that your token is set properly.", + message=f"'{message}'. Make sure that your token is set properly.", severity=50, ) - if response.status == 429: + if code == 429: if is_global: log.warning( f"The HTTP client has encountered a global ratelimit. Locking down future requests for {reset_after} seconds." From 74e2662b9d73034d0b8511a44c79eafc9ece8a9f Mon Sep 17 00:00:00 2001 From: Toricane Date: Sun, 16 Oct 2022 18:47:43 -0700 Subject: [PATCH 02/16] refactor: error message --- interactions/api/http/request.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index b9afc1a1f..b79bf6447 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -174,7 +174,7 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: # This "redundant" debug line is for debug use and tracing back the error codes. raise LibraryException(message=message, code=code, severity=40, data=data) - elif isinstance(data, dict) and code == 0 and message: + elif isinstance(data, dict) and code in (0, 403) and message: log.debug(f"RETURN {code}: {dumps(data, indent=4, sort_keys=True)}") # This "redundant" debug line is for debug use and tracing back the error codes. @@ -184,20 +184,17 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: ) if code == 429: if is_global: - log.warning( - f"The HTTP client has encountered a global ratelimit. Locking down future requests for {reset_after} seconds." - ) self._global_lock.reset_after = reset_after self._loop.call_later( self._global_lock.reset_after, self._global_lock.lock.release ) else: - log.warning( - f"The HTTP client has encountered a per-route ratelimit. Locking down future requests for {reset_after} seconds." - ) _limiter.reset_after = reset_after await asyncio.sleep(_limiter.reset_after) continue + log.warning( + f"{LibraryException.lookup(429)} Locking down future requests for {reset_after} seconds." + ) if remaining is not None and int(remaining) == 0: log.warning( f"The HTTP client has exhausted a per-route ratelimit. Locking route for {reset_after} seconds." From 8a55c65370a106bbfcf95064e8f3b107131a3a8e Mon Sep 17 00:00:00 2001 From: Toricane Date: Sun, 16 Oct 2022 18:51:14 -0700 Subject: [PATCH 03/16] fix: attribute error --- interactions/api/http/request.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index b79bf6447..e727facd8 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -148,8 +148,9 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: ) as response: if response.content_type == "application/json": data = await response.json() + message: str = data.get("message") else: - data = None + data, message = None, None reset_after: float = float( response.headers.get( @@ -160,7 +161,6 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: _bucket: str = response.headers.get("X-RateLimit-Bucket") is_global: bool = response.headers.get("X-RateLimit-Global", False) code: int = response.status - message: str = data.get("message") log.debug(f"{route.method}: {route.__api__ + route.path}: {kwargs}") From fe7d5d37273b6c3332aeda345a4e5ac34690a069 Mon Sep 17 00:00:00 2001 From: Toricane Date: Sun, 16 Oct 2022 18:54:03 -0700 Subject: [PATCH 04/16] chore: debug --- interactions/api/http/request.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index e727facd8..bd19c38e0 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -149,8 +149,9 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: if response.content_type == "application/json": data = await response.json() message: str = data.get("message") + code: int = data.get("code") else: - data, message = None, None + data, message, code = None, None, response.status reset_after: float = float( response.headers.get( @@ -160,7 +161,6 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: remaining: str = response.headers.get("X-RateLimit-Remaining") _bucket: str = response.headers.get("X-RateLimit-Bucket") is_global: bool = response.headers.get("X-RateLimit-Global", False) - code: int = response.status log.debug(f"{route.method}: {route.__api__ + route.path}: {kwargs}") @@ -170,12 +170,16 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: if isinstance(data, dict) and ( data.get("errors") or (code and code != 429 and message) ): - log.debug(f"RETURN {code}: {dumps(data, indent=4, sort_keys=True)}") + log.debug( + f"RETURN {response.status}: {dumps(data, indent=4, sort_keys=True)}" + ) # This "redundant" debug line is for debug use and tracing back the error codes. raise LibraryException(message=message, code=code, severity=40, data=data) elif isinstance(data, dict) and code in (0, 403) and message: - log.debug(f"RETURN {code}: {dumps(data, indent=4, sort_keys=True)}") + log.debug( + f"RETURN {response.status}: {dumps(data, indent=4, sort_keys=True)}" + ) # This "redundant" debug line is for debug use and tracing back the error codes. raise LibraryException( From fef3209f2a5f481db4412d3149a84228b0d30648 Mon Sep 17 00:00:00 2001 From: Toricane Date: Sun, 16 Oct 2022 18:55:47 -0700 Subject: [PATCH 05/16] chore: debug --- interactions/api/http/request.py | 1 + 1 file changed, 1 insertion(+) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index bd19c38e0..a0331bfa1 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -146,6 +146,7 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: async with self._session.request( route.method, route.__api__ + route.path, **kwargs ) as response: + breakpoint() if response.content_type == "application/json": data = await response.json() message: str = data.get("message") From 24405f40b9fae33529aa6360333832d8d671971d Mon Sep 17 00:00:00 2001 From: Toricane Date: Sun, 16 Oct 2022 18:58:25 -0700 Subject: [PATCH 06/16] fix: display warning --- interactions/api/http/request.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index a0331bfa1..b123503b4 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -146,7 +146,6 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: async with self._session.request( route.method, route.__api__ + route.path, **kwargs ) as response: - breakpoint() if response.content_type == "application/json": data = await response.json() message: str = data.get("message") @@ -188,6 +187,9 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: severity=50, ) if code == 429: + log.warning( + f"{LibraryException.lookup(429)} Locking down future requests for {reset_after} seconds." + ) if is_global: self._global_lock.reset_after = reset_after self._loop.call_later( @@ -197,9 +199,6 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: _limiter.reset_after = reset_after await asyncio.sleep(_limiter.reset_after) continue - log.warning( - f"{LibraryException.lookup(429)} Locking down future requests for {reset_after} seconds." - ) if remaining is not None and int(remaining) == 0: log.warning( f"The HTTP client has exhausted a per-route ratelimit. Locking route for {reset_after} seconds." From 5a36e50e22c387c1d8e6c4c2bcfcc605f6439a34 Mon Sep 17 00:00:00 2001 From: Toricane Date: Sun, 16 Oct 2022 19:04:07 -0700 Subject: [PATCH 07/16] feat: nicer warning --- interactions/api/http/request.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index b123503b4..498787b75 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -188,7 +188,11 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: ) if code == 429: log.warning( - f"{LibraryException.lookup(429)} Locking down future requests for {reset_after} seconds." + f"(429) {LibraryException.lookup(429)} Locking down future requests for " + + f"{reset_after if reset_after < 60 else reset_after // 60} " + + f"{'seconds' if reset_after < 60 else 'minutes'}" + + f" {reset_after % 60 if reset_after > 60 else ''}" + + f"{' seconds' if reset_after > 60 else ''}." ) if is_global: self._global_lock.reset_after = reset_after From 70439c76f50ad6caca6afdf2ca0211f4c2ef0eef Mon Sep 17 00:00:00 2001 From: Toricane Date: Sun, 16 Oct 2022 19:11:20 -0700 Subject: [PATCH 08/16] feat: enhanced warning --- interactions/api/http/request.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index 498787b75..4566e2c03 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -2,6 +2,7 @@ import traceback from asyncio import AbstractEventLoop, Lock, get_event_loop, get_running_loop, new_event_loop from contextlib import suppress +from datetime import timedelta from json import dumps from logging import Logger from sys import version_info @@ -187,12 +188,14 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: severity=50, ) if code == 429: + amount = dict( + hours=reset_after // 3600, + minutes=(reset_after % 3600) // 60, + seconds=reset_after % 60, + ) log.warning( f"(429) {LibraryException.lookup(429)} Locking down future requests for " - + f"{reset_after if reset_after < 60 else reset_after // 60} " - + f"{'seconds' if reset_after < 60 else 'minutes'}" - + f" {reset_after % 60 if reset_after > 60 else ''}" - + f"{' seconds' if reset_after > 60 else ''}." + + f"{amount['hours']} hours {amount['minutes']} minutes {amount['seconds']} seconds." ) if is_global: self._global_lock.reset_after = reset_after From 3d8fbc17e9cfff62df4fc34d39608c0a31aec225 Mon Sep 17 00:00:00 2001 From: Toricane Date: Sun, 16 Oct 2022 19:12:54 -0700 Subject: [PATCH 09/16] refactor: use ints --- interactions/api/http/request.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index 4566e2c03..c2daee4ab 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -189,9 +189,9 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: ) if code == 429: amount = dict( - hours=reset_after // 3600, - minutes=(reset_after % 3600) // 60, - seconds=reset_after % 60, + hours=int(reset_after // 3600), + minutes=int((reset_after % 3600) // 60), + seconds=int(reset_after % 60), ) log.warning( f"(429) {LibraryException.lookup(429)} Locking down future requests for " From 1c4920eb318480411d32ecc798c2594eaffc86a5 Mon Sep 17 00:00:00 2001 From: Toricane Date: Sun, 16 Oct 2022 22:19:03 -0700 Subject: [PATCH 10/16] style: pre-commit --- interactions/api/http/request.py | 1 - 1 file changed, 1 deletion(-) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index c2daee4ab..c7fa7523f 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -2,7 +2,6 @@ import traceback from asyncio import AbstractEventLoop, Lock, get_event_loop, get_running_loop, new_event_loop from contextlib import suppress -from datetime import timedelta from json import dumps from logging import Logger from sys import version_info From 217dcb33dba0e61ae87d66344a65ff4ec953e3d2 Mon Sep 17 00:00:00 2001 From: Toricane Date: Sun, 16 Oct 2022 22:23:55 -0700 Subject: [PATCH 11/16] refactor: info --- interactions/api/http/request.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index c7fa7523f..bf55f5b62 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -187,14 +187,14 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: severity=50, ) if code == 429: - amount = dict( - hours=int(reset_after // 3600), - minutes=int((reset_after % 3600) // 60), - seconds=int(reset_after % 60), - ) + hours = int(reset_after // 3600) + minutes = int((reset_after % 3600) // 60) + seconds = int(reset_after % 60) log.warning( f"(429) {LibraryException.lookup(429)} Locking down future requests for " - + f"{amount['hours']} hours {amount['minutes']} minutes {amount['seconds']} seconds." + + f"{f'{hours} hours ' if hours else ''}" + + f"{f'{minutes} minutes ' if minutes else ''}" + + f"{f'{seconds} seconds ' if seconds else ''}" ) if is_global: self._global_lock.reset_after = reset_after From e2728bb622d2ea4bb504cfc6ebab6c5d6a4efbd1 Mon Sep 17 00:00:00 2001 From: Toricane Date: Sun, 16 Oct 2022 22:28:00 -0700 Subject: [PATCH 12/16] refactor: debug --- interactions/api/http/request.py | 1 + 1 file changed, 1 insertion(+) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index bf55f5b62..97ee5e03a 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -148,6 +148,7 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: ) as response: if response.content_type == "application/json": data = await response.json() + __import__("pprint").pprint(data) message: str = data.get("message") code: int = data.get("code") else: From 48d6ec7d655c67c4a998eb12e79a44f49f58b471 Mon Sep 17 00:00:00 2001 From: Toricane Date: Sun, 16 Oct 2022 22:30:11 -0700 Subject: [PATCH 13/16] fix: attribute error --- interactions/api/http/request.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index 97ee5e03a..ba0c47c2c 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -149,8 +149,9 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: if response.content_type == "application/json": data = await response.json() __import__("pprint").pprint(data) - message: str = data.get("message") - code: int = data.get("code") + if isinstance(data, dict): + message: str = data.get("message") + code: int = data.get("code") else: data, message, code = None, None, response.status From 30cc11fcab4e1fb2c80cd2981e21c127015af719 Mon Sep 17 00:00:00 2001 From: Toricane Date: Mon, 17 Oct 2022 17:38:39 -0700 Subject: [PATCH 14/16] fix: attribute error --- interactions/api/http/request.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index ba0c47c2c..62164cefd 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -151,7 +151,9 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: __import__("pprint").pprint(data) if isinstance(data, dict): message: str = data.get("message") - code: int = data.get("code") + code: int = data.get("code", response.status) + else: + message, code = None, response.status else: data, message, code = None, None, response.status From b629eeba04cc205d8aec576578ef870cd7abcc83 Mon Sep 17 00:00:00 2001 From: Toricane Date: Mon, 17 Oct 2022 17:42:45 -0700 Subject: [PATCH 15/16] refactor: remove debug print --- interactions/api/http/request.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index 62164cefd..de634c7f3 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -148,9 +148,8 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: ) as response: if response.content_type == "application/json": data = await response.json() - __import__("pprint").pprint(data) if isinstance(data, dict): - message: str = data.get("message") + message: Optional[str] = data.get("message") code: int = data.get("code", response.status) else: message, code = None, response.status From 4608ef1a6ccf290aafaa559601fae4de282a7c72 Mon Sep 17 00:00:00 2001 From: Toricane <73972068+Toricane@users.noreply.github.com> Date: Thu, 3 Nov 2022 18:21:23 -0700 Subject: [PATCH 16/16] refactor: remove 403 --- interactions/api/http/request.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interactions/api/http/request.py b/interactions/api/http/request.py index de634c7f3..9d79c2b8a 100644 --- a/interactions/api/http/request.py +++ b/interactions/api/http/request.py @@ -179,7 +179,7 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]: # This "redundant" debug line is for debug use and tracing back the error codes. raise LibraryException(message=message, code=code, severity=40, data=data) - elif isinstance(data, dict) and code in (0, 403) and message: + elif isinstance(data, dict) and code == 0 and message: log.debug( f"RETURN {response.status}: {dumps(data, indent=4, sort_keys=True)}" )