@@ -146,10 +146,20 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]:
146146 async with self ._session .request (
147147 route .method , route .__api__ + route .path , ** kwargs
148148 ) as response :
149+ if response .content_type == "application/json" :
150+ data = await response .json ()
151+ if isinstance (data , dict ):
152+ message : Optional [str ] = data .get ("message" )
153+ code : int = data .get ("code" , response .status )
154+ else :
155+ message , code = None , response .status
156+ else :
157+ data , message , code = None , None , response .status
149158
150- data = await response .json (content_type = None )
151159 reset_after : float = float (
152- response .headers .get ("X-RateLimit-Reset-After" , "0.0" )
160+ response .headers .get (
161+ "X-RateLimit-Reset-After" , response .headers .get ("Retry-After" , "0.0" )
162+ )
153163 )
154164 remaining : str = response .headers .get ("X-RateLimit-Remaining" )
155165 _bucket : str = response .headers .get ("X-RateLimit-Bucket" )
@@ -161,40 +171,40 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]:
161171 self .buckets [route .endpoint ] = _bucket
162172 # real-time replacement/update/add if needed.
163173 if isinstance (data , dict ) and (
164- data .get ("errors" )
165- or ((code := data .get ("code" )) and code != 429 and data .get ("message" ))
174+ data .get ("errors" ) or (code and code != 429 and message )
166175 ):
167176 log .debug (
168177 f"RETURN { response .status } : { dumps (data , indent = 4 , sort_keys = True )} "
169178 )
170179 # This "redundant" debug line is for debug use and tracing back the error codes.
171180
172- raise LibraryException (
173- message = data ["message" ], code = data ["code" ], severity = 40 , data = data
174- )
175- elif isinstance (data , dict ) and data .get ("code" ) == 0 and data .get ("message" ):
181+ raise LibraryException (message = message , code = code , severity = 40 , data = data )
182+ elif isinstance (data , dict ) and code == 0 and message :
176183 log .debug (
177184 f"RETURN { response .status } : { dumps (data , indent = 4 , sort_keys = True )} "
178185 )
179186 # This "redundant" debug line is for debug use and tracing back the error codes.
180187
181188 raise LibraryException (
182- message = f"'{ data [ ' message' ] } '. Make sure that your token is set properly." ,
189+ message = f"'{ message } '. Make sure that your token is set properly." ,
183190 severity = 50 ,
184191 )
185- if response .status == 429 :
192+ if code == 429 :
193+ hours = int (reset_after // 3600 )
194+ minutes = int ((reset_after % 3600 ) // 60 )
195+ seconds = int (reset_after % 60 )
196+ log .warning (
197+ f"(429) { LibraryException .lookup (429 )} Locking down future requests for "
198+ + f"{ f'{ hours } hours ' if hours else '' } "
199+ + f"{ f'{ minutes } minutes ' if minutes else '' } "
200+ + f"{ f'{ seconds } seconds ' if seconds else '' } "
201+ )
186202 if is_global :
187- log .warning (
188- f"The HTTP client has encountered a global ratelimit. Locking down future requests for { reset_after } seconds."
189- )
190203 self ._global_lock .reset_after = reset_after
191204 self ._loop .call_later (
192205 self ._global_lock .reset_after , self ._global_lock .lock .release
193206 )
194207 else :
195- log .warning (
196- f"The HTTP client has encountered a per-route ratelimit. Locking down future requests for { reset_after } seconds."
197- )
198208 _limiter .reset_after = reset_after
199209 await asyncio .sleep (_limiter .reset_after )
200210 continue
0 commit comments