UNPKG

poi-plugin-senka-calc

Version:
107 lines (83 loc) 2.7 kB
"use strict"; exports.__esModule = true; exports.reducer = void 0; var _util = require("../lib/util"); var _momentTimezone = _interopRequireDefault(require("moment-timezone")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const extractCurrentExperience = ({ type, body }) => { switch (type) { case '@@Response/kcsapi/api_get_member/basic': { return body.api_experience; } case '@@Response/kcsapi/api_get_member/record': { return body.api_experience[0]; } case '@@Response/kcsapi/api_req_mission/result': { return body.api_member_exp; } case '@@Response/kcsapi/api_port/port': { return body.api_basic.api_experience; } case '@@Response/kcsapi/api_req_practice/battle_result': { return body.api_member_exp; } case '@@Response/kcsapi/api_req_sortie/battleresult': { return body.api_member_exp; } case '@@Response/kcsapi/api_req_combined_battle/battleresult': { return body.api_member_exp; } default: { return -1; } } }; // state: Record<SenkaCircleId, experience>. SenkaCircleId = 1000 is current experience const reducer = (state = {}, payload) => { const { type } = payload; if (type === '@@poi-plugin-senka-calc/initialize') { const { archive } = payload; return archive.experienceHistory; } else { const currentExperience = Math.trunc(extractCurrentExperience(payload)); if (!currentExperience || currentExperience < 0) { return state; } const current = _momentTimezone.default.tz('Asia/Tokyo'); const startOfSenka = _momentTimezone.default.tz('Asia/Tokyo').startOf('month').add(2, 'hours'); const endOfSenka = _momentTimezone.default.tz('Asia/Tokyo').endOf('month').subtract(2, 'hours'); // Don't record senka after 22:00 of the end day of month if (current.isAfter(endOfSenka)) { return state; } const dateNo = (0, _util.getDateNo)(); const lastState = (0, _util.removeKeysGreaterThan)(state, dateNo); // when entering new senka circle, record the base experience // (which is the value of former current experience) if (!state[dateNo] && current.isAfter(startOfSenka)) { return { ...lastState, [dateNo]: state[1000] || currentExperience, 1000: currentExperience }; } else { // don't overwrite experience of existed senka circle or // when the first senka circle has not started yet return { ...lastState, 1000: currentExperience }; } } }; exports.reducer = reducer;