@@ -132,10 +132,8 @@ class QueryHandler {
132
132
'`rank_total` BETWEEN ? AND ? ORDER BY `rank_total` ASC'
133
133
} ;
134
134
135
- for ( const statementName of Object . keys ( this . statements ) ) {
136
- this . statements [ statementName ] = this . database . prepare (
137
- this . statements [ statementName ]
138
- ) ;
135
+ for ( const [ name , statement ] of Object . entries ( this . statements ) ) {
136
+ this . statements [ name ] = this . database . prepare ( statement ) ;
139
137
}
140
138
141
139
this . updateTotalHiscoreRanks = this . database . transaction ( ( ) => {
@@ -155,9 +153,26 @@ class QueryHandler {
155
153
) ;
156
154
} ) ;
157
155
156
+ this . statements . getSkillHiscoreRanks = { } ;
157
+ this . statements . getSkillHiscoreRanksBetween = { } ;
158
158
this . updateSkillHiscoreRanks = { } ;
159
159
160
160
for ( const skill of skills ) {
161
+ this . statements . getSkillHiscoreRanks [ skill ] = this . database . prepare (
162
+ `SELECT \`username\`, \`rank_${ skill } \` as \`rank\`, ` +
163
+ `\`exp_${ skill } \` AS \`experience\` FROM \`players\` ` +
164
+ `ORDER BY \`rank_${ skill } \` ASC LIMIT ${ RANKS_PER_PAGE } ` +
165
+ 'OFFSET ?'
166
+ ) ;
167
+
168
+ this . statements . getSkillHiscoreRanksBetween [
169
+ skill
170
+ ] = this . database . prepare (
171
+ `SELECT \`username\`, \`rank_${ skill } \` as \`rank\`, ` +
172
+ `\`exp_${ skill } \` AS \`experience\` FROM \`players\` WHERE ` +
173
+ `\`rank_${ skill } \` BETWEEN ? AND ? ORDER BY \`rank_total\` ASC`
174
+ ) ;
175
+
161
176
this . updateSkillHiscoreRanks [ skill ] = this . database . transaction (
162
177
( ) => {
163
178
this . statements . dropRankTable . run ( ) ;
@@ -332,18 +347,42 @@ class QueryHandler {
332
347
getHiscoreRanks ( skill = 'overall' , rank = - 1 , page = 0 ) {
333
348
let ranks ;
334
349
335
- if ( skill === 'overall' && rank === - 1 ) {
336
- ranks = this . statements . getTotalHiscoreRanks . all (
337
- page * RANKS_PER_PAGE
338
- ) ;
339
- } else if ( skill === 'overall' && rank > - 1 ) {
340
- ranks = this . statements . getTotalHiscoreRanksBetween . all (
341
- rank - RANKS_PER_PAGE / 2 ,
342
- rank + RANKS_PER_PAGE / 2
343
- ) ;
350
+ if ( rank > - 1 ) {
351
+ rank = rank < 1 ? 1 : rank ;
352
+
353
+ const min = Math . max ( 1 , rank - RANKS_PER_PAGE / 2 ) ;
354
+ let max = rank + RANKS_PER_PAGE / 2 ;
355
+
356
+ if ( rank < RANKS_PER_PAGE / 2 ) {
357
+ max += RANKS_PER_PAGE / 2 - min ;
358
+ }
359
+
360
+ if ( skill === 'overall' ) {
361
+ ranks = this . statements . getTotalHiscoreRanksBetween . all (
362
+ min ,
363
+ max
364
+ ) ;
365
+ } else {
366
+ ranks = this . statements . getSkillHiscoreRanksBetween [ skill ] . all (
367
+ min ,
368
+ max
369
+ ) ;
370
+ }
371
+ } else {
372
+ const offset = page * RANKS_PER_PAGE ;
373
+
374
+ if ( skill === 'overall' ) {
375
+ ranks = this . statements . getTotalHiscoreRanks . all ( offset ) ;
376
+ } else {
377
+ this . statements . getSkillHiscoreRanks [ skill ] . all ( offset ) ;
378
+ }
344
379
}
345
380
346
381
return ranks . map ( ( entry ) => {
382
+ if ( ! entry . level ) {
383
+ entry . level = experienceToLevel ( entry . experience ) ;
384
+ }
385
+
347
386
entry . experience = Math . floor ( entry . experience / 4 ) ;
348
387
return entry ;
349
388
} ) ;
0 commit comments