1+ import asyncio
2+
13from discord import Color , Embed , Interaction , Member , User , app_commands
24from discord .app_commands import command , guild_only
35from discord .ext .commands import Cog
@@ -57,6 +59,12 @@ async def profile(
5759 @app_commands .guild_only ()
5860 @app_commands .command (description = "View leaderboard" )
5961 async def leaderboard (self , interaction : Interaction ):
62+ # Check guild (not needed but just for type-checking)
63+ guild = interaction .guild
64+ if not guild :
65+ return
66+
67+ # Get top actors
6068 await interaction .response .defer ()
6169 db = self .bot .get_db (interaction .guild )
6270 actors = (
@@ -77,14 +85,41 @@ async def leaderboard(self, interaction: Interaction):
7785 embed = EmbedX .info ("" , "No members found for the leaderboard." )
7886 )
7987 return
88+
89+ # Get associated members
90+ members = []
91+ for actor in actors :
92+ member = guild .get_member (actor .id ) # Try get from cache
93+ if member :
94+ members .append (member )
95+ else :
96+ members .append (None ) # placeholder to fetch later concurrently
97+
98+ # Fetch missing members concurrently
99+ members_futures = [
100+ guild .fetch_member (actor .id )
101+ for i , actor in enumerate (actors )
102+ if members [i ] is None
103+ ]
104+ try :
105+ fetched_members = await asyncio .gather (* members_futures )
106+ except Exception as e :
107+ await interaction .followup .send (
108+ embed = EmbedX .error (description = "Could not fetch members." )
109+ )
110+ return
111+
112+ # Update members list with fetched members
113+ fetched_index = 0
114+ for i , actor in enumerate (actors ):
115+ if members [i ] is None :
116+ members [i ] = fetched_members [fetched_index ]
117+ fetched_index += 1
118+
119+ # Create embed
80120 embed = Embed (title = "🏆 Leaderboard" , color = Color .blue ())
81121 for i , actor in enumerate (actors ):
82- guild = interaction .guild
83- member = (
84- (guild .get_member (actor .id ) or await guild .fetch_member (actor .id ))
85- if guild
86- else None
87- )
122+ member = members [i ]
88123 member_name = member .display_name if member else f"{ actor .display_name } (⚠)"
89124 embed .add_field (
90125 name = "" ,
0 commit comments