``` ~/go/bin/sourcemapper -output ddb -jsurl https://media.dndbeyond.com/character-app/static/js/main.90aa78c5.js ```
358 lines
22 KiB
JavaScript
358 lines
22 KiB
JavaScript
import { characterActions, serviceDataActions } from '../actions';
|
|
import { ConfigUtils } from '../config';
|
|
import { rulesEngineConfig } from '../config/utils';
|
|
import { ContainerAccessors } from '../engine/Container';
|
|
import { CoreUtils, CURRENCY_VALUE } from '../engine/Core';
|
|
import { DefinitionHacks } from '../engine/Definition';
|
|
import { FormatUtils } from '../engine/Format';
|
|
import { HelperUtils } from '../engine/Helper';
|
|
import { NotificationTypeEnum } from '../notification';
|
|
import { rulesEngineSelectors } from '../selectors';
|
|
import { InventoryManager } from './InventoryManager';
|
|
export class CoinManager extends InventoryManager {
|
|
constructor(params) {
|
|
super(params);
|
|
//Coin Action Handlers
|
|
this.handleTransaction = ({ coin, containerDefinitionKey, multiplier }, onSuccess, onError) => {
|
|
var _a, _b;
|
|
const adjustedCurrency = CoreUtils.getCurrencyTransactionAdjustment(multiplier, coin);
|
|
const containerLookup = rulesEngineSelectors.getContainerLookup(this.state);
|
|
const container = HelperUtils.lookupDataOrFallback(containerLookup, containerDefinitionKey);
|
|
const isEmpty = Object.keys(coin).length === 0;
|
|
if (!isEmpty && container) {
|
|
const destinationEntityTypeId = ContainerAccessors.getContainerType(container);
|
|
const destinationEntityId = ContainerAccessors.getMappingId(container);
|
|
const currentCoins = this.getContainerCoin(containerDefinitionKey);
|
|
if (multiplier === 1) {
|
|
const validAddCoin = this.calculateAddCoinPayload(currentCoins, coin.cp || 0, coin.ep || 0, coin.gp || 0, coin.pp || 0, coin.sp || 0);
|
|
if (!validAddCoin) {
|
|
(_a = rulesEngineConfig === null || rulesEngineConfig === void 0 ? void 0 : rulesEngineConfig.onNotification) === null || _a === void 0 ? void 0 : _a.call(rulesEngineConfig, 'Failed to add coins', `The max amount allowed for each currency type is ${FormatUtils.renderLocaleNumber(CURRENCY_VALUE.MAX)}`, NotificationTypeEnum.ERROR);
|
|
return;
|
|
}
|
|
}
|
|
else {
|
|
const validRemoveCoin = this.calculateRemoveCoinPayload(currentCoins, coin.cp || 0, coin.ep || 0, coin.gp || 0, coin.pp || 0, coin.sp || 0);
|
|
if (!validRemoveCoin) {
|
|
(_b = rulesEngineConfig === null || rulesEngineConfig === void 0 ? void 0 : rulesEngineConfig.onNotification) === null || _b === void 0 ? void 0 : _b.call(rulesEngineConfig, 'Failed to remove coins', `The min amount allowed for each currency type is ${FormatUtils.renderLocaleNumber(CURRENCY_VALUE.MIN)}`, NotificationTypeEnum.ERROR);
|
|
return;
|
|
}
|
|
}
|
|
this.dispatch(characterActions.currencyTransactionSet(Object.assign(Object.assign({}, adjustedCurrency), { destinationEntityId: destinationEntityId, destinationEntityTypeId: destinationEntityTypeId }), () => {
|
|
typeof onSuccess === 'function' && onSuccess();
|
|
}, () => {
|
|
typeof onError === 'function' && onError();
|
|
}));
|
|
}
|
|
};
|
|
this.handleCoinSet = ({ coin, containerDefinitionKey }, onSuccess, onError) => {
|
|
const destinationEntityId = DefinitionHacks.hack__getDefinitionKeyId(containerDefinitionKey);
|
|
const destinationEntityTypeId = DefinitionHacks.hack__getDefinitionKeyType(containerDefinitionKey);
|
|
if (destinationEntityId && destinationEntityTypeId) {
|
|
if (containerDefinitionKey === this.getCharacterContainerDefinitionKey()) {
|
|
this.dispatch(characterActions.currenciesSet(coin, destinationEntityTypeId, destinationEntityId));
|
|
}
|
|
else if (containerDefinitionKey === this.getPartyEquipmentContainerDefinitionKey()) {
|
|
this.dispatch(serviceDataActions.partyCurrenciesSet(coin, destinationEntityTypeId, destinationEntityId, () => {
|
|
typeof onSuccess === 'function' && onSuccess();
|
|
const data = {};
|
|
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
|
|
this.sendMessage({ data, eventType });
|
|
}));
|
|
}
|
|
}
|
|
};
|
|
this.handleAmountSet = ({ key, amount, containerDefinitionKey }, onSuccess, onError) => {
|
|
switch (key) {
|
|
case 'pp':
|
|
this.handlePlatinumSet({ amount, containerDefinitionKey }, onSuccess, onError);
|
|
break;
|
|
case 'gp':
|
|
this.handleGoldSet({ amount, containerDefinitionKey }, onSuccess, onError);
|
|
break;
|
|
case 'sp':
|
|
this.handleSilverSet({ amount, containerDefinitionKey }, onSuccess, onError);
|
|
break;
|
|
case 'ep':
|
|
this.handleElectrumSet({ amount, containerDefinitionKey }, onSuccess, onError);
|
|
break;
|
|
case 'cp':
|
|
this.handleCopperSet({ amount, containerDefinitionKey }, onSuccess, onError);
|
|
break;
|
|
default:
|
|
//not implemented
|
|
}
|
|
};
|
|
this.handlePlatinumSet = ({ amount, containerDefinitionKey }, onSuccess, onError) => {
|
|
const destinationEntityId = DefinitionHacks.hack__getDefinitionKeyId(containerDefinitionKey);
|
|
const destinationEntityTypeId = DefinitionHacks.hack__getDefinitionKeyType(containerDefinitionKey);
|
|
if (destinationEntityId && destinationEntityTypeId) {
|
|
if (containerDefinitionKey === this.getCharacterContainerDefinitionKey()) {
|
|
this.dispatch(characterActions.currencyPlatinumSet(amount, destinationEntityTypeId, destinationEntityId));
|
|
}
|
|
else if (containerDefinitionKey === this.getPartyEquipmentContainerDefinitionKey()) {
|
|
this.dispatch(serviceDataActions.partyCurrencyPlatinumSet(amount, destinationEntityTypeId, destinationEntityId, () => {
|
|
typeof onSuccess === 'function' && onSuccess();
|
|
const data = {};
|
|
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
|
|
this.sendMessage({ data, eventType });
|
|
}));
|
|
}
|
|
else {
|
|
const isShared = this.isSharedContainerDefinitionKey(containerDefinitionKey);
|
|
if (isShared) {
|
|
this.dispatch(serviceDataActions.partyItemCurrencyPlatinumSet(amount, destinationEntityTypeId, destinationEntityId, () => {
|
|
typeof onSuccess === 'function' && onSuccess();
|
|
const data = {};
|
|
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
|
|
this.sendMessage({ data, eventType });
|
|
}));
|
|
}
|
|
else {
|
|
this.dispatch(characterActions.itemCurrencyPlatinumSet(amount, destinationEntityTypeId, destinationEntityId));
|
|
}
|
|
}
|
|
}
|
|
};
|
|
this.handleGoldSet = ({ amount, containerDefinitionKey }, onSuccess, onError) => {
|
|
const destinationEntityId = DefinitionHacks.hack__getDefinitionKeyId(containerDefinitionKey);
|
|
const destinationEntityTypeId = DefinitionHacks.hack__getDefinitionKeyType(containerDefinitionKey);
|
|
if (destinationEntityId && destinationEntityTypeId) {
|
|
if (containerDefinitionKey === this.getCharacterContainerDefinitionKey()) {
|
|
this.dispatch(characterActions.currencyGoldSet(amount, destinationEntityTypeId, destinationEntityId));
|
|
}
|
|
else if (containerDefinitionKey === this.getPartyEquipmentContainerDefinitionKey()) {
|
|
this.dispatch(serviceDataActions.partyCurrencyGoldSet(amount, destinationEntityTypeId, destinationEntityId, () => {
|
|
typeof onSuccess === 'function' && onSuccess();
|
|
const data = {};
|
|
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
|
|
this.sendMessage({ data, eventType });
|
|
}));
|
|
}
|
|
else {
|
|
const isShared = this.isSharedContainerDefinitionKey(containerDefinitionKey);
|
|
if (isShared) {
|
|
this.dispatch(serviceDataActions.partyItemCurrencyGoldSet(amount, destinationEntityTypeId, destinationEntityId, () => {
|
|
typeof onSuccess === 'function' && onSuccess();
|
|
const data = {};
|
|
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
|
|
this.sendMessage({ data, eventType });
|
|
}));
|
|
}
|
|
else {
|
|
this.dispatch(characterActions.itemCurrencyGoldSet(amount, destinationEntityTypeId, destinationEntityId));
|
|
}
|
|
}
|
|
}
|
|
};
|
|
this.handleElectrumSet = ({ amount, containerDefinitionKey }, onSuccess, onError) => {
|
|
const destinationEntityId = DefinitionHacks.hack__getDefinitionKeyId(containerDefinitionKey);
|
|
const destinationEntityTypeId = DefinitionHacks.hack__getDefinitionKeyType(containerDefinitionKey);
|
|
if (destinationEntityId && destinationEntityTypeId) {
|
|
if (containerDefinitionKey === this.getCharacterContainerDefinitionKey()) {
|
|
this.dispatch(characterActions.currencyElectrumSet(amount, destinationEntityTypeId, destinationEntityId));
|
|
}
|
|
else if (containerDefinitionKey === this.getPartyEquipmentContainerDefinitionKey()) {
|
|
this.dispatch(serviceDataActions.partyCurrencyElectrumSet(amount, destinationEntityTypeId, destinationEntityId, () => {
|
|
typeof onSuccess === 'function' && onSuccess();
|
|
const data = {};
|
|
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
|
|
this.sendMessage({ data, eventType });
|
|
}));
|
|
}
|
|
else {
|
|
const isShared = this.isSharedContainerDefinitionKey(containerDefinitionKey);
|
|
if (isShared) {
|
|
this.dispatch(serviceDataActions.partyItemCurrencyElectrumSet(amount, destinationEntityTypeId, destinationEntityId, () => {
|
|
typeof onSuccess === 'function' && onSuccess();
|
|
const data = {};
|
|
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
|
|
this.sendMessage({ data, eventType });
|
|
}));
|
|
}
|
|
else {
|
|
this.dispatch(characterActions.itemCurrencyElectrumSet(amount, destinationEntityTypeId, destinationEntityId));
|
|
}
|
|
}
|
|
}
|
|
};
|
|
this.handleSilverSet = ({ amount, containerDefinitionKey }, onSuccess, onError) => {
|
|
const destinationEntityId = DefinitionHacks.hack__getDefinitionKeyId(containerDefinitionKey);
|
|
const destinationEntityTypeId = DefinitionHacks.hack__getDefinitionKeyType(containerDefinitionKey);
|
|
if (destinationEntityId && destinationEntityTypeId) {
|
|
if (containerDefinitionKey === this.getCharacterContainerDefinitionKey()) {
|
|
this.dispatch(characterActions.currencySilverSet(amount, destinationEntityTypeId, destinationEntityId));
|
|
}
|
|
else if (containerDefinitionKey === this.getPartyEquipmentContainerDefinitionKey()) {
|
|
this.dispatch(serviceDataActions.partyCurrencySilverSet(amount, destinationEntityTypeId, destinationEntityId, () => {
|
|
typeof onSuccess === 'function' && onSuccess();
|
|
const data = {};
|
|
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
|
|
this.sendMessage({ data, eventType });
|
|
}));
|
|
}
|
|
else {
|
|
const isShared = this.isSharedContainerDefinitionKey(containerDefinitionKey);
|
|
if (isShared) {
|
|
this.dispatch(serviceDataActions.partyItemCurrencySilverSet(amount, destinationEntityTypeId, destinationEntityId, () => {
|
|
typeof onSuccess === 'function' && onSuccess();
|
|
const data = {};
|
|
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
|
|
this.sendMessage({ data, eventType });
|
|
}));
|
|
}
|
|
else {
|
|
this.dispatch(characterActions.itemCurrencySilverSet(amount, destinationEntityTypeId, destinationEntityId));
|
|
}
|
|
}
|
|
}
|
|
};
|
|
this.handleCopperSet = ({ amount, containerDefinitionKey }, onSuccess, onError) => {
|
|
const destinationEntityId = DefinitionHacks.hack__getDefinitionKeyId(containerDefinitionKey);
|
|
const destinationEntityTypeId = DefinitionHacks.hack__getDefinitionKeyType(containerDefinitionKey);
|
|
if (destinationEntityId && destinationEntityTypeId) {
|
|
if (containerDefinitionKey === this.getCharacterContainerDefinitionKey()) {
|
|
this.dispatch(characterActions.currencyCopperSet(amount, destinationEntityTypeId, destinationEntityId));
|
|
}
|
|
else if (containerDefinitionKey === this.getPartyEquipmentContainerDefinitionKey()) {
|
|
this.dispatch(serviceDataActions.partyCurrencyCopperSet(amount, destinationEntityTypeId, destinationEntityId, () => {
|
|
typeof onSuccess === 'function' && onSuccess();
|
|
const data = {};
|
|
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
|
|
this.sendMessage({ data, eventType });
|
|
}));
|
|
}
|
|
else {
|
|
const isShared = this.isSharedContainerDefinitionKey(containerDefinitionKey);
|
|
if (isShared) {
|
|
this.dispatch(serviceDataActions.partyItemCurrencyCopperSet(amount, destinationEntityTypeId, destinationEntityId, () => {
|
|
typeof onSuccess === 'function' && onSuccess();
|
|
const data = {};
|
|
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
|
|
this.sendMessage({ data, eventType });
|
|
}));
|
|
}
|
|
else {
|
|
this.dispatch(characterActions.itemCurrencyCopperSet(amount, destinationEntityTypeId, destinationEntityId));
|
|
}
|
|
}
|
|
}
|
|
};
|
|
// Validators
|
|
this.canAddCoin = (coin, containerDefinitionKey) => {
|
|
const containerLookup = rulesEngineSelectors.getContainerLookup(this.state);
|
|
const container = HelperUtils.lookupDataOrFallback(containerLookup, containerDefinitionKey);
|
|
const isShared = container ? ContainerAccessors.isShared(container) : false;
|
|
if (isShared && this.isSharingTurnedDeleteOnly()) {
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
this.canRemoveCoin = (coin, containerDefinitionKey) => {
|
|
const containerLookup = rulesEngineSelectors.getContainerLookup(this.state);
|
|
const container = HelperUtils.lookupDataOrFallback(containerLookup, containerDefinitionKey);
|
|
const isShared = container ? ContainerAccessors.isShared(container) : false;
|
|
if (isShared && this.isSharingTurnedDeleteOnly()) {
|
|
let hasNegatives = Object.values(coin).some((value) => value < 0);
|
|
return !hasNegatives;
|
|
}
|
|
return true;
|
|
};
|
|
this.canUseCointainers = () => {
|
|
const rulesEngineConfig = ConfigUtils.getCurrentRulesEngineConfig();
|
|
const preferences = rulesEngineSelectors.getPreferences(this.state);
|
|
return !!((preferences === null || preferences === void 0 ? void 0 : preferences.enableContainerCurrency) && (rulesEngineConfig === null || rulesEngineConfig === void 0 ? void 0 : rulesEngineConfig.canUseCurrencyContainers));
|
|
};
|
|
//Utils
|
|
this.getTotalContainerCoinInGold = (containerDefinitionKey) => {
|
|
const ruleData = rulesEngineSelectors.getRuleData(this.state);
|
|
const coin = this.getContainerCoin(containerDefinitionKey);
|
|
return coin ? CoreUtils.convertTotalCoinToGold(coin, ruleData) : 0;
|
|
};
|
|
this.getContainerCoin = (containerDefinitionKey) => {
|
|
const containerLookup = rulesEngineSelectors.getContainerLookup(this.state);
|
|
const container = HelperUtils.lookupDataOrFallback(containerLookup, containerDefinitionKey);
|
|
return container ? ContainerAccessors.getCoin(container) : null;
|
|
};
|
|
this.getAllPartyCoin = () => {
|
|
const partyContainers = rulesEngineSelectors.getPartyInventoryContainers(this.state);
|
|
return partyContainers.reduce((acc, container) => {
|
|
const containerCoin = ContainerAccessors.getCoin(container);
|
|
return containerCoin
|
|
? {
|
|
cp: containerCoin.cp ? acc.cp + containerCoin.cp : acc.cp,
|
|
sp: containerCoin.sp ? acc.sp + containerCoin.sp : acc.sp,
|
|
ep: containerCoin.ep ? acc.ep + containerCoin.ep : acc.ep,
|
|
gp: containerCoin.gp ? acc.gp + containerCoin.gp : acc.gp,
|
|
pp: containerCoin.pp ? acc.pp + containerCoin.pp : acc.pp,
|
|
}
|
|
: acc;
|
|
}, { cp: 0, sp: 0, ep: 0, gp: 0, pp: 0 });
|
|
};
|
|
this.getAllCharacterCoin = () => {
|
|
const characterContainers = rulesEngineSelectors.getCharacterInventoryContainers(this.state);
|
|
return characterContainers.reduce((acc, container) => {
|
|
const containerCoin = ContainerAccessors.getCoin(container);
|
|
return containerCoin
|
|
? {
|
|
cp: containerCoin.cp ? acc.cp + containerCoin.cp : acc.cp,
|
|
sp: containerCoin.sp ? acc.sp + containerCoin.sp : acc.sp,
|
|
ep: containerCoin.ep ? acc.ep + containerCoin.ep : acc.ep,
|
|
gp: containerCoin.gp ? acc.gp + containerCoin.gp : acc.gp,
|
|
pp: containerCoin.pp ? acc.pp + containerCoin.pp : acc.pp,
|
|
}
|
|
: acc;
|
|
}, { cp: 0, sp: 0, ep: 0, gp: 0, pp: 0 });
|
|
};
|
|
}
|
|
calculateAddCoinPayload(currentCoins, copper, electrum, gold, platinum, silver) {
|
|
const cp = copper !== 0 ? this.calculateModifiedMaxValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.cp, copper) : 0;
|
|
const ep = electrum !== 0 ? this.calculateModifiedMaxValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.ep, electrum) : 0;
|
|
const gp = gold !== 0 ? this.calculateModifiedMaxValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.gp, gold) : 0;
|
|
const pp = platinum !== 0 ? this.calculateModifiedMaxValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.pp, platinum) : 0;
|
|
const sp = silver !== 0 ? this.calculateModifiedMaxValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.sp, silver) : 0;
|
|
return this.calculateCoinPayload(cp, ep, gp, pp, sp);
|
|
}
|
|
calculateRemoveCoinPayload(currentCoins, copper, electrum, gold, platinum, silver) {
|
|
const cp = copper !== 0 ? this.calculateModifiedMinValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.cp, copper) : 0;
|
|
const ep = electrum !== 0 ? this.calculateModifiedMinValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.ep, electrum) : 0;
|
|
const gp = gold !== 0 ? this.calculateModifiedMinValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.gp, gold) : 0;
|
|
const pp = platinum !== 0 ? this.calculateModifiedMinValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.pp, platinum) : 0;
|
|
const sp = silver !== 0 ? this.calculateModifiedMinValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.sp, silver) : 0;
|
|
return this.calculateCoinPayload(cp, ep, gp, pp, sp);
|
|
}
|
|
calculateCoinPayload(cp, ep, gp, pp, sp) {
|
|
const coinPayload = {};
|
|
if (cp === null || ep === null || gp === null || pp === null || sp === null)
|
|
return null;
|
|
if (cp !== 0)
|
|
coinPayload.cp = cp;
|
|
if (ep !== 0)
|
|
coinPayload.ep = ep;
|
|
if (gp !== 0)
|
|
coinPayload.gp = gp;
|
|
if (pp !== 0)
|
|
coinPayload.pp = pp;
|
|
if (sp !== 0)
|
|
coinPayload.sp = sp;
|
|
return coinPayload;
|
|
}
|
|
calculateModifiedMinValue(baseValue, value) {
|
|
const result = (baseValue || 0) - value;
|
|
if (result >= CURRENCY_VALUE.MIN) {
|
|
return value;
|
|
}
|
|
else {
|
|
return null;
|
|
}
|
|
}
|
|
calculateModifiedMaxValue(baseValue, value) {
|
|
const result = (baseValue || 0) + value;
|
|
if (result <= CURRENCY_VALUE.MAX) {
|
|
return value;
|
|
}
|
|
else {
|
|
return null;
|
|
}
|
|
}
|
|
}
|