UNPKG

osu-api-extended

Version:

Advanced osu! api wrapper for v1 and v2, with extra stuff

107 lines (106 loc) 4.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.calculate_rank = void 0; const enums_1 = require("../types/enums"); const handleErrors_1 = require("../utility/handleErrors"); const accuracy_1 = require("./accuracy"); const mods_1 = require("./mods"); const calculate_rank = (hits, mods = 0, mode) => { if (Object.keys(hits).length == 0) { return (0, handleErrors_1.handleErrors)('Provide hits (300, 100, 50, etc)'); } ; const { name: modsName } = (0, mods_1.calculate_mods)(mods); ; const { accuracy } = (0, accuracy_1.calculate_accuracy)(hits, mode); const geki = parseInt((hits === null || hits === void 0 ? void 0 : hits.geki) || hits.perfect || '0'); const h300 = parseInt((hits === null || hits === void 0 ? void 0 : hits[300]) || hits.great || '0'); const katu = parseInt((hits === null || hits === void 0 ? void 0 : hits.katu) || hits.good || '0'); const h100 = parseInt((hits === null || hits === void 0 ? void 0 : hits[100]) || hits.ok || '0'); const h50 = parseInt((hits === null || hits === void 0 ? void 0 : hits[50]) || hits.meh || '0'); const h0 = parseInt((hits === null || hits === void 0 ? void 0 : hits[0]) || hits.miss || '0'); const is_silver = /hd|fl/i.test(modsName); let total = 0; let r300 = 0; let r50 = 0; let rank = ''; switch (mode) { case 'osu': case enums_1.GamemodeEnum.osu: total = +h300 + +h100 + +h50 + +h0; r300 = +h300 / total; r50 = +h50 / total; if (r300 === 1) rank = is_silver ? 'XH' : 'X'; else if (r300 > 0.9 && r50 < 0.01 && h0 === 0) rank = is_silver ? 'SH' : 'S'; else if ((r300 > 0.8 && h0 === 0) || r300 > 0.9) rank = 'A'; else if ((r300 > 0.7 && h0 === 0) || r300 > 0.8) rank = 'B'; else if (r300 > 0.6) rank = 'C'; else rank = 'D'; break; case 'taiko': case enums_1.GamemodeEnum.taiko: total = +h300 + +h100 + +h50 + +h0; r300 = +h300 / total; r50 = +h50 / total; if (r300 === 1) rank = is_silver ? 'XH' : 'X'; else if (r300 > 0.9 && r50 < 0.01 && h0 === 0) rank = is_silver ? 'SH' : 'S'; else if ((r300 > 0.8 && h0 === 0) || r300 > 0.9) rank = 'A'; else if ((r300 > 0.7 && h0 === 0) || r300 > 0.8) rank = 'B'; else if (r300 > 0.6) rank = 'C'; else rank = 'D'; break; case 'fruits': case enums_1.GamemodeEnum.fruits: total = +h300 + +h100 + +h50 + +h0 + +katu; r300 = +h300 / total; r50 = +h50 / total; if (accuracy === 1) rank = is_silver ? 'XH' : 'X'; else if (accuracy > 0.98) rank = is_silver ? 'SH' : 'S'; else if (accuracy > 0.94) rank = 'A'; else if (accuracy > 0.9) rank = 'B'; else if (accuracy > 0.85) rank = 'C'; else rank = 'D'; break; case 'mania': case enums_1.GamemodeEnum.mania: total = +h300 + +h100 + +h50 + +h0 + +geki + +katu; r300 = +h300 / total; r50 = +h50 / total; if (accuracy === 1) rank = is_silver ? 'XH' : 'X'; else if (accuracy > 0.95) rank = is_silver ? 'SH' : 'S'; else if (accuracy > 0.9) rank = 'A'; else if (accuracy > 0.8) rank = 'B'; else if (accuracy > 0.7) rank = 'C'; else rank = 'D'; break; } ; return { rank, }; }; exports.calculate_rank = calculate_rank;