99import aiohttp
1010import arrow
1111import discord
12- from discord .ext import commands
1312from pydis_core .utils import logging , paste_service
1413
1514import bot
@@ -69,6 +68,10 @@ class FetchingLeaderboardFailedError(Exception):
6968 """Raised when one or more leaderboards could not be fetched at all."""
7069
7170
71+ class UserNotInLeaderboardError (Exception ):
72+ """Raised when a user is not found in the requested leaderboard."""
73+
74+
7275def leaderboard_sorting_function (entry : tuple [str , dict ]) -> tuple [int , int ]:
7376 """
7477 Provide a sorting value for our leaderboard.
@@ -159,20 +162,29 @@ def _parse_raw_leaderboard_data(raw_leaderboard_data: dict) -> dict:
159162 return {"daily_stats" : daily_stats , "leaderboard" : sorted_leaderboard , "per_day_and_star" : per_day_star_stats }
160163
161164
162- def _format_leaderboard (leaderboard : dict [str , dict ], self_placement_name : str | None = None ) -> str :
165+ def _format_leaderboard (
166+ leaderboard : dict [str , dict ],
167+ self_placement_name : str | None = None ,
168+ * ,
169+ use_you_for_placement : bool = True ,
170+ ) -> str :
163171 """Format the leaderboard using the AOC_TABLE_TEMPLATE."""
164172 leaderboard_lines = [HEADER ]
165173 self_placement_exists = False
166174 for rank , data in enumerate (leaderboard .values (), start = 1 ):
167175 if self_placement_name and data ["name" ].lower () == self_placement_name .lower ():
176+ if use_you_for_placement :
177+ name = f"(You) { data ['name' ]} "
178+ else :
179+ name = f"(\U0001f536 ) { data ['name' ]} "
168180 leaderboard_lines .insert (
169181 1 ,
170182 AOC_TABLE_TEMPLATE .format (
171183 rank = rank ,
172- name = f"(You) { data [ ' name' ] } " ,
184+ name = name ,
173185 score = str (data ["score" ]),
174- stars = f"({ data ['star_1' ]} , { data ['star_2' ]} )"
175- )
186+ stars = f"({ data ['star_1' ]} , { data ['star_2' ]} )" ,
187+ ),
176188 )
177189 self_placement_exists = True
178190 continue
@@ -185,12 +197,7 @@ def _format_leaderboard(leaderboard: dict[str, dict], self_placement_name: str |
185197 )
186198 )
187199 if self_placement_name and not self_placement_exists :
188- raise commands .BadArgument (
189- "Sorry, your profile does not exist in this leaderboard."
190- "\n \n "
191- "To join our leaderboard, run the command `/aoc join`."
192- " If you've joined recently, please wait up to 30 minutes for our leaderboard to refresh."
193- )
200+ raise UserNotInLeaderboardError
194201 return "\n " .join (leaderboard_lines )
195202
196203
@@ -285,7 +292,12 @@ def _get_top_leaderboard(full_leaderboard: str) -> str:
285292
286293
287294@_caches .leaderboard_cache .atomic_transaction
288- async def fetch_leaderboard (invalidate_cache : bool = False , self_placement_name : str | None = None ) -> dict :
295+ async def fetch_leaderboard (
296+ invalidate_cache : bool = False ,
297+ self_placement_name : str | None = None ,
298+ * ,
299+ use_you_for_placement : bool = True ,
300+ ) -> dict :
289301 """
290302 Get the current Python Discord combined leaderboard.
291303
@@ -337,7 +349,11 @@ async def fetch_leaderboard(invalidate_cache: bool = False, self_placement_name:
337349 json .loads (cached_leaderboard ["placement_leaderboard" ])
338350 )["leaderboard" ]
339351 cached_leaderboard ["placement_leaderboard" ] = _get_top_leaderboard (
340- _format_leaderboard (formatted_placement_leaderboard , self_placement_name = self_placement_name )
352+ _format_leaderboard (
353+ formatted_placement_leaderboard ,
354+ self_placement_name = self_placement_name ,
355+ use_you_for_placement = use_you_for_placement ,
356+ )
341357 )
342358 return cached_leaderboard
343359
0 commit comments