Skip to content

Commit 2c2d9ae

Browse files
authored
Merge pull request #3363 from crowbartools/v5
5.65.0 Release
2 parents 19a336e + 78b365a commit 2c2d9ae

30 files changed

Lines changed: 346 additions & 183 deletions

File tree

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "firebotv5",
3-
"version": "5.65.0-beta2",
3+
"version": "5.65.0",
44
"description": "Powerful all-in-one bot for Twitch streamers.",
55
"main": "build/main.js",
66
"scripts": {

src/backend/common/handlers/custom-scripts/custom-script-helpers.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ class ScriptWebhookManager extends EventEmitter {
2424
this.scriptName = scriptName;
2525
this.setMaxListeners(0);
2626

27-
webhookManager.on("webhook-received", ({ config, payload, headers }) => {
28-
if (config.scriptId !== this.scriptName) {
27+
webhookManager.on("webhook-received", (data) => {
28+
if (data.config.scriptId !== this.scriptName) {
2929
return;
3030
}
31-
this.emit("webhook-received", { config, payload, headers });
31+
this.emit("webhook-received", data);
3232
});
3333
}
3434

src/backend/common/handlers/sound-handler.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export async function playSound(soundData: {
7171

7272
// Set output device.
7373
let selectedOutputDevice = soundData.audioOutputDevice;
74-
if (selectedOutputDevice?.deviceId == null) {
74+
if (selectedOutputDevice?.deviceId == null || selectedOutputDevice.deviceId === "") {
7575
selectedOutputDevice = SettingsManager.getSetting("AudioOutputDevice");
7676
}
7777
data.audioOutputDevice = selectedOutputDevice;

src/backend/events/builtin/firebot-event-source.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,8 @@ export const FirebotEventSource: EventSource = {
170170
webhookName: "Test Webhook",
171171
webhookPayload: {
172172
foo: "bar"
173-
}
173+
},
174+
webhookRawPayload: "{ \"foo\": \"bar\" }"
174175
}
175176
},
176177
{

src/backend/events/events-access.ts

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import { join } from "path";
22

3-
import type { EventGroup, EventSettings } from "../../types/events";
4-
import type { SortTag } from "../../types/sort-tags";
3+
import type {
4+
EventGroup,
5+
EventSettings,
6+
SortTag
7+
} from "../../types";
58

69
import { ProfileManager } from "../common/profile-manager";
10+
import { SettingsManager } from "../common/settings-manager";
711
import frontendCommunicator from "../common/frontend-communicator";
812
import logger from "../logwrapper";
913

@@ -90,6 +94,10 @@ class EventsAccess {
9094
this._groups[group.id] = group;
9195
eventsDb.push(`/groups/${group.id}`, group);
9296
logger.debug(`Saved event group '${group.id}'.`);
97+
98+
this.rebuildSettings();
99+
100+
frontendCommunicator.send("event-access:event-set-saved", this._groups[group.id]);
93101
} catch (err) {
94102
logger.warn(`Unable to save event group '${group.id}'.`, err);
95103
}
@@ -104,11 +112,51 @@ class EventsAccess {
104112
this._groups = groupsToSave;
105113
eventsDb.push("/groups", groupsToSave);
106114
logger.debug(`Saved all groups.`);
115+
116+
this.rebuildSettings();
117+
118+
frontendCommunicator.send("event-access:all-event-sets-saved", this._groups);
107119
} catch (err) {
108120
logger.warn(`Unable to save groups.`, err);
109121
}
110122
}
111123

124+
private rebuildSettings() {
125+
const settings = SettingsManager.getSetting("EventSetSettings");
126+
127+
// Remove stale items
128+
const settingsKeys = Object.keys(settings);
129+
for (const set of settingsKeys) {
130+
if (!this._groups[set]) {
131+
delete settings[set];
132+
}
133+
}
134+
135+
// Renumber
136+
const totalSettings = Object.keys(settings).length;
137+
const sortedSettings = Object.keys(settings)
138+
.map(key => ({
139+
id: key,
140+
position: settings[key].position
141+
}))
142+
.sort((a, b) => a.position - b.position);
143+
for (let i = 0; i < totalSettings; i++) {
144+
settings[sortedSettings[i].id].position = i;
145+
}
146+
147+
// Add missing items
148+
for (const item of Object.values(this._groups)) {
149+
if (!settings[item.id]) {
150+
settings[item.id] = {
151+
position: Object.keys(settings).length
152+
};
153+
}
154+
}
155+
156+
SettingsManager.saveSetting("EventSetSettings", settings);
157+
frontendCommunicator.send("event-access:event-set-settings-updated", settings);
158+
}
159+
112160
removeEventFromGroups(eventId: string): void {
113161
for (const group in this._groups) {
114162
if (this._groups.hasOwnProperty(group)) {
@@ -162,6 +210,8 @@ class EventsAccess {
162210
this._sortTags = eventsData.sortTags;
163211
}
164212

213+
this.rebuildSettings();
214+
165215
logger.debug(`Loaded event data.`);
166216
} catch (err) {
167217
logger.warn(`There was an error reading events data file.`, err);
@@ -177,6 +227,10 @@ class EventsAccess {
177227
eventsDb.delete(`/groups/${groupId}`);
178228
delete this._groups[groupId];
179229
logger.debug(`Deleted event group '${groupId}'.`);
230+
231+
this.rebuildSettings();
232+
233+
frontendCommunicator.send("event-access:event-set-deleted", groupId);
180234
} catch (err) {
181235
logger.warn(`Unable to delete event group '${groupId}'.`, err);
182236
}

src/backend/logwrapper.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { createLogger, format, transports } from "winston";
22
import "winston-daily-rotate-file";
33
import Transport from "winston-transport";
44
import { TransformableInfo } from "logform";
5+
import { app } from "electron";
6+
import os from "os";
57
import fs from "fs";
68
import { getPathInUserData, getJsonDbInUserData } from "./common/data-access";
79
import frontendCommunicator from "./common/frontend-communicator";
@@ -65,6 +67,16 @@ function getLogFormat(addMetadataToMessage = true) {
6567
);
6668
}
6769

70+
const rotatingFileTransport = new transports.DailyRotateFile({
71+
format: getLogFormat(),
72+
level: fileLogLevel,
73+
dirname: LOG_FOLDER,
74+
filename: "%DATE%.log",
75+
datePattern: "YYYY-MM-DD",
76+
maxFiles: "7d",
77+
utc: true
78+
});
79+
6880
const logger = createLogger({
6981
level: "silly",
7082
exitOnError: false,
@@ -83,18 +95,15 @@ const logger = createLogger({
8395
),
8496
level: "silly"
8597
}),
86-
new transports.DailyRotateFile({
87-
format: getLogFormat(),
88-
level: fileLogLevel,
89-
dirname: LOG_FOLDER,
90-
filename: "%DATE%.log",
91-
datePattern: "YYYY-MM-DD",
92-
maxFiles: "7d",
93-
utc: true
94-
})
98+
rotatingFileTransport
9599
]
96100
});
97101

102+
rotatingFileTransport.on("rotate", () => {
103+
logger.info("Log rotated");
104+
logger.info(`Firebot v${app.getVersion()}; Platform: ${os.platform()} ${os.arch()}; Version: ${os.type()} ${os.release()}`);
105+
});
106+
98107
process.on("uncaughtException", error => logger.error("Uncaught exception", error));
99108
process.on("unhandledRejection", error => logger.error("Unhandled promise rejection", error));
100109

src/backend/variables/builtin/metadata/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import webhookHeaders from './webhook-headers';
2424
import webhookId from './webhook-id';
2525
import webhookName from './webhook-name';
2626
import webhookPayload from './webhook-payload';
27+
import webhookRawPayload from './webhook-raw-payload';
2728

2829
export default [
2930
arg,
@@ -51,5 +52,6 @@ export default [
5152
webhookHeaders,
5253
webhookId,
5354
webhookName,
54-
webhookPayload
55+
webhookPayload,
56+
webhookRawPayload
5557
];
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { createEventDataVariable } from "../../variable-factory";
2+
3+
export default createEventDataVariable({
4+
handle: "webhookRawPayload",
5+
description: "The raw payload of the webhook",
6+
events: ["firebot:webhook-received"],
7+
type: "text",
8+
eventMetaKey: "webhookRawPayload"
9+
});

src/backend/webhooks/webhook-config-manager.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@ import logger from "../logwrapper";
1010
import { maskPII } from "../utils";
1111

1212
type ExtraEvents = {
13-
"webhook-received": (data: { config: WebhookConfig, payload: unknown, headers: Record<string, string> }) => void;
13+
"webhook-received": (data: {
14+
config: WebhookConfig,
15+
payload: unknown,
16+
rawPayload?: string,
17+
headers: Record<string, string>
18+
}) => void;
1419
};
1520

1621
class WebhookConfigManager extends JsonDbManager<WebhookConfig, ExtraEvents> {
@@ -37,7 +42,12 @@ class WebhookConfigManager extends JsonDbManager<WebhookConfig, ExtraEvents> {
3742
logger.debug("Webhook received:", maskPII(msg.data));
3843
}
3944

40-
const data = msg.data as { webhookId: string, payload: unknown, headers: Record<string, string> };
45+
const data = msg.data as {
46+
webhookId: string,
47+
payload: unknown,
48+
rawPayload?: string,
49+
headers: Record<string, string>
50+
};
4151

4252
const webhookConfig = this.getItem(data.webhookId);
4353
if (!webhookConfig) {
@@ -55,13 +65,15 @@ class WebhookConfigManager extends JsonDbManager<WebhookConfig, ExtraEvents> {
5565
this.emit("webhook-received", {
5666
config: webhookConfig,
5767
payload,
68+
rawPayload: data.rawPayload,
5869
headers: data.headers ?? {}
5970
});
6071

6172
void EventManager.triggerEvent("firebot", "webhook-received", {
6273
webhookId: webhookConfig.id,
6374
webhookName: webhookConfig.name,
6475
webhookPayload: payload,
76+
webhookRawPayload: data.rawPayload,
6577
webhookHeaders: data.headers ?? {}
6678
});
6779

0 commit comments

Comments
 (0)