@@ -41,6 +41,12 @@ class PlayerStats(BaseModel):
4141 activities : list [Activity ]
4242
4343
44+ class HighscoreRank (BaseModel ):
45+ name : str
46+ score : int
47+ rank : int
48+
49+
4450class Hiscore :
4551 BASE_URL = "https://secure.runescape.com"
4652
@@ -108,3 +114,44 @@ async def get(
108114 return PlayerStats (** data ), total_time
109115
110116 return PlayerStats (** data )
117+
118+ async def get_rank (
119+ self ,
120+ mode : Mode ,
121+ table : int ,
122+ category : int ,
123+ top_rank : int ,
124+ size : int ,
125+ session : ClientSession | None = None ,
126+ ) -> list [HighscoreRank ]:
127+ logger .debug ("Performing hiscores lookup on " )
128+ url = f"{ self .BASE_URL } /m={ mode .value } /ranking.json"
129+ params = {
130+ "table" : table ,
131+ "category" : category ,
132+ "toprank" : top_rank ,
133+ "size" : size ,
134+ }
135+
136+ _session = ClientSession () if session is None else session
137+
138+ async with _session .get (url , proxy = self .proxy , params = params ) as response :
139+ if response .history and any (r .status == 302 for r in response .history ):
140+ error_msg = (
141+ f"Redirection occured: { response .url } - { response .history [0 ].url } "
142+ )
143+ raise UnexpectedRedirection (error_msg )
144+ elif response .status != 200 :
145+ response .raise_for_status ()
146+ raise Undefined ()
147+ data = await response .json ()
148+ if session is None :
149+ await _session .close ()
150+ return [
151+ HighscoreRank (
152+ name = d ["name" ],
153+ score = int (d ["score" ].replace ("," , "" )),
154+ rank = int (d ["rank" ].replace ("," , "" )),
155+ )
156+ for d in data
157+ ]
0 commit comments