poi-plugin-senka-calc
Version:
Ranking point calculator for poi
107 lines (83 loc) • 2.7 kB
JavaScript
;
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;