From 0f05abcd271393b97016938371c6a598810b50c3 Mon Sep 17 00:00:00 2001 From: DebaucheryLibrarian Date: Mon, 20 May 2024 06:29:44 +0200 Subject: [PATCH] Implemented alert field AND/OR logic. --- migrations/20240414003818_alerts_any.js | 10 ++++++++++ src/alerts.js | 18 +++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/migrations/20240414003818_alerts_any.js b/migrations/20240414003818_alerts_any.js index 8a0e849e..a3632257 100644 --- a/migrations/20240414003818_alerts_any.js +++ b/migrations/20240414003818_alerts_any.js @@ -16,6 +16,16 @@ exports.up = async (knex) => { .notNullable() .defaultTo(true); }); + + await knex.raw(` + UPDATE alerts + SET + all_actors = false, + all_entities = false, + all_tags = false, + all_matches= false + WHERE alerts.all = false; + `); }; exports.down = async (knex) => { diff --git a/src/alerts.js b/src/alerts.js index 2161f379..6fde7944 100755 --- a/src/alerts.js +++ b/src/alerts.js @@ -129,6 +129,10 @@ async function notify(scenes) { notify: alert.notify, email: alert.email, all: alert.all, + allActors: alert.all_actors, + allEntities: alert.all_entities, + allTags: alert.all_tags, + allMatches: alert.all_matches, actors: alertsActorsByAlertId[alert.id] || [], tags: alertsTagsByAlertId[alert.id] || [], entities: alertsEntitiesByAlertId[alert.id] || [], @@ -149,11 +153,11 @@ async function notify(scenes) { const triggers = alerts.flatMap((alert) => { const alertScenes = curatedScenes.filter((scene) => { if (alert.all) { - if (alert.actors.length > 0 && !alert.actors.every((actorId) => scene.actorIds.includes(actorId))) { + if (alert.actors.length > 0 && !alert.actors[alert.allActors ? 'every' : 'some']((actorId) => scene.actorIds.includes(actorId))) { return false; } - if (alert.tags.length > 0 && !alert.tags.every((tagId) => scene.tagIds.includes(tagId))) { + if (alert.tags.length > 0 && !alert.tags[alert.allTags ? 'every' : 'some']((tagId) => scene.tagIds.includes(tagId))) { return false; } @@ -162,27 +166,27 @@ async function notify(scenes) { return false; } - if (alert.matches.length > 0 && !alert.matches.every((match) => match.expression.test(scene[match.property]))) { + if (alert.matches.length > 0 && !alert.matches[alert.allMatches ? 'every' : 'some']((match) => match.expression.test(scene[match.property]))) { return false; } return true; } - if (alert.actors.some((actorId) => scene.actorIds.includes(actorId))) { + if (alert.matches.length > 0 && alert.actors[alert.allActors ? 'every' : 'some']((actorId) => scene.actorIds.includes(actorId))) { return true; } - if (alert.tags.some((tagId) => scene.tagIds.includes(tagId))) { + if (alert.tags.length > 0 && alert.tags[alert.allTags ? 'every' : 'some']((tagId) => scene.tagIds.includes(tagId))) { return true; } // multiple entities can only be matched in OR mode - if (alert.entities.some((alertEntityId) => alertEntityId === scene.entityId || alertEntityId === scene.parentEntityId)) { + if (alert.entities.length > 0 && alert.entities.some((alertEntityId) => alertEntityId === scene.entityId || alertEntityId === scene.parentEntityId)) { return true; } - if (alert.matches.some((match) => match.expression.test(scene[match.property]))) { + if (alert.matches.length > 0 && alert.matches[alert.allMatches ? 'every' : 'some']((match) => match.expression.test(scene[match.property]))) { return true; }