Skip to content

Commit 01c8dbe

Browse files
committed
(UserStatsProvider): Add rate limits
1 parent 683055e commit 01c8dbe

1 file changed

Lines changed: 26 additions & 6 deletions

File tree

xbox/webapi/api/provider/userstats/__init__.py

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,24 @@
33
"""
44
from typing import List, Optional
55

6-
from xbox.webapi.api.provider.baseprovider import BaseProvider
6+
from xbox.webapi.api.provider.ratelimitedprovider import RateLimitedProvider
77
from xbox.webapi.api.provider.userstats.models import (
88
GeneralStatsField,
99
UserStatsResponse,
1010
)
1111

1212

13-
class UserStatsProvider(BaseProvider):
13+
class UserStatsProvider(RateLimitedProvider):
1414
USERSTATS_URL = "https://userstats.xboxlive.com"
1515
HEADERS_USERSTATS = {"x-xbl-contract-version": "2"}
1616
HEADERS_USERSTATS_WITH_METADATA = {"x-xbl-contract-version": "3"}
1717
SEPERATOR = ","
1818

19+
# NOTE: Stats Read (userstats.xboxlive.com) and Stats Write (statswrite.xboxlive.com)
20+
# Are mentioned as their own objects but their rate limits are the same and do not collide
21+
# (Stats Read -> read rate limit, Stats Write -> write rate limit)
22+
RATE_LIMITS = {"burst": 100, "sustain": 300}
23+
1924
async def get_stats(
2025
self,
2126
xuid: str,
@@ -40,7 +45,10 @@ async def get_stats(
4045

4146
url = f"{self.USERSTATS_URL}/users/xuid({xuid})/scids/{service_config_id}/stats/{stats}"
4247
resp = await self.client.session.get(
43-
url, headers=self.HEADERS_USERSTATS, **kwargs
48+
url,
49+
headers=self.HEADERS_USERSTATS,
50+
rate_limits=self.rate_limit_read,
51+
**kwargs,
4452
)
4553
resp.raise_for_status()
4654
return UserStatsResponse(**resp.json())
@@ -70,7 +78,11 @@ async def get_stats_with_metadata(
7078
url = f"{self.USERSTATS_URL}/users/xuid({xuid})/scids/{service_config_id}/stats/{stats}"
7179
params = {"include": "valuemetadata"}
7280
resp = await self.client.session.get(
73-
url, params=params, headers=self.HEADERS_USERSTATS_WITH_METADATA, **kwargs
81+
url,
82+
params=params,
83+
headers=self.HEADERS_USERSTATS_WITH_METADATA,
84+
rate_limits=self.rate_limit_read,
85+
**kwargs,
7486
)
7587
resp.raise_for_status()
7688
return UserStatsResponse(**resp.json())
@@ -104,7 +116,11 @@ async def get_stats_batch(
104116
"xuids": xuids,
105117
}
106118
resp = await self.client.session.post(
107-
url, json=post_data, headers=self.HEADERS_USERSTATS, **kwargs
119+
url,
120+
json=post_data,
121+
headers=self.HEADERS_USERSTATS,
122+
rate_limits=self.rate_limit_read,
123+
**kwargs,
108124
)
109125
resp.raise_for_status()
110126
return UserStatsResponse(**resp.json())
@@ -139,7 +155,11 @@ async def get_stats_batch_by_scid(
139155
"xuids": xuids,
140156
}
141157
resp = await self.client.session.post(
142-
url, json=post_data, headers=self.HEADERS_USERSTATS, **kwargs
158+
url,
159+
json=post_data,
160+
headers=self.HEADERS_USERSTATS,
161+
rate_limits=self.rate_limit_read,
162+
**kwargs,
143163
)
144164
resp.raise_for_status()
145165
return UserStatsResponse(**resp.json())

0 commit comments

Comments
 (0)