@@ -111,14 +111,60 @@ class QueryHandler {
111
111
'`tcp_port`, `websocket_port`, `country`, `members`) ' +
112
112
'VALUES(:id, :ip, :tcp_port, :websocket_port, :country, ' +
113
113
':members)' ,
114
- getWorlds : 'SELECT * FROM `worlds`'
114
+ getWorlds : 'SELECT * FROM `worlds`' ,
115
+ dropRankTable : 'DROP TABLE IF EXISTS `hiscore_ranks`' ,
116
+ createRankTable :
117
+ 'CREATE TEMPORARY TABLE `hiscore_ranks` ' +
118
+ '(`player_id` integer, `experience` integer)'
115
119
} ;
116
120
117
121
for ( const statementName of Object . keys ( this . statements ) ) {
118
122
this . statements [ statementName ] = this . database . prepare (
119
123
this . statements [ statementName ]
120
124
) ;
121
125
}
126
+
127
+ this . updateTotalHiscoreRanks = this . database . transaction ( ( ) => {
128
+ this . statements . dropRankTable . run ( ) ;
129
+ this . statements . createRankTable . run ( ) ;
130
+
131
+ this . database . exec (
132
+ 'INSERT INTO `hiscore_ranks` SELECT `id` AS `player_id`, ' +
133
+ `(\`exp_${ skills . join ( '` + `exp_' ) } \`) AS \`experience\` ` +
134
+ 'FROM `players` ORDER BY `experience` DESC'
135
+ ) ;
136
+
137
+ this . database . exec (
138
+ 'UPDATE `players` SET `rank_total` = (SELECT ROWID FROM ' +
139
+ '`hiscore_ranks` WHERE `hiscore_ranks`.`player_id` = ' +
140
+ '`players`.`id`);'
141
+ ) ;
142
+ } ) ;
143
+
144
+ this . updateSkillHiscoreRanks = { } ;
145
+
146
+ for ( const skill of skills ) {
147
+ this . updateSkillHiscoreRanks [ skill ] = this . database . transaction (
148
+ ( ) => {
149
+ this . statements . dropRankTable . run ( ) ;
150
+ this . statements . createRankTable . run ( ) ;
151
+
152
+ this . database . exec (
153
+ 'INSERT INTO `hiscore_ranks` SELECT `id` AS ' +
154
+ `\`player_id\`, \`exp_${ skill } \` AS ` +
155
+ '`experience` FROM `players` ORDER BY ' +
156
+ '`experience` DESC'
157
+ ) ;
158
+
159
+ this . database . exec (
160
+ `UPDATE \`players\` SET \`rank_${ skill } \` = ` +
161
+ '(SELECT ROWID FROM `hiscore_ranks` WHERE ' +
162
+ '`hiscore_ranks`.`player_id` = ' +
163
+ '`players`.`id`);'
164
+ ) ;
165
+ }
166
+ ) ;
167
+ }
122
168
}
123
169
124
170
createTables ( ) {
@@ -139,7 +185,7 @@ class QueryHandler {
139
185
}
140
186
141
187
getPlayerCount ( ) {
142
- return this . statements . getPlayerCount . get ( ) . count ;
188
+ return this . statements . getPlayerCount . pluck ( ) . get ( ) ;
143
189
}
144
190
145
191
insertPlayer ( { username, password, ip } ) {
@@ -259,13 +305,16 @@ class QueryHandler {
259
305
} ) ;
260
306
}
261
307
262
- updateHiscoreTotal ( ) { }
263
-
264
308
updateHiscoreRanks ( ) {
265
- this . updateHiscoreTotal ( ) ;
309
+ this . updateTotalHiscoreRanks ( ) ;
310
+
311
+ for ( const skill of skills ) {
312
+ this . updateSkillHiscoreRanks [ skill ] ( ) ;
313
+ }
266
314
}
267
315
268
316
sync ( ) {
317
+ this . database . pragma ( 'journal_mode = WAL' ) ;
269
318
this . createTables ( ) ;
270
319
this . init ( ) ;
271
320
0 commit comments