1
1
const camelCaseKeys = require ( 'camelcase-keys' ) ;
2
2
const fs = require ( 'fs' ) ;
3
- const skills = require ( './skills' ) ;
3
+ const skills = require ( './skills.json ' ) ;
4
4
const snakeCaseKeys = require ( 'snakecase-keys' ) ;
5
+ const { experienceToLevel } = require ( './skills' ) ;
5
6
6
7
const CREATE_TABLES = fs
7
8
. readFileSync ( `${ __dirname } /../rsc-data-server.sql` )
@@ -46,6 +47,8 @@ const GET_PLAYER_ATTRIBUTES = SET_PLAYER_ATTRIBUTES.concat(
46
47
'login_ip'
47
48
) ;
48
49
50
+ SET_PLAYER_ATTRIBUTES . push ( 'total_level' ) ;
51
+
49
52
const PLAYER_JSON_FIELDS = [
50
53
'friends' ,
51
54
'ignores' ,
@@ -55,6 +58,9 @@ const PLAYER_JSON_FIELDS = [
55
58
'cache'
56
59
] ;
57
60
61
+ const TOTAL_EXP = `(\`exp_${ skills . join ( '` + `exp_' ) } \`) AS \`experience\`` ;
62
+ const RANKS_PER_PAGE = 8 ;
63
+
58
64
class QueryHandler {
59
65
constructor ( database ) {
60
66
this . database = database ;
@@ -115,7 +121,15 @@ class QueryHandler {
115
121
dropRankTable : 'DROP TABLE IF EXISTS `hiscore_ranks`' ,
116
122
createRankTable :
117
123
'CREATE TEMPORARY TABLE `hiscore_ranks` ' +
118
- '(`player_id` integer, `experience` integer)'
124
+ '(`player_id` integer, `experience` integer)' ,
125
+ getTotalHiscoreRanks :
126
+ 'SELECT `username`, `rank_total` as `rank`, `total_level` AS ' +
127
+ `\`level\`, ${ TOTAL_EXP } FROM \`players\` ORDER BY ` +
128
+ `\`rank_total\` ASC LIMIT ${ RANKS_PER_PAGE } OFFSET ?` ,
129
+ getTotalHiscoreRanksBetween :
130
+ 'SELECT `username`, `rank_total` as `rank`, `total_level` AS ' +
131
+ `\`level\`, ${ TOTAL_EXP } FROM \`players\` WHERE ` +
132
+ '`rank_total` BETWEEN ? AND ? ORDER BY `rank_total` ASC'
119
133
} ;
120
134
121
135
for ( const statementName of Object . keys ( this . statements ) ) {
@@ -130,14 +144,14 @@ class QueryHandler {
130
144
131
145
this . database . exec (
132
146
'INSERT INTO `hiscore_ranks` SELECT `id` AS `player_id`, ' +
133
- `(\`exp_ ${ skills . join ( '` + `exp_' ) } \`) AS \`experience\` ` +
134
- 'FROM `players` ORDER BY `experience` DESC'
147
+ `${ TOTAL_EXP } FROM \`players\` ORDER BY ` +
148
+ '`experience` DESC'
135
149
) ;
136
150
137
151
this . database . exec (
138
152
'UPDATE `players` SET `rank_total` = (SELECT ROWID FROM ' +
139
153
'`hiscore_ranks` WHERE `hiscore_ranks`.`player_id` = ' +
140
- '`players`.`id`); '
154
+ '`players`.`id`)'
141
155
) ;
142
156
} ) ;
143
157
@@ -276,9 +290,13 @@ class QueryHandler {
276
290
}
277
291
278
292
updatePlayer ( player ) {
293
+ player . totalLevel = 0 ;
294
+
279
295
for ( const skill of skills ) {
296
+ const experience = player . skills [ skill ] . experience ;
280
297
player [ `cur_${ skill } ` ] = player . skills [ skill ] . current ;
281
- player [ `exp_${ skill } ` ] = player . skills [ skill ] . experience ;
298
+ player [ `exp_${ skill } ` ] = experience ;
299
+ player . totalLevel += experienceToLevel ( experience ) ;
282
300
}
283
301
284
302
delete player . skills ;
@@ -287,9 +305,7 @@ class QueryHandler {
287
305
player [ field ] = JSON . stringify ( player [ field ] ) ;
288
306
}
289
307
290
- player = snakeCaseKeys ( player ) ;
291
-
292
- this . statements . updatePlayer . run ( player ) ;
308
+ this . statements . updatePlayer . run ( snakeCaseKeys ( player ) ) ;
293
309
}
294
310
295
311
insertWorld ( world ) {
@@ -300,7 +316,7 @@ class QueryHandler {
300
316
301
317
getWorlds ( ) {
302
318
return camelCaseKeys ( this . statements . getWorlds . all ( ) ) . map ( ( world ) => {
303
- world . members = + world . members ;
319
+ world . members = ! ! world . members ;
304
320
return world ;
305
321
} ) ;
306
322
}
@@ -313,6 +329,26 @@ class QueryHandler {
313
329
}
314
330
}
315
331
332
+ getHiscoreRanks ( skill = 'overall' , rank = - 1 , page = 0 ) {
333
+ let ranks ;
334
+
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
+ ) ;
344
+ }
345
+
346
+ return ranks . map ( ( entry ) => {
347
+ entry . experience = Math . floor ( entry . experience / 4 ) ;
348
+ return entry ;
349
+ } ) ;
350
+ }
351
+
316
352
sync ( ) {
317
353
this . database . pragma ( 'journal_mode = WAL' ) ;
318
354
this . createTables ( ) ;
0 commit comments