1+ from typing import Any
2+
13from discord import Color , Embed , Guild , Interaction , Member , User , app_commands
2- from discord .ext .commands import Cog
4+ from discord .ext .commands import GroupCog
35from humanize import intcomma , naturalsize , naturaltime
46from odmantic import query
57
1113# ----------------------------------------------------------------------------------------------------
1214# * Leaderboard Cog
1315# ----------------------------------------------------------------------------------------------------
14- class LeaderboardCog (Cog , description = "Allows players to view their data" ):
16+ class LeaderboardCog (
17+ GroupCog , group_name = "leaderboard" , description = "Allows players to view their data"
18+ ):
1519 def __init__ (self , bot : ActBot ):
1620 self .bot = bot
1721
1822 # ----------------------------------------------------------------------------------------------------
1923
2024 @app_commands .guild_only ()
21- @app_commands .command (description = "View top members" )
22- async def leaderboard (self , interaction : Interaction ):
25+ @app_commands .command (description = "View top members sorted by level" )
26+ async def level (self , interaction : Interaction ):
27+ embed = EmbedX .info (emoji = "🏅" , title = "Level Leaderboard" )
28+ await self .show_leaderboard (
29+ interaction = interaction ,
30+ embed = embed ,
31+ sort = (
32+ query .desc (Actor .level ),
33+ query .desc (Actor .xp ),
34+ query .desc (Actor .gold ),
35+ ),
36+ )
37+
38+ @app_commands .guild_only ()
39+ @app_commands .command (description = "View top members sorted by rank" )
40+ async def rank (self , interaction : Interaction ):
41+ embed = EmbedX .info (emoji = "🏆" , title = "Rank Leaderboard" )
42+ await self .show_leaderboard (
43+ interaction = interaction ,
44+ embed = embed ,
45+ sort = (
46+ query .desc (Actor .elo ),
47+ query .desc (Actor .gold ),
48+ ),
49+ )
50+
51+ # ----------------------------------------------------------------------------------------------------
52+
53+ async def show_leaderboard (
54+ self ,
55+ interaction : Interaction ,
56+ embed : Embed ,
57+ sort : Any ,
58+ ):
2359 # Check guild
2460 guild = interaction .guild
2561 if not guild :
@@ -31,15 +67,15 @@ async def leaderboard(self, interaction: Interaction):
3167
3268 # Get top actors
3369 await interaction .response .defer ()
34- actors_members = await self .bot .get_actors_members (guild )
70+ actors_members = await self .bot .get_actors_members (guild = guild , sort = sort )
3571 if not actors_members :
3672 await interaction .followup .send (
3773 embed = EmbedX .warning (description = "No actors found." )
3874 )
3975 return
4076
4177 # Create board table
42- top_actor : Actor
78+ # top_actor: Actor
4379 names_column_text = ""
4480 stats_column_text = ""
4581 for i , (actor , member ) in enumerate (actors_members ):
@@ -55,8 +91,7 @@ async def leaderboard(self, interaction: Interaction):
5591 names_column_text += f"**# { (i + 1 )} ** ― { medal } { name } { skull } \n **`🏆{ rank } 🏅{ level } ⏫{ xp } 💰{ gold } `**\n \n "
5692 # stats_column_text += f"**`🏆{rank} 🏅{level} ⏫{xp} 💰{gold}`**\n"
5793
58- # Create embed
59- embed = EmbedX .info (emoji = "🏆" , title = "Leaderboard" )
94+ # Send embed
6095 # try:
6196 # top_member = guild.get_member(top_actor.id) or await guild.fetch_member(
6297 # top_actor.id
0 commit comments