Skip to content

Commit 92dfbf4

Browse files
authored
feat: format ratelimit messages with major params (#1360)
1 parent 2d17b74 commit 92dfbf4

File tree

2 files changed

+30
-8
lines changed

2 files changed

+30
-8
lines changed

interactions/api/http/http_client.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ async def request(
403403
# resource ratelimit is reached
404404
self.log_ratelimit(
405405
self.logger.warning,
406-
f"{route.endpoint} The resource is being rate limited! "
406+
f"{route.resolved_endpoint} The resource is being rate limited! "
407407
f"Reset in {result.get('retry_after')} seconds",
408408
)
409409
# lock this resource and wait for unlock
@@ -414,15 +414,15 @@ async def request(
414414
# so long as these are infrequent we're doing well
415415
self.log_ratelimit(
416416
self.logger.warning,
417-
f"{route.endpoint} Has exceeded it's ratelimit ({lock.limit})! Reset in {lock.delta} seconds",
417+
f"{route.resolved_endpoint} Has exceeded its ratelimit ({lock.limit})! Reset in {lock.delta} seconds",
418418
)
419419
await lock.lock_for_duration(lock.delta, block=True)
420420
continue
421421
if lock.remaining == 0:
422422
# Last call available in the bucket, lock until reset
423423
self.log_ratelimit(
424424
self.logger.debug,
425-
f"{route.endpoint} Has exhausted its ratelimit ({lock.limit})! Locking route for {lock.delta} seconds",
425+
f"{route.resolved_endpoint} Has exhausted its ratelimit ({lock.limit})! Locking route for {lock.delta} seconds",
426426
)
427427
await lock.lock_for_duration(
428428
lock.delta
@@ -431,7 +431,7 @@ async def request(
431431
elif response.status in {500, 502, 504}:
432432
# Server issues, retry
433433
self.logger.warning(
434-
f"{route.endpoint} Received {response.status}... retrying in {1 + attempt * 2} seconds"
434+
f"{route.resolved_endpoint} Received {response.status}... retrying in {1 + attempt * 2} seconds"
435435
)
436436
await asyncio.sleep(1 + attempt * 2)
437437
continue
@@ -440,7 +440,7 @@ async def request(
440440
await self._raise_exception(response, route, result)
441441

442442
self.logger.debug(
443-
f"{route.endpoint} Received {response.status} :: [{lock.remaining}/{lock.limit} calls remaining]"
443+
f"{route.resolved_endpoint} Received {response.status} :: [{lock.remaining}/{lock.limit} calls remaining]"
444444
)
445445
return result
446446
except OSError as e:

interactions/api/http/route.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,36 @@ def rl_bucket(self) -> str:
5555
return f"{self.webhook_id}{self.webhook_token}:{self.channel_id}:{self.guild_id}:{self.endpoint}"
5656
return f"{self.channel_id}:{self.guild_id}:{self.endpoint}"
5757

58+
@property
59+
def major_params(self) -> dict[str, str | int]:
60+
"""The major parameters for this route"""
61+
return {
62+
"channel_id": self.channel_id,
63+
"guild_id": self.guild_id,
64+
"webhook_id": self.webhook_id,
65+
"webhook_token": self.webhook_token,
66+
}
67+
68+
@property
69+
def resolved_path(self) -> str:
70+
"""The endpoint for this route, with all parameters resolved"""
71+
return self.path.format_map({k: _uriquote(v) if isinstance(v, str) else v for k, v in self.params.items()})
72+
5873
@property
5974
def endpoint(self) -> str:
6075
"""The endpoint for this route"""
6176
return f"{self.method} {self.path}"
6277

78+
@property
79+
def resolved_endpoint(self) -> str:
80+
"""The endpoint for this route, with all major parameters resolved"""
81+
path = self.path
82+
for key, value in self.major_params.items():
83+
path = path.replace(f"{{{key}}}", str(value))
84+
85+
return f"{self.method} {path}"
86+
6387
@property
6488
def url(self) -> str:
6589
"""The full url for this route"""
66-
return f"{self.BASE}{self.path}".format_map(
67-
{k: _uriquote(v) if isinstance(v, str) else v for k, v in self.params.items()}
68-
)
90+
return f"{self.BASE}{self.resolved_path}"

0 commit comments

Comments
 (0)