UNPKG

osu-api-extended

Version:

Advanced osu! api wrapper cover all V2 and V1 endpoints, and provide useful tools

263 lines (262 loc) 7.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.calculate_mods = exports.ModsToName = void 0; const enums_1 = require("../types/enums"); const handleErrors_1 = require("../utility/handleErrors"); // WHILE LOOP FASTER dot const bitValues = [ 'NF', 'EZ', 'TD', 'HD', 'HR', 'SD', 'DT', 'RX', 'HT', 'NC', 'FL', 'AT', 'SO', 'AP', 'PF', '4K', '5K', '6K', '7K', '8K', 'FI', 'RD', 'CN', 'TG', '9K', '10K', '1K', '3K', '2K', 'v2' ]; const ModsToName = (modsNumber, order) => { let bit = 1; if (order == true) { const convertedParts = []; while (bit <= modsNumber && bit <= (1 << 30)) { if (modsNumber & bit) { convertedParts.push(bitValues[Math.log2(bit)]); } ; bit <<= 1; if (bit == 0) break; } ; convertedParts.sort((a, b) => enums_1.ModsOrder[a.toLowerCase()] - enums_1.ModsOrder[b.toLowerCase()]); const converted = convertedParts.join('') .replace('DTNC', 'NC') .replace('SDPF', 'PF') .replace('ATCN', 'CN'); return converted; } ; let convertedParts = ''; while (bit <= modsNumber && bit <= (1 << 30)) { if (modsNumber & bit) { convertedParts += bitValues[Math.log2(bit)]; } bit <<= 1; if (bit == 0) break; } ; return convertedParts .replace('DTNC', 'NC') .replace('SDPF', 'PF') .replace('ATCN', 'CN'); }; exports.ModsToName = ModsToName; /** * Get mods short name or mods number by giving one of them * * &nbsp; * * ### Parameters * - `mods` - Number / Name / Array of { acronym: "EZ" } * - `order?` - Transform mods from DTHD to HDDT * * &nbsp; * * ### Usage Example * ```js * const { tools } = require('osu-api-extended'); * * function main() { * try { * const result = tools.calculate_mods('HDDT'); * // or * const result = tools.calculate_mods(72); * // or * const result = tools.calculate_mods([{ acronym: "EZ" }]); * if (result.error != null) { * console.log(result.error); * return; * }; * * * console.log(result); * } catch (error) { * console.log(error); * }; * }; * * main(); * ``` */ const calculate_mods = (mods, order) => { if (mods == null) { return (0, handleErrors_1.handleErrors)(new Error(`Specify mods name (HDDT or 72)`)); } ; if (mods == '') { return { number: 0, name: '' }; } ; if (typeof mods == 'number') { const name = (0, exports.ModsToName)(mods, order); return { number: mods, name: name, }; } ; let mods_id = 0; const convertedParts = []; let ModsArray = []; if (Array.isArray(mods)) { ModsArray = mods.map(r => r.acronym.toLowerCase()); } else { ModsArray = mods.toLowerCase().match(/.{1,2}/g); } ; if (!Array.isArray(ModsArray)) { return (0, handleErrors_1.handleErrors)(new Error(`Can't convert mods (${mods}) to array of mods`)); } ; // SWITCH STATEMENT CREATED ON PURPOSE BECAUSE IT'S WAY FASTER for (let i = 0; i < ModsArray.length; i++) { const mod_name = ModsArray[i]; switch (mod_name) { case 'nf': mods_id += 1; convertedParts.push('NF'); break; case 'ez': mods_id += 2; convertedParts.push('EZ'); break; case 'td': mods_id += 4; convertedParts.push('TD'); break; case 'hd': mods_id += 8; convertedParts.push('HD'); break; case 'hr': mods_id += 16; convertedParts.push('HR'); break; case 'sd': mods_id += 32; convertedParts.push('SD'); break; case 'dt': mods_id += 64; convertedParts.push('DT'); break; case 'rx': mods_id += 128; convertedParts.push('RX'); break; case 'ht': mods_id += 256; convertedParts.push('HT'); break; case 'nc': mods_id += 576; convertedParts.push('NC'); break; case 'fl': mods_id += 1024; convertedParts.push('FL'); break; case 'at': mods_id += 2048; convertedParts.push('AT'); break; case 'so': mods_id += 4096; convertedParts.push('SO'); break; case 'ap': mods_id += 8192; convertedParts.push('AP'); break; case 'pf': mods_id += 16416; convertedParts.push('PF'); break; case '4k': mods_id += 32768; convertedParts.push('4K'); break; case '5k': mods_id += 65536; convertedParts.push('5K'); break; case '6k': mods_id += 131072; convertedParts.push('6K'); break; case '7k': mods_id += 262144; convertedParts.push('7K'); break; case '8k': mods_id += 524288; convertedParts.push('8K'); break; case 'fi': mods_id += 1048576; convertedParts.push('FI'); break; case 'rd': mods_id += 2097152; convertedParts.push('RD'); break; case 'cn': mods_id += 4194304; convertedParts.push('CN'); break; case 'target': mods_id += 8388608; convertedParts.push('TG'); break; case '9k': mods_id += 16777216; convertedParts.push('9K'); break; case 'keycoop': mods_id += 33554432; convertedParts.push('10K'); break; case '1k': mods_id += 67108864; convertedParts.push('1K'); break; case '3k': mods_id += 134217728; convertedParts.push('3K'); break; case '2k': mods_id += 268435456; convertedParts.push('2K'); break; case 'scorev2': mods_id += 536870912; convertedParts.push('v2'); break; case 'mr': mods_id += 1073741824; convertedParts.push('MR'); break; default: convertedParts.push(mod_name.toUpperCase()); break; } ; } ; convertedParts.sort((a, b) => enums_1.ModsOrder[a.toLowerCase()] - enums_1.ModsOrder[b.toLowerCase()]); return { number: mods_id, name: convertedParts.join('') .replace('DTNC', 'NC') .replace('SDPF', 'PF') .replace('ATCN', 'CN'), }; }; exports.calculate_mods = calculate_mods;