From a30784c9d72655bc4249eaece41bf87f0c11c65b Mon Sep 17 00:00:00 2001 From: Alf <2608282+alfw@users.noreply.github.com> Date: Thu, 12 Sep 2024 04:05:44 +0200 Subject: [PATCH] feat: add more events to Effect Queue (#2785) * feat: added new events for queue status and new entry * feat: added filter option for effect queue name is or is not * fix: clean up debug code and error message * fix(effect-queue-status): fixed return type --- .../effects/queues/effect-queue-runner.js | 14 ++++++ .../events/builtin/firebot-event-source.js | 19 ++++++++ .../events/filters/builtin-filter-loader.js | 1 + .../events/filters/builtin/effect-queue.js | 46 +++++++++++++++++++ .../builtin/metadata/effect-queue-id.ts | 2 +- .../builtin/metadata/effect-queue-name.ts | 2 +- .../builtin/metadata/effect-queue-status.ts | 26 +++++++++++ .../variables/builtin/metadata/index.ts | 2 + 8 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 src/backend/events/filters/builtin/effect-queue.js create mode 100644 src/backend/variables/builtin/metadata/effect-queue-status.ts diff --git a/src/backend/effects/queues/effect-queue-runner.js b/src/backend/effects/queues/effect-queue-runner.js index b274ab262..6c7c0d95d 100644 --- a/src/backend/effects/queues/effect-queue-runner.js +++ b/src/backend/effects/queues/effect-queue-runner.js @@ -142,6 +142,10 @@ class EffectQueue { logger.debug(`Added more effects to queue ${this.id}. Current length=${this._queue.length}`); + eventManager.triggerEvent("firebot", "effect-queue-added", { + effectQueueId: this.id + }); + this.sendQueueLengthUpdate(); this.processEffectQueue(); @@ -169,11 +173,21 @@ class EffectQueue { pauseQueue() { logger.debug(`Pausing queue ${this.id}...`); + + eventManager.triggerEvent("firebot", "effect-queue-status", { + effectQueueId: this.id + }); + this._paused = true; } resumeQueue() { logger.debug(`Resuming queue ${this.id}...`); + + eventManager.triggerEvent("firebot", "effect-queue-status", { + effectQueueId: this.id + }); + this._paused = false; this.processEffectQueue(); } diff --git a/src/backend/events/builtin/firebot-event-source.js b/src/backend/events/builtin/firebot-event-source.js index 3487885fb..41603ab88 100644 --- a/src/backend/events/builtin/firebot-event-source.js +++ b/src/backend/events/builtin/firebot-event-source.js @@ -113,6 +113,25 @@ const firebotEventSource = { queueName: "Just Chatting" } }, + { + id: "effect-queue-added", + name: "Effect Queue Added", + description: "When an new entry added to effect queue.", + cached: false, + manualMetadata: { + queueName: "Just Chatting" + } + }, + { + id: "effect-queue-status", + name: "Effect Queue Status", + description: "When an effect queue status changes.", + cached: false, + manualMetadata: { + queueName: "Just Chatting", + status: "paused" + } + }, { id: "before-firebot-closed", name: "Before Firebot Closed", diff --git a/src/backend/events/filters/builtin-filter-loader.js b/src/backend/events/filters/builtin-filter-loader.js index aa13ef3be..5cfea24cd 100644 --- a/src/backend/events/filters/builtin-filter-loader.js +++ b/src/backend/events/filters/builtin-filter-loader.js @@ -13,6 +13,7 @@ exports.loadFilters = () => { 'custom-variable-name', 'donation-amount', 'donation-from', + 'effect-queue', 'gift-count', 'gift-duration', 'is-anonymous', diff --git a/src/backend/events/filters/builtin/effect-queue.js b/src/backend/events/filters/builtin/effect-queue.js new file mode 100644 index 000000000..b17d9c77a --- /dev/null +++ b/src/backend/events/filters/builtin/effect-queue.js @@ -0,0 +1,46 @@ +"use strict"; + +module.exports = { + id: "firebot:effect-queue", + name: "Effect Queue", + description: "Filter to a Effect Queue", + events: [ + { eventSourceId: "firebot", eventId: "effect-queue-added" }, + { eventSourceId: "firebot", eventId: "effect-queue-cleared" }, + { eventSourceId: "firebot", eventId: "effect-queue-status" } + ], + comparisonTypes: ["is", "is not"], + valueType: "preset", + presetValues: (effectQueuesService) => { + return effectQueuesService.getEffectQueues().map((c) => ({ value: c.id, display: c.name })); + }, + valueIsStillValid: (filterSettings, effectQueuesService) => { + return new Promise((resolve) => { + resolve(effectQueuesService.getEffectQueues().some((c) => c.id === filterSettings.value)); + }); + }, + getSelectedValueDisplay: (filterSettings, effectQueuesService) => { + return new Promise((resolve) => { + resolve( + effectQueuesService.getEffectQueues().find((c) => c.id === filterSettings.value)?.name ?? + "Unknown Effect Queue" + ); + }); + }, + predicate: (filterSettings, eventData) => { + const { comparisonType, value } = filterSettings; + const { eventMeta } = eventData; + + const actual = eventMeta.effectQueueId; + const expected = value; + + switch (comparisonType) { + case "is": + return actual === expected; + case "is not": + return actual !== expected; + default: + return false; + } + } +}; diff --git a/src/backend/variables/builtin/metadata/effect-queue-id.ts b/src/backend/variables/builtin/metadata/effect-queue-id.ts index 9b049ec22..c5d0328d4 100644 --- a/src/backend/variables/builtin/metadata/effect-queue-id.ts +++ b/src/backend/variables/builtin/metadata/effect-queue-id.ts @@ -3,7 +3,7 @@ import { EffectTrigger } from "../../../../shared/effect-constants"; import { OutputDataType, VariableCategory } from "../../../../shared/variable-constants"; const triggers = {}; -triggers[EffectTrigger.EVENT] = ["firebot:effect-queue-cleared"]; +triggers[EffectTrigger.EVENT] = ["firebot:effect-queue-cleared", "firebot:effect-queue-added", "firebot:effect-queue-status"]; triggers[EffectTrigger.MANUAL] = true; const model: ReplaceVariable = { diff --git a/src/backend/variables/builtin/metadata/effect-queue-name.ts b/src/backend/variables/builtin/metadata/effect-queue-name.ts index f1aa50cf0..ebe4e5aff 100644 --- a/src/backend/variables/builtin/metadata/effect-queue-name.ts +++ b/src/backend/variables/builtin/metadata/effect-queue-name.ts @@ -4,7 +4,7 @@ import { OutputDataType, VariableCategory } from "../../../../shared/variable-co import effectQueueManager from "../../../effects/queues/effect-queue-manager"; const triggers = {}; -triggers[EffectTrigger.EVENT] = ["firebot:effect-queue-cleared"]; +triggers[EffectTrigger.EVENT] = ["firebot:effect-queue-cleared", "firebot:effect-queue-added", "firebot:effect-queue-status"]; triggers[EffectTrigger.MANUAL] = true; const model: ReplaceVariable = { diff --git a/src/backend/variables/builtin/metadata/effect-queue-status.ts b/src/backend/variables/builtin/metadata/effect-queue-status.ts new file mode 100644 index 000000000..34c1637dd --- /dev/null +++ b/src/backend/variables/builtin/metadata/effect-queue-status.ts @@ -0,0 +1,26 @@ +import { ReplaceVariable } from "../../../../types/variables"; +import { EffectTrigger } from "../../../../shared/effect-constants"; +import { OutputDataType, VariableCategory } from "../../../../shared/variable-constants"; +import effectQueueManager from "../../../effects/queues/effect-queue-manager"; + +const triggers = {}; +triggers[EffectTrigger.EVENT] = ["firebot:effect-queue-cleared", "firebot:effect-queue-added", "firebot:effect-queue-status"]; +triggers[EffectTrigger.MANUAL] = true; + +const model: ReplaceVariable = { + definition: { + handle: "effectQueueStatus", + description: "The status of the effect queue.", + triggers: triggers, + categories: [VariableCategory.TRIGGER], + possibleDataOutput: [OutputDataType.BOOLEAN, OutputDataType.NULL] + }, + evaluator: (trigger) => { + const queueId = trigger?.metadata?.eventData?.effectQueueId; + const effectQueue = effectQueueManager.getItem(queueId); + + return effectQueue?.active ?? null; + } +}; + +export default model; \ No newline at end of file diff --git a/src/backend/variables/builtin/metadata/index.ts b/src/backend/variables/builtin/metadata/index.ts index a60a71f86..c04face94 100644 --- a/src/backend/variables/builtin/metadata/index.ts +++ b/src/backend/variables/builtin/metadata/index.ts @@ -7,6 +7,7 @@ import count from './count'; import effectOutput from './effect-output'; import effectQueueId from './effect-queue-id'; import effectQueueName from './effect-queue-name'; +import effectQueueStatus from './effect-queue-status'; import overlayInstance from './overlay-instance'; import presetListArg from './preset-list-arg'; import user from './user'; @@ -26,6 +27,7 @@ export default [ effectOutput, effectQueueId, effectQueueName, + effectQueueStatus, overlayInstance, presetListArg, user,