@@ -189,7 +189,7 @@ async def handle_message(self, message: Message):
189189 ]
190190 ):
191191 return
192- if not random .randrange (1 , 3 ) == 1 :
192+ if not random .randint (1 , 3 ) == 1 :
193193 return
194194 elif await self .on_cooldown (message ):
195195 return
@@ -285,17 +285,27 @@ async def send_levelup(message: Message, level: int):
285285 """
286286 await message .channel .send (msg )
287287
288- async def get_rank (self , user_record ) -> int :
289- sql = "SELECT * FROM levels WHERE level >= ? ORDER BY level DESC"
290- records_raw = await self .db .execute (sql , (user_record .lvl ,))
291- records = await records_raw .fetchall ()
292- user_records = sorted ([User (* record ) for record in records ], key = lambda x : x .total_exp , reverse = True )
293- rank = 1
294- for record in user_records :
295- if record .user_id == user_record .user_id :
296- return rank
297- rank += 1
298- raise UserNotFound
288+ async def get_rank (self , guild_id , user_record ) -> int :
289+ """
290+ what to do
291+ #1. eliminate all the users that have a lower level than the user
292+ #2. sort the users by xp
293+ #3. get the index of the user
294+ #4. add 1 to the index
295+ """
296+ records = await self .db .execute (
297+ "SELECT * FROM levels WHERE guild_id = ? AND level >= ? ORDER BY xp DESC" ,
298+ (
299+ guild_id ,
300+ user_record .lvl ,
301+ ),
302+ )
303+ records = await records .fetchall ()
304+ if records is None :
305+ raise UserNotFound
306+ records = [User (* record ) for record in records ]
307+ records = sorted (records , key = lambda x : x .xp , reverse = True )
308+ return records .index (user_record ) + 1
299309
300310
301311class Level (commands .Cog ):
@@ -349,8 +359,10 @@ async def on_message(self, message):
349359
350360 @commands .Cog .listener ()
351361 async def on_ready (self ):
352- self .controller = LevelsController (self .bot , self .bot .db )
353- print ("[Level] Ready" )
362+ if self .controller is None :
363+ self .controller = LevelsController (self .bot , self .bot .db )
364+ if not self .bot .ready_ :
365+ print ("[Levels] Ready" )
354366
355367 @commands .slash_command ()
356368 @commands .guild_only ()
@@ -366,10 +378,10 @@ async def rank(self, inter: ApplicationCommandInteraction, user: Optional[Member
366378 try :
367379 user_record = await self .controller .get_user (user )
368380 if not user_record :
369- print ("[Level ] User not found" )
381+ print ("[Levels ] User not found" )
370382 await self .controller .add_user (user , inter .guild )
371383 return await self .rank (inter , user )
372- rank = await self .controller .get_rank (user_record )
384+ rank = await self .controller .get_rank (inter . guild . id , user_record )
373385 image = await self .controller .generate_image_card (user , rank , user_record .xp , user_record .lvl )
374386 await inter .send (file = image )
375387 except UserNotFound :
0 commit comments