1+ import math
12from typing import TYPE_CHECKING
23
34from disnake import ui , ButtonStyle , Embed
@@ -101,7 +102,8 @@ class LeaderboardView(ui.View):
101102 """
102103
103104 def __init__ (
104- self , controller : "LevelsController" , firstemb : Embed , author : int = 123 , set_user : bool = False , timeout : float = None
105+ self , controller : "LevelsController" , firstemb : Embed , author : int = 123 , set_user : bool = False ,
106+ timeout : float = None
105107 ):
106108
107109 self .controller = controller
@@ -114,8 +116,12 @@ def __init__(
114116 )
115117
116118 async def at_last_page (self , inter ):
117- records = await self .controller .get_count (inter .guild )
118- if records % 10 <= 0 :
119+ records = await self .controller .get_count (inter .guild .id )
120+ if records % 10 == 0 :
121+ last_page = records // 10 - 1
122+ else :
123+ last_page = records // 10
124+ if self .CurrentEmbed == last_page :
119125 return True
120126 else :
121127 return False
@@ -124,7 +130,8 @@ async def create_page(self, inter, page_num) -> Embed:
124130 if page_num == 0 :
125131 return self .firstemb
126132 else :
127- records = await self .controller .get_leaderboard (inter .guild , limit = 10 , offset = page_num * 10 )
133+ offset = page_num * 10
134+ records = await self .controller .get_leaderboard (inter .guild , limit = 10 , offset = offset )
128135 try :
129136 cmd_user = await self .controller .get_user (inter .author )
130137 except UserNotFound :
@@ -138,12 +145,14 @@ async def create_page(self, inter, page_num) -> Embed:
138145 user = await inter .bot .fetch_user (record .user_id )
139146 if record .user_id == inter .author .id :
140147 embed .add_field (
141- name = f"{ i + 1 } . { user } ~ You " , value = f"Level: { record .lvl } \n Total XP: { record .total_exp :,} " , inline = False
148+ name = f"{ i + 1 + offset } . { user } ~ You " ,
149+ value = f"Level: { record .lvl } \n Total XP: { record .total_exp :,} " , inline = False
142150 )
143151 self .user_set = True
144152 else :
145153 embed .add_field (
146- name = f"{ i + 1 } . { user } " , value = f"Level: { record .lvl } \n Total XP: { record .total_exp :,} " , inline = False
154+ name = f"{ i + 1 + offset } . { user } " , value = f"Level: { record .lvl } \n Total XP: { record .total_exp :,} " ,
155+ inline = False
147156 )
148157 if not self .user_set :
149158 rank = await self .controller .get_rank (inter .guild .id , cmd_user )
@@ -155,6 +164,7 @@ async def create_page(self, inter, page_num) -> Embed:
155164
156165 embed .set_footer (text = f"{ inter .author } " , icon_url = inter .author .avatar .url )
157166 embed .timestamp = dt .datetime .now ()
167+ return embed
158168
159169 @ui .button (emoji = "⏮️" , style = ButtonStyle .grey )
160170 async def front (self , button , inter ):
@@ -196,8 +206,7 @@ async def next(self, button, inter):
196206 return await inter .send ("you are already at the end" , ephemeral = True )
197207 await inter .response .edit_message (embed = await self .create_page (inter , self .CurrentEmbed + 1 ))
198208 self .CurrentEmbed += 1
199-
200- except :
209+ except Exception as e :
201210 await inter .send ("Unable to change the page." , ephemeral = True )
202211
203212 @ui .button (emoji = "⏭️" , style = ButtonStyle .grey )
@@ -207,11 +216,11 @@ async def end(self, button, inter):
207216 return await inter .send ("You cannot interact with these buttons." , ephemeral = True )
208217 elif await self .at_last_page (inter ):
209218 return await inter .send ("you are already at the end" , ephemeral = True )
210- get_last_page = await self .controller .get_count (inter .guild .id )
211- if get_last_page % 10 == 0 :
212- last_page = get_last_page // 10
219+ record_count = await self .controller .get_count (inter .guild .id )
220+ if record_count % 10 == 0 : # if the number of records is divisible by 10 e.g. 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 etc. then we must subtract 1 from the number of records to get the last page
221+ last_page = record_count // 10 - 1
213222 else :
214- last_page = get_last_page // 10 + 1
223+ last_page = math . floor ( record_count // 10 ) # if the number of records is not divisible by 10 e.g. 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29 etc. then we can just divide the number of records by 10 to get the last page
215224 await inter .response .edit_message (embed = await self .create_page (inter , last_page ))
216225 self .CurrentEmbed = last_page
217226
0 commit comments