osu-api-extended
Version:
Advanced osu! api wrapper for v1 and v2, with extra stuff
107 lines (106 loc) • 4.12 kB
JavaScript
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;
;