diff --git a/package-lock.json b/package-lock.json index 1f751b2e0..7b57e3fdf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -97,6 +97,7 @@ "@types/fs-extra": "^11.0.4", "@types/luxon": "^3.1.0", "@types/node": "^18.18.2", + "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "electron": "^28.2.3", @@ -2545,6 +2546,12 @@ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.8.tgz", "integrity": "sha512-7axfYN8SW9pWg78NgenHasSproWQee5rzyPVLC9HpaQSDgNArsnKJD88EaMfi4Pl48AyciO3agYCFqpHS1gLpg==" }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true + }, "node_modules/@types/ws": { "version": "8.5.10", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", diff --git a/package.json b/package.json index 363b43eee..0c3e2b043 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@types/fs-extra": "^11.0.4", "@types/luxon": "^3.1.0", "@types/node": "^18.18.2", + "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "electron": "^28.2.3", diff --git a/src/backend/effects/builtin-effect-loader.js b/src/backend/effects/builtin-effect-loader.js index 2a430d70f..8e75c39ae 100644 --- a/src/backend/effects/builtin-effect-loader.js +++ b/src/backend/effects/builtin-effect-loader.js @@ -5,6 +5,7 @@ const effectManager = require("./effectManager"); exports.loadEffects = () => { [ 'active-user-lists', + 'activity-feed-alert', 'add-quote', 'api', 'block-unblock', diff --git a/src/backend/effects/builtin/activity-feed-alert.ts b/src/backend/effects/builtin/activity-feed-alert.ts new file mode 100644 index 000000000..142105c27 --- /dev/null +++ b/src/backend/effects/builtin/activity-feed-alert.ts @@ -0,0 +1,76 @@ +import { EffectType } from "../../../types/effects"; +import { EffectCategory } from "../../../shared/effect-constants"; +import { handleTriggeredEvent } from "../../events/activity-feed-manager"; + +const effect: EffectType<{ + message: string; + icon: string; +}> = { + definition: { + id: "firebot:activity-feed-alert", + name: "Activity Feed Alert", + description: "Display an alert in Firebot's activity feed", + icon: "fad fa-comment-exclamation", + categories: [EffectCategory.FUN], + dependencies: [] + }, + optionsTemplate: ` + +

Use this effect to send yourself alerts in Firebot's activity feed.

+
+ + + + + + + `, + optionsController: () => { }, + optionsValidator: (effect) => { + const errors = []; + if (effect.message == null || effect.message === "") { + errors.push("Alert message can't be blank."); + } + return errors; + }, + onTriggerEvent: async ({ effect }) => { + handleTriggeredEvent( + { + id: "firebot", + name: "Firebot" + }, + { + id: "activity-feed-alert", + name: "Activity Feed Alert", + activityFeed: { + icon: effect.icon || "fad fa-comment-exclamation", + getMessage: () => { + return effect.message; + } + } + }, + { + username: "firebot" + }, + { + forceAllow: true, + canRetrigger: false + }); + + return true; + } +}; + +module.exports = effect; diff --git a/src/backend/events/activity-feed-manager.js b/src/backend/events/activity-feed-manager.js index 1de6dd738..c69196e0f 100644 --- a/src/backend/events/activity-feed-manager.js +++ b/src/backend/events/activity-feed-manager.js @@ -12,7 +12,7 @@ const timeFormat = isUSLocale ? "h:mm" : "H:mm"; const previousActivity = []; -function handleTriggeredEvent(source, event, metadata) { +export function handleTriggeredEvent(source, event, metadata, eventSettings = { forceAllow: false, canRetrigger: true }) { if (source == null || event == null || metadata == null) { return; } @@ -44,7 +44,8 @@ function handleTriggeredEvent(source, event, metadata) { }, event: { id: event.id, - name: event.name + name: event.name, + ...eventSettings }, message: event.activityFeed.getMessage(metadata), icon: event.activityFeed.icon, diff --git a/src/gui/app/services/activity-feed.service.js b/src/gui/app/services/activity-feed.service.js index dff2bdbbf..97cc0ccda 100644 --- a/src/gui/app/services/activity-feed.service.js +++ b/src/gui/app/services/activity-feed.service.js @@ -24,7 +24,7 @@ } const allowedEvents = settingsService.getAllowedActivityEvents(); - if (!allowedEvents.includes(`${activity.source.id}:${activity.event.id}`)) { + if (!activity.event.forceAllow && !allowedEvents.includes(`${activity.source.id}:${activity.event.id}`)) { return; } @@ -42,13 +42,13 @@ }; service.markAllAcknowledged = () => { - service.allActivities.forEach(a => { + service.allActivities.forEach((a) => { a.acknowledged = true; }); }; service.markAllNotAcknowledged = () => { - service.allActivities.forEach(a => { + service.allActivities.forEach((a) => { a.acknowledged = false; }); }; diff --git a/src/gui/app/templates/chat/_chat-messages.html b/src/gui/app/templates/chat/_chat-messages.html index db5bd928a..4c92a4bfd 100644 --- a/src/gui/app/templates/chat/_chat-messages.html +++ b/src/gui/app/templates/chat/_chat-messages.html @@ -270,6 +270,7 @@