Skip to content

Commit f2881cf

Browse files
committed
total hiscore retrival
1 parent d55cf5b commit f2881cf

File tree

5 files changed

+87
-10
lines changed

5 files changed

+87
-10
lines changed

src/handlers/hiscores.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
async function getHiscoreRanks({
2+
token,
3+
skill = 'overall',
4+
rank = -1,
5+
page = 0
6+
}) {
7+
const queryHandler = this.server.queryHandler;
8+
const ranks = queryHandler.getHiscoreRanks(skill, rank, page);
9+
this.socket.sendMessage({ token, ranks });
10+
}
11+
12+
module.exports = { getHiscoreRanks };

src/handlers/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const handlers = [
22
require('./authenticate'),
3+
require('./hiscores'),
34
require('./player'),
45
require('./world')
56
];

src/handlers/player.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,8 @@ async function playerRegister({ token, username, password, ip }) {
212212
return this.socket.sendMessage(message);
213213
}
214214

215+
username = username.replace('_', '').trim().toLowerCase();
216+
215217
if (queryHandler.usernameExists(username)) {
216218
message.code = 3;
217219
message.success = false;

src/query-handler.js

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
const camelCaseKeys = require('camelcase-keys');
22
const fs = require('fs');
3-
const skills = require('./skills');
3+
const skills = require('./skills.json');
44
const snakeCaseKeys = require('snakecase-keys');
5+
const { experienceToLevel } = require('./skills');
56

67
const CREATE_TABLES = fs
78
.readFileSync(`${__dirname}/../rsc-data-server.sql`)
@@ -46,6 +47,8 @@ const GET_PLAYER_ATTRIBUTES = SET_PLAYER_ATTRIBUTES.concat(
4647
'login_ip'
4748
);
4849

50+
SET_PLAYER_ATTRIBUTES.push('total_level');
51+
4952
const PLAYER_JSON_FIELDS = [
5053
'friends',
5154
'ignores',
@@ -55,6 +58,9 @@ const PLAYER_JSON_FIELDS = [
5558
'cache'
5659
];
5760

61+
const TOTAL_EXP = `(\`exp_${skills.join('` + `exp_')}\`) AS \`experience\``;
62+
const RANKS_PER_PAGE = 8;
63+
5864
class QueryHandler {
5965
constructor(database) {
6066
this.database = database;
@@ -115,7 +121,15 @@ class QueryHandler {
115121
dropRankTable: 'DROP TABLE IF EXISTS `hiscore_ranks`',
116122
createRankTable:
117123
'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'
119133
};
120134

121135
for (const statementName of Object.keys(this.statements)) {
@@ -130,14 +144,14 @@ class QueryHandler {
130144

131145
this.database.exec(
132146
'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'
135149
);
136150

137151
this.database.exec(
138152
'UPDATE `players` SET `rank_total` = (SELECT ROWID FROM ' +
139153
'`hiscore_ranks` WHERE `hiscore_ranks`.`player_id` = ' +
140-
'`players`.`id`);'
154+
'`players`.`id`)'
141155
);
142156
});
143157

@@ -276,9 +290,13 @@ class QueryHandler {
276290
}
277291

278292
updatePlayer(player) {
293+
player.totalLevel = 0;
294+
279295
for (const skill of skills) {
296+
const experience = player.skills[skill].experience;
280297
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);
282300
}
283301

284302
delete player.skills;
@@ -287,9 +305,7 @@ class QueryHandler {
287305
player[field] = JSON.stringify(player[field]);
288306
}
289307

290-
player = snakeCaseKeys(player);
291-
292-
this.statements.updatePlayer.run(player);
308+
this.statements.updatePlayer.run(snakeCaseKeys(player));
293309
}
294310

295311
insertWorld(world) {
@@ -300,7 +316,7 @@ class QueryHandler {
300316

301317
getWorlds() {
302318
return camelCaseKeys(this.statements.getWorlds.all()).map((world) => {
303-
world.members = +world.members;
319+
world.members = !!world.members;
304320
return world;
305321
});
306322
}
@@ -313,6 +329,26 @@ class QueryHandler {
313329
}
314330
}
315331

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+
316352
sync() {
317353
this.database.pragma('journal_mode = WAL');
318354
this.createTables();

src/skills.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const EXPERIENCE_ARRAY = [0];
2+
3+
let totalExperience = 0;
4+
5+
for (let i = 1; i < 99; i++) {
6+
const level = i;
7+
const experience = Math.floor(level + 300 * Math.pow(2, level / 7));
8+
totalExperience += experience;
9+
EXPERIENCE_ARRAY[i] = totalExperience & 0xffffffc;
10+
}
11+
12+
function experienceToLevel(experience) {
13+
let level = 1;
14+
15+
for (let i = 0; i < EXPERIENCE_ARRAY.length; i += 1) {
16+
if (EXPERIENCE_ARRAY[i] > experience) {
17+
return level;
18+
}
19+
20+
level = i + 1;
21+
}
22+
23+
return level;
24+
}
25+
26+
module.exports = { experienceToLevel };

0 commit comments

Comments
 (0)