poi-plugin-senka-calc
Version:
Ranking point calculator for poi
176 lines (149 loc) • 8.46 kB
JavaScript
"use strict";
exports.__esModule = true;
exports.Info = void 0;
var _react = _interopRequireWildcard(require("react"));
var _core = require("@blueprintjs/core");
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _reactRedux = require("react-redux");
var _reactI18next = require("react-i18next");
var _selectors = require("../selectors");
var _magic = require("../lib/magic");
var _util = require("../lib/util");
var _const = require("../lib/const");
var _common = require("./common");
var _overlay = require("views/components/etc/overlay");
var remote = _interopRequireWildcard(require("@electron/remote"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
const gameAPIBroadcaster = remote.require('./lib/game-api-broadcaster');
const SenkaText = _styledComponents.default.span.withConfig({
displayName: "info__SenkaText",
componentId: "sc-zntess-0"
})(["padding-right:5px;"]);
const IncreasementText = _styledComponents.default.span.withConfig({
displayName: "info__IncreasementText",
componentId: "sc-zntess-1"
})(["font-size:0.9;opacity:0.75;"]);
const Td = _styledComponents.default.td.withConfig({
displayName: "info__Td",
componentId: "sc-zntess-2"
})(["position:relative;padding-top:18px !important;"]);
const CornerLabel = _styledComponents.default.div.withConfig({
displayName: "info__CornerLabel",
componentId: "sc-zntess-3"
})(["display:flex;font-size:12px;position:absolute;padding:0 16px 0 5px;line-height:16px;border-bottom-right-radius:18px;top:0;left:0;white-space:nowrap;opacity:0.9;align-items:center;"]);
const DateIcon = (0, _styledComponents.default)(_core.Icon).withConfig({
displayName: "info__DateIcon",
componentId: "sc-zntess-4"
})(["margin-left:4px;"]);
const TooltipRightAlign = (0, _styledComponents.default)(_overlay.Tooltip).withConfig({
displayName: "info__TooltipRightAlign",
componentId: "sc-zntess-5"
})(["margin-left:auto;"]);
const Info = prop => {
const {
rank5 = {},
rank20 = {},
rank100 = {},
rank501 = {},
rankUser = {},
experienceHistory = {},
exHistory = {},
questHistory = {},
currentRank
} = (0, _reactRedux.useSelector)(_selectors.pluginDataSelector);
const {
t
} = (0, _reactI18next.useTranslation)('poi-plugin-senka-calc');
const [isRefreshingMagic, setIsRefreshingMagic] = (0, _react.useState)(false);
const onRefreshButtonClick = (0, _react.useCallback)(() => {
setIsRefreshingMagic(true);
_magic.magicManager.isParsingMagic = true;
}, []);
const callback = (0, _react.useCallback)(() => {
setIsRefreshingMagic(false);
}, []);
(0, _react.useEffect)(() => {
_magic.magicManager.addListener('magic-refreshed', callback);
return () => {
_magic.magicManager.removeListener('magic-refreshed', callback);
};
}, [prop]);
(0, _react.useEffect)(() => {
const cb = (_method, [domain, path]) => {
if (path === '/kcsapi/api_get_member/record') {
onRefreshButtonClick();
}
};
gameAPIBroadcaster.addListener('network.on.response', cb);
return () => {
gameAPIBroadcaster.removeListener('network.on.response', cb);
};
}, [onRefreshButtonClick]);
const rankList = [[5, rank5], [20, rank20], [100, rank100], [501, rank501], [currentRank, rankUser]];
const getDeltaForOtherUser = (0, _react.useCallback)(rankHistory => {
return (0, _util.getElementFromNumberRecords)(rankHistory, -1) - (0, _util.getElementFromNumberRecords)(rankHistory, -2);
}, []);
const userSenkaDelta = (0, _react.useMemo)(() => {
const lastUpdateDateNo = parseInt((0, _util.getElementByIndex)(Object.keys(rankUser), -1));
const experienceDelta = (0, _util.getElementFromNumberRecords)(experienceHistory, -1) - experienceHistory[lastUpdateDateNo];
const experienceSenka = experienceDelta * _const.EXPERIENCE_TO_SENKA_RATE;
const uncountedExSenka = Object.keys(exHistory).map(dateNo => parseInt(dateNo)).filter(dateNo => dateNo >= lastUpdateDateNo).map(dateNo => exHistory[dateNo]).reduce((a, b) => [...a, ...b], []).map(id => _const.EX_MAPS[id] || 0).reduce((a, b) => a + b, 0);
const uncountedQuestSenka = Object.keys(questHistory).map(dateNo => parseInt(dateNo)) // Senka of dateNo 1000 will be moved to next month
.filter(dateNo => dateNo >= lastUpdateDateNo && dateNo < 1000).map(dateNo => questHistory[dateNo]).reduce((a, b) => [...a, ...b], []).map(questId => {
var _SENKA_QUESTS$find;
return ((_SENKA_QUESTS$find = _const.SENKA_QUESTS.find(({
id
}) => id === questId)) === null || _SENKA_QUESTS$find === void 0 ? void 0 : _SENKA_QUESTS$find.senka) || 0;
}).reduce((a, b) => a + b, 0);
return (experienceSenka + uncountedExSenka + uncountedQuestSenka).toFixed(1);
}, [rankUser, experienceHistory, exHistory, questHistory]);
return /*#__PURE__*/_react.default.createElement(_common.Container, null, /*#__PURE__*/_react.default.createElement(_common.Title, null, /*#__PURE__*/_react.default.createElement(_core.Icon, {
icon: "numbered-list",
style: {
paddingRight: 8
}
}), t('Ranking Info'), /*#__PURE__*/_react.default.createElement(TooltipRightAlign, {
position: _core.Position.BOTTOM_RIGHT,
content: t('Click the button and load ranking page to correct ranking point values'),
targetTagName: "div",
wrapperTagName: "div"
}, /*#__PURE__*/_react.default.createElement(_core.Button, {
icon: "refresh",
small: true,
minimal: true,
onClick: onRefreshButtonClick,
loading: isRefreshingMagic,
style: {
minWidth: 16,
minHeight: 16
}
}))), /*#__PURE__*/_react.default.createElement(_core.HTMLTable, {
striped: true,
condensed: true,
style: {
width: '100%'
}
}, /*#__PURE__*/_react.default.createElement("thead", null, /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("th", null, t('Rank')), /*#__PURE__*/_react.default.createElement("th", null, t('Point')))), /*#__PURE__*/_react.default.createElement("tbody", null, rankList.map(([rank, rankHistory], index) => {
const lastUpdateDateNo = parseInt((0, _util.getElementByIndex)(Object.keys(rankHistory), -1));
const [lastUpdateDate, isDate] = (0, _util.dateNoToDate)(lastUpdateDateNo);
const senka = (0, _util.getElementFromNumberRecords)(rankHistory, -1);
const delta = index !== rankList.length - 1 ? getDeltaForOtherUser(rankHistory) : // last one is user's senka, show the experience delta instead
userSenkaDelta;
return /*#__PURE__*/_react.default.createElement("tr", {
key: index
}, /*#__PURE__*/_react.default.createElement(Td, null, rank, /*#__PURE__*/_react.default.createElement(CornerLabel, {
className: "bg-primary"
}, t('Last Update {{ date }}', {
date: lastUpdateDate
}), /*#__PURE__*/_react.default.createElement(DateIcon, {
size: 10,
icon: isDate ? 'full-circle' : 'moon'
}))), /*#__PURE__*/_react.default.createElement(Td, null, /*#__PURE__*/_react.default.createElement(SenkaText, null, senka), /*#__PURE__*/_react.default.createElement(IncreasementText, null, /*#__PURE__*/_react.default.createElement(_core.Icon, {
icon: "arrow-up",
size: 12
}), delta)));
}))));
};
exports.Info = Info;