Skip to content

Commit

Permalink
Fix issue where given/trigger arrays were being shifted incorrectly
Browse files Browse the repository at this point in the history
Due to arrays not being deep copied
  • Loading branch information
cannawen committed Nov 26, 2023
1 parent 827ed2f commit b5fd0bc
Show file tree
Hide file tree
Showing 8 changed files with 39 additions and 17 deletions.
6 changes: 4 additions & 2 deletions src/engine/rules/alive.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ export default function alive(rule: Rule) {
label: rule.label,
trigger: [topics.alive, ...rule.trigger],
given: rule.given,
when: (trigger, given) => {
when: (t, given) => {
const trigger = [...t];
const aliveValue = trigger.shift();
return aliveValue && rule.when(trigger, given);
},
then: (trigger, given) => {
then: (t, given) => {
const trigger = [...t];
trigger.shift();
return rule.then(trigger, given);
},
Expand Down
6 changes: 4 additions & 2 deletions src/engine/rules/betweenSeconds.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ export default function betweenSeconds(
label: inGameRule.label,
trigger: [topics.time, ...inGameRule.trigger],
given: inGameRule.given,
when: (trigger, given) => {
when: (t, given) => {
const trigger = [...t];
const time = trigger.shift();
if (min && time < min) {
return false;
Expand All @@ -26,7 +27,8 @@ export default function betweenSeconds(
}
return inGameRule.when(trigger, given);
},
then: (trigger, given) => {
then: (t, given) => {
const trigger = [...t];
trigger.shift();
return inGameRule.then(trigger, given);
},
Expand Down
9 changes: 7 additions & 2 deletions src/engine/rules/conditionalEveryIntervalSeconds.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ export default function conditionalEveryIntervalSeconds(
label: rule.label,
trigger: [topics.time, ...rule.trigger],
given: [reminderTopic, ...rule.given],
when: (trigger, given) => {
when: (t, g) => {
const trigger = [...t];
const given = [...g];
const time = trigger.shift();
const lastRemindedTime = given.shift();
if (lastRemindedTime === undefined) {
Expand All @@ -31,7 +33,10 @@ export default function conditionalEveryIntervalSeconds(
return isReminderTime;
}
},
then: (trigger, given) => {
then: (t, g) => {
const trigger = [...t];
const given = [...g];

const time = trigger.shift();
const lastRemindedTime = given.shift();

Expand Down
6 changes: 4 additions & 2 deletions src/engine/rules/configurable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,16 @@ export default function configurable(configTopicString: string, rule: Rule) {
label: rule.label,
trigger: rule.trigger,
given: [configTopic, ...rule.given],
when: (trigger, given) => {
when: (trigger, g) => {
const given = [...g];
const config = given.shift();
if (config === EffectConfig.NONE) {
return false;
}
return rule.when(trigger, given);
},
then: (trigger, given) => {
then: (trigger, g) => {
const given = [...g];
const config: EffectConfig = given.shift();
const effect = configToEffectTopic[config];
if (effect) {
Expand Down
6 changes: 4 additions & 2 deletions src/engine/rules/everyIntervalSeconds.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,17 @@ export default function everyIntervalSeconds(
label: rule.label,
trigger: [topics.time, ...rule.trigger],
given: rule.given,
when: (trigger, given) => {
when: (t, given) => {
const trigger = [...t];
const time = trigger.shift();
return (
// If time is a multiple of interval
(time - (startTime || 0)) % interval === 0 &&
rule.when(trigger, given)
);
},
then: (trigger, given) => {
then: (t, given) => {
const trigger = [...t];
trigger.shift();
return rule.thenArray(trigger, given);
},
Expand Down
6 changes: 4 additions & 2 deletions src/engine/rules/inGame.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@ export default function inGame(rule: Rule) {
label: rule.label,
trigger: rule.trigger,
given: [topics.inGame, topics.time, ...rule.given],
when: (trigger, given) => {
when: (trigger, g) => {
const given = [...g];
const inGame = given.shift() || false;
const time = given.shift();
const timeCheck = time !== undefined && time > 0;
return rule.when(trigger, given) && inGame && timeCheck;
},
then: (trigger, given) => {
then: (trigger, g) => {
const given = [...g];
given.shift();
given.shift();
return rule.then(trigger, given);
Expand Down
9 changes: 6 additions & 3 deletions src/engine/rules/inRegularGame.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,12 @@ export default function inRegularGame(rule: Rule) {
label: rule.label,
trigger: rule.trigger,
given: [topics.customGameName, ...rule.given],
when: (trigger, given) =>
given.shift()?.length === 0 && rule.when(trigger, given),
then: (trigger, given) => {
when: (trigger, g) => {
const given = [...g];
return given.shift()?.length === 0 && rule.when(trigger, given);
},
then: (trigger, g) => {
const given = [...g];
given.shift();
return rule.then(trigger, given);
},
Expand Down
8 changes: 6 additions & 2 deletions src/engine/rules/isLiveGame.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,12 @@ export default function isLiveGame(rule: Rule) {
label: rule.label,
trigger: [topics.gsiEventsFromLiveGame, ...rule.trigger],
given: rule.given,
when: (trigger, given) => trigger.shift() && rule.when(trigger, given),
then: (trigger, given) => {
when: (t, given) => {
const trigger = [...t];
return trigger.shift() && rule.when(trigger, given);
},
then: (t, given) => {
const trigger = [...t];
trigger.shift();
return rule.then(trigger, given);
},
Expand Down

0 comments on commit b5fd0bc

Please sign in to comment.