UNPKG

poi-plugin-senka-calc

Version:
115 lines (85 loc) 3.24 kB
"use strict"; exports.__esModule = true; exports.magicManager = exports.MAGIC_R_NUMS = exports.MAGIC_L_NUMS = void 0; var _events = _interopRequireDefault(require("events")); var _lodash = require("lodash"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const MAGIC_R_NUMS = [8931, 1201, 1156, 5061, 4569, 4732, 3779, 4568, 5695, 4619, 4912, 5669, 6586]; //export const MAGIC_L_NUMS = [ 25, 92, 79, 52, 58, 36, 93, 92, 58, 82 ] // 2017.2.28-2017.3.17 //export const MAGIC_L_NUMS = [ 63, 30, 70, 83, 95, 52, 45, 88, 92, 83 ] // 2017.3.17-2017.4.6 //export const MAGIC_L_NUMS = [26,79,33,71,95,75,40,54,37,78] // 2017.4.6-2017.5.2 exports.MAGIC_R_NUMS = MAGIC_R_NUMS; const MAGIC_L_NUMS = [36, 31, 33, 97, 64, 54, 52, 78, 40, 85]; // 2017.5.2-2017.5.22 exports.MAGIC_L_NUMS = MAGIC_L_NUMS; const unsafeBinaryGcd = (m, n) => n === 0 ? m : unsafeBinaryGcd(n, m % n); /* gcd(a1,a2,a3,...) returns: - NaN if the argument list is empty - NaN if any of the arguments is not an integer - otherwise the greatest common divisor of a1,a2,a3... */ const gcd = (...args) => args.length === 0 ? NaN : args.every(_lodash.isInteger) ? args.reduce(unsafeBinaryGcd) : NaN; class MagicManager extends _events.default { constructor() { super(); this.magic = void 0; this.nickname = void 0; this.memberId = void 0; this.isParsingMagic = void 0; this.updateMagicNum = list => { if (this.isParsingMagic) { const newMagic = this.findSenkaMagicNum(list); if (newMagic) { this.magic = newMagic; this.isParsingMagic = false; setImmediate(() => { this.emit('magic-refreshed'); }); } } }; this.findSenkaMagicNum = apiData => { let failed = false; const obfsRates = apiData.map(raw => { const rank = raw.api_mxltvkpyuklh; const key = raw.api_wuhnhojjxmke; const magicR = MAGIC_R_NUMS[rank % 13]; if (key % magicR !== 0) { console.warn(`${key} is indivisible by ${magicR}`); failed = true; } return key / magicR; }); if (failed) { return null; } const magicX = gcd(...obfsRates); if ((0, _lodash.isNaN)(magicX)) { return null; } if (magicX < 99) return magicX; for (let magic = 99; magic > 0; --magic) { if (magicX % magic === 0) return magic; } // unreachable, because magicX % 1 === 0 will always be true. return null; }; this.magic = 0; this.nickname = ''; this.memberId = -1; this.isParsingMagic = false; } initialize(magic, nickname, memberId) { this.magic = magic; this.nickname = nickname; this.memberId = memberId; } isInitialized() { return this.magic > 0 && this.memberId > 0 && this.nickname.length > 0; } decryptSenka(rankNo, encryptedSenka) { const magic = this.magic > 9 ? this.magic : MAGIC_L_NUMS[this.memberId % 10]; const senka = encryptedSenka / MAGIC_R_NUMS[rankNo % 13] / magic - 73 - 18; return senka > 0 ? senka : 0; } } const magicManager = new MagicManager(); exports.magicManager = magicManager;