33"""
44from typing import List , Optional
55
6- from xbox .webapi .api .provider .baseprovider import BaseProvider
6+ from xbox .webapi .api .provider .ratelimitedprovider import RateLimitedProvider
77from 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