From 6702f431d0590091d4fb3b4ca9d69559b5ba977a Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Wed, 11 May 2022 15:52:02 +0200 Subject: [PATCH 01/12] Fixed bug where removed library nodes kept showing --- app/imports/server/publications/library.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/imports/server/publications/library.js b/app/imports/server/publications/library.js index 10553aab..19211a55 100644 --- a/app/imports/server/publications/library.js +++ b/app/imports/server/publications/library.js @@ -73,6 +73,7 @@ Meteor.publish('libraryNodes', function(libraryId){ order: 1, parent: 1, ancestors: 1, + removed: 1, // Effect operation: 1, targetTags: 1, From ccc861b6fa51a44b295c348a1318a37c1e3806a7 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Wed, 11 May 2022 15:52:44 +0200 Subject: [PATCH 02/12] Improved character subscription performance By limiting fields that can trigger an autorun --- .../server/publications/singleCharacter.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/app/imports/server/publications/singleCharacter.js b/app/imports/server/publications/singleCharacter.js index 611f1d23..d27be56f 100644 --- a/app/imports/server/publications/singleCharacter.js +++ b/app/imports/server/publications/singleCharacter.js @@ -20,12 +20,18 @@ Meteor.publish('singleCharacter', function(creatureId){ this.error(e); } this.autorun(function (computation){ - let userId = this.userId; - let creatureCursor - creatureCursor = Creatures.find({ + const userId = this.userId; + const creature = Creatures.findOne({ _id: creatureId, + }, { + fields: { + owner: 1, + readers: 1, + writers: 1, + public: 1, + computeVersion: 1, + } }); - let creature = creatureCursor.fetch()[0]; try { assertViewPermission(creature, userId) } catch(e){ return [] } if (creature.computeVersion !== VERSION && computation.firstRun){ @@ -35,7 +41,9 @@ Meteor.publish('singleCharacter', function(creatureId){ catch(e){ console.error(e) } } return [ - creatureCursor, + Creatures.find({ + _id: creatureId, + }), CreatureProperties.find({ 'ancestors.id': creatureId, }), From 6ea882a05353a72200fae91efcfbe0bedb34eeeb Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Mon, 25 Jul 2022 15:13:47 +0200 Subject: [PATCH 03/12] Fixed trigger conditions not working on rest --- app/imports/api/engine/actions/applyTriggers.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/imports/api/engine/actions/applyTriggers.js b/app/imports/api/engine/actions/applyTriggers.js index 30b1790e..22507780 100644 --- a/app/imports/api/engine/actions/applyTriggers.js +++ b/app/imports/api/engine/actions/applyTriggers.js @@ -11,15 +11,9 @@ export default function applyTriggers(node, { creature, targets, scope, log }, t const type = prop.type; if (creature.triggers?.[type]?.[timing]) { creature.triggers[type][timing].forEach(trigger => { - // Tags - if (!triggerMatchTags(trigger, prop)) return; - // Condition - if (trigger.condition?.parseNode) { - recalculateCalculation(trigger.condition, scope, log); - if (!trigger.condition.value) return; + if (triggerMatchTags(trigger, prop)) { + applyTrigger(trigger, { creature, targets, scope, log }); } - // Apply - applyTrigger(trigger, { creature, targets, scope, log }); }); } } @@ -57,6 +51,13 @@ function triggerMatchTags(trigger, prop) { } export function applyTrigger(trigger, { creature, targets, scope, log }) { + // Prevent triggers from firing if their condition is false + if (trigger.condition?.parseNode) { + recalculateCalculation(trigger.condition, scope, log); + if (!trigger.condition.value) return; + } + + // Prevent triggers from firing themselves in a loop if (trigger.firing) { /* log.content.push({ From 03578b20662823d6fe4352b04eae434d7cd460dd Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Mon, 25 Jul 2022 15:21:38 +0200 Subject: [PATCH 04/12] fixed classes without variable names breaking the sheet --- .../creature/creatureProperties/methods/getSlotFillFilter.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/imports/api/creature/creatureProperties/methods/getSlotFillFilter.js b/app/imports/api/creature/creatureProperties/methods/getSlotFillFilter.js index c80f7fa3..d4670c95 100644 --- a/app/imports/api/creature/creatureProperties/methods/getSlotFillFilter.js +++ b/app/imports/api/creature/creatureProperties/methods/getSlotFillFilter.js @@ -24,7 +24,9 @@ export default function getSlotFillFilter({slot, libraryIds}){ slotFillerType: 'classLevel', }] }); - filter.variableName = slot.variableName; + if (slot.variableName) { + filter.variableName = slot.variableName; + } // Only search for levels the class needs if (slot.missingLevels && slot.missingLevels.length) { From 24cc87d6f7528a98466078d83cb1a23eaf2c3863 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Tue, 26 Jul 2022 09:07:20 +0200 Subject: [PATCH 05/12] Fixed deleted libraryNodes being shown in library --- app/imports/server/publications/library.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/imports/server/publications/library.js b/app/imports/server/publications/library.js index 217f9b00..9c7c59fd 100644 --- a/app/imports/server/publications/library.js +++ b/app/imports/server/publications/library.js @@ -16,6 +16,8 @@ const LIBRARY_NODE_TREE_FIELDS = { ancestors: 1, tags: 1, slotFillerCondition: 1, + removed: 1, + removedAt: 1, // SlotFillers slotQuantityFilled: 1, // Effect From 65e7ce6dce82c42e51297baee67ce914ca872898 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Tue, 26 Jul 2022 09:10:24 +0200 Subject: [PATCH 06/12] removed unused import --- app/imports/api/creature/creatures/methods/restCreature.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/imports/api/creature/creatures/methods/restCreature.js b/app/imports/api/creature/creatures/methods/restCreature.js index 2f630a5b..6eafbbcc 100644 --- a/app/imports/api/creature/creatures/methods/restCreature.js +++ b/app/imports/api/creature/creatures/methods/restCreature.js @@ -3,7 +3,7 @@ import { ValidatedMethod } from 'meteor/mdg:validated-method'; import { RateLimiterMixin } from 'ddp-rate-limiter-mixin'; import CreatureProperties from '/imports/api/creature/creatureProperties/CreatureProperties.js'; import { assertEditPermission } from '/imports/api/creature/creatures/creaturePermissions.js'; -import { groupBy, remove, rest, union } from 'lodash'; +import { groupBy, remove, union } from 'lodash'; import { getCreature, getVariables, getPropertiesOfType } from '/imports/api/engine/loadCreatures.js'; From 2b8f7e4927b0bdc53a0770efe81d9ea51c2d8adc Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Tue, 26 Jul 2022 11:33:47 +0200 Subject: [PATCH 07/12] Fixed fillers with type not showing in slot fill --- app/imports/server/publications/library.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/imports/server/publications/library.js b/app/imports/server/publications/library.js index 9c7c59fd..67dcf74a 100644 --- a/app/imports/server/publications/library.js +++ b/app/imports/server/publications/library.js @@ -20,6 +20,7 @@ const LIBRARY_NODE_TREE_FIELDS = { removedAt: 1, // SlotFillers slotQuantityFilled: 1, + slotFillerType: 1, // Effect operation: 1, targetTags: 1, From d44d4e0315d4fe258759e043ba273e9f29cc87e5 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Tue, 26 Jul 2022 11:53:18 +0200 Subject: [PATCH 08/12] Increased timeout and retries on S3 config --- app/imports/api/files/s3FileStorage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/imports/api/files/s3FileStorage.js b/app/imports/api/files/s3FileStorage.js index c23bf198..67059d44 100644 --- a/app/imports/api/files/s3FileStorage.js +++ b/app/imports/api/files/s3FileStorage.js @@ -1,5 +1,4 @@ // https://github.com/VeliovGroup/Meteor-Files/blob/master/docs/aws-s3-integration.md - import { Meteor } from 'meteor/meteor'; import { each, clone } from 'lodash'; import { Random } from 'meteor/random'; @@ -37,8 +36,9 @@ if (Meteor.isServer && Meteor.settings.useS3) { secretAccessKey: s3Conf.secret, endpoint: s3Conf.endpoint, sslEnabled: true, // optional + maxRetries: 10, httpOptions: { - timeout: 6000, + timeout: 12000, agent: false } }); From 6ccbf204eb34d206e5309be4b655258a378a4e5b Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Tue, 26 Jul 2022 12:04:13 +0200 Subject: [PATCH 09/12] Turned FileColelction logging off for production --- app/imports/api/files/s3FileStorage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/imports/api/files/s3FileStorage.js b/app/imports/api/files/s3FileStorage.js index 67059d44..3c3c540e 100644 --- a/app/imports/api/files/s3FileStorage.js +++ b/app/imports/api/files/s3FileStorage.js @@ -48,7 +48,7 @@ if (Meteor.isServer && Meteor.settings.useS3) { storagePath, onBeforeUpload, onAfterUpload, - debug = Meteor.isProduction, + debug = !Meteor.isProduction, allowClientCode = false, }){ const collection = new FilesCollection({ @@ -222,7 +222,7 @@ if (Meteor.isServer && Meteor.settings.useS3) { storagePath, onBeforeUpload, onAfterUpload, - debug = Meteor.isProduction, + debug = !Meteor.isProduction, allowClientCode = false, }){ const collection = new FilesCollection({ From 53ed271ea20acf98deeb169068077e5f7a7df67d Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Tue, 26 Jul 2022 13:33:05 +0200 Subject: [PATCH 10/12] Calculation errors moved to the build page Can be hidden, restyled to improve usability in light mode --- .../api/creature/creatures/Creatures.js | 5 + .../character/characterSheetTabs/BuildTab.vue | 10 ++ .../character/characterSheetTabs/StatsTab.vue | 7 -- .../character/errors/CharacterErrors.vue | 99 +++++++++++++++---- .../character/errors/DependencyLoopError.vue | 16 ++- 5 files changed, 105 insertions(+), 32 deletions(-) diff --git a/app/imports/api/creature/creatures/Creatures.js b/app/imports/api/creature/creatures/Creatures.js index 311a013e..25ff5021 100644 --- a/app/imports/api/creature/creatures/Creatures.js +++ b/app/imports/api/creature/creatures/Creatures.js @@ -38,6 +38,11 @@ let CreatureSettingsSchema = new SimpleSchema({ type: Boolean, optional: true, }, + // Hide calculation errors + hideCalculationErrors: { + type: Boolean, + optional: true, + }, // How much each hitDice resets on a long rest hitDiceResetMultiplier: { type: Number, diff --git a/app/imports/ui/creature/character/characterSheetTabs/BuildTab.vue b/app/imports/ui/creature/character/characterSheetTabs/BuildTab.vue index 96de600c..64bd043e 100644 --- a/app/imports/ui/creature/character/characterSheetTabs/BuildTab.vue +++ b/app/imports/ui/creature/character/characterSheetTabs/BuildTab.vue @@ -1,5 +1,13 @@