Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
f3f95ae
5.65.5
zunderscore Jan 27, 2026
896d60d
feat(events): OBS Exiting
zunderscore Jan 27, 2026
282a120
fix(quotes): ID recalc increment value (#3429)
zunderscore Jan 28, 2026
8d51595
fix: corrupt settings repair (#3432)
dennisrijsdijk Feb 3, 2026
492974f
Fix timeout duration description to specify seconds
GrandpaCelery Feb 3, 2026
57b6cbd
Merge pull request #3433 from dennisrijsdijk/fix/3432-corrupt-settings
zunderscore Feb 3, 2026
28befdc
Merge branch 'v5' into patch-1
zunderscore Feb 3, 2026
40abb83
Merge pull request #3434 from GrandpaCelery/patch-1
zunderscore Feb 3, 2026
3767bf3
feat(events): OBS Scene Item List Reindexed
zunderscore Feb 3, 2026
3e0741b
Merge branch 'v5' of https://github.com/crowbartools/Firebot into v5
zunderscore Feb 3, 2026
dbc9da7
fix: use computed baseUrl in overlay effects/widgets
zunderscore Mar 14, 2026
bffc62a
fix: listen to user:offline event to individually mark viewers offline
servusrene Mar 15, 2026
731c105
Merge pull request #3457 from servusrene/v5
zunderscore Mar 26, 2026
91997b7
feat(widgets): Chat widget (#3272)
zunderscore Apr 28, 2026
8ede6f1
feat(widgets): Chat widget user filter, message timeout, delay
zunderscore Apr 28, 2026
ed3706e
feat(chat): assign random user color when not specified
zunderscore Apr 29, 2026
2791951
feat(widgets): chat widget third-party emotes
zunderscore Apr 29, 2026
336dde6
fix: clientside handling of relay websocket pings
dennisrijsdijk Apr 30, 2026
eff296f
Merge pull request #3475 from dennisrijsdijk/fix/relay-websocket-ping…
zunderscore May 1, 2026
017ab13
fix(widgets): chat widget HTML gen
zunderscore May 2, 2026
4cbb466
chore(pronouns, vars): pronoun manager, refactor pronouns var
zunderscore May 2, 2026
5899e97
feat(widgets): chat widget pronouns
zunderscore May 2, 2026
242a983
fix: missing utils.stylesToString() in custom-advanced widgets (#3479)
Alastor-git May 2, 2026
e82e8bf
Merge pull request #3480 from Alastor-git/fix/3479-Custom-advanced-wi…
zunderscore May 2, 2026
64616f5
fix: currency restriction message
dennisrijsdijk May 2, 2026
0845f5c
Merge branch 'v5' into fix/restriction-messages
zunderscore May 2, 2026
3e4df57
Merge pull request #3481 from dennisrijsdijk/fix/restriction-messages
zunderscore May 2, 2026
8138848
feat(commands): show description tooltip in command list (#1946)
zunderscore May 3, 2026
42fa6fe
Merge branch 'v5' of https://github.com/crowbartools/Firebot into v5
zunderscore May 3, 2026
44c80df
chore(widgets): refactor chat widget HTML gen
zunderscore May 3, 2026
5557ef5
fix: linting
zunderscore May 3, 2026
293fb83
feat(widgets): chat widget shared chat avatar option
zunderscore May 4, 2026
d029a08
fix(widgets): chat widget remove message when no exit animation
zunderscore May 4, 2026
79b697f
chore: add vs code settings to use workspace ts
ebiggz May 9, 2026
9a6ad58
feat: module import for overlayExtension js dependencies (#3482)
dennisrijsdijk May 9, 2026
476950b
fix(hotkeys): hotkeys not functioning in Wayland sessions
ebiggz May 9, 2026
c7dff26
feat: high-resolution emote images for BTTV and FFZ (#3487)
dennisrijsdijk May 9, 2026
7ac89f1
feat(events): watch streaks (#2960)
zunderscore May 11, 2026
9c1af72
5.66.0
zunderscore May 11, 2026
0e3f09c
chore: Electron 41.5.1
zunderscore May 11, 2026
513e195
chore: Electron 42.0.1
zunderscore May 11, 2026
dcb8929
fix(widgets): chat widget pronoun text color
zunderscore May 11, 2026
7aba4f0
fix(chat): send watch streak message to frontend
zunderscore May 11, 2026
1213e59
fix(widgets): Chat widget minor cleanup
zunderscore May 11, 2026
a7f017c
feat(widgets): Chat (Advanced)
zunderscore May 12, 2026
feadc89
feat: custom power-ups (#3490)
ebiggz May 12, 2026
b07ab82
fix(power-ups): manual redemption add subscription broken after Twurp…
ebiggz May 12, 2026
1ac26a4
fix(power-ups): ensure username variable can be used in power ups
ebiggz May 12, 2026
8a9578c
fix: add modal breadcrumb names for edit channel reward and power up …
ebiggz May 12, 2026
89b485b
chore: color tweak for power up prompt text
ebiggz May 12, 2026
8f5f180
fix(vars): rename powerUpBits to powerUpCost
zunderscore May 13, 2026
65b2e3a
Merge branch 'v5' of https://github.com/crowbartools/Firebot into v5
zunderscore May 13, 2026
eb7877a
Merge branch 'v5' into feat/3487-bttv-ffz-highres
zunderscore May 13, 2026
07f8d3a
Merge pull request #3488 from dennisrijsdijk/feat/3487-bttv-ffz-highres
zunderscore May 13, 2026
bfd0699
Merge branch 'v5' into feat/3482-overlay-js-dependency-modules
zunderscore May 13, 2026
be3c041
Merge pull request #3485 from dennisrijsdijk/feat/3482-overlay-js-dep…
zunderscore May 13, 2026
bc881c9
fix: remove pause/unpaused header for power-ups since there's no way …
ebiggz May 13, 2026
f31eec1
chore(power-ups): update Power-Up UI casing to match Twitch
zunderscore May 13, 2026
c8ce855
Revert "chore(power-ups): update Power-Up UI casing to match Twitch"
zunderscore May 13, 2026
05ece14
chore(power-ups): remove restrictions
zunderscore May 13, 2026
065667d
fix(rewards): remove broadcasterType check for redemptions
zunderscore May 14, 2026
1b8554b
fix(events): Alca's user ID ❤️
zunderscore May 14, 2026
0a1ce1f
fix(chat): send watch streak message to frontend
zunderscore May 15, 2026
cfeed07
fix: viewer export columns (#3401)
zunderscore May 15, 2026
4a13117
chore(chat): refactor chat helpers
zunderscore May 15, 2026
2dcbe26
fix(pronouns): singular-only friendly string
zunderscore May 15, 2026
5dad113
feat(effects): clip duration/title (#3447)
zunderscore May 15, 2026
6cbdda9
fix(widgets): HTML escape chat messages
zunderscore May 16, 2026
041eee7
chore: move SnakeCased type to shared util types
zunderscore May 16, 2026
7dc0eff
fix: cheerMote detection in cheerMessage
dennisrijsdijk May 16, 2026
694089c
chore(widgets): move chat HTML escape to backend
zunderscore May 17, 2026
85c8cf1
feat(widgets): add clear chat widget UI action
zunderscore May 17, 2026
15b9258
chore(widgets): chat widget linting
zunderscore May 17, 2026
d0b3a2c
chore(effects): hide/deprecate Random/Sequential effects
zunderscore May 17, 2026
19e4777
chore(scripts): remove fs-extra from custom scripts
zunderscore May 17, 2026
bcfd174
chore(effects): move Random/Sequential to deprecated folder
zunderscore May 17, 2026
4a7a494
chore(effects): add deprecated flag/UI badge
zunderscore May 17, 2026
0386416
chore(effects): new Show Text effect, deprecate old version
zunderscore May 17, 2026
323c76e
chore(vars): add expressionish postProcessVariable
zunderscore May 18, 2026
960f811
fix(effects): HTML encode evaluated vars in Overlay Alert
zunderscore May 18, 2026
1e6077e
fix(effects): HTML encode evaluated vars in legacy Show Text
zunderscore May 18, 2026
a57b9e4
feat(vars): $chatMessageHtml
zunderscore May 19, 2026
66c3260
fix: cheermotes in simulate
dennisrijsdijk May 19, 2026
b1082f8
restore default string for messageText
dennisrijsdijk May 19, 2026
3f758ac
Merge branch 'v5' into fix/cheermessage-cheermote-detection
zunderscore May 19, 2026
c7c48be
move bitsuse message part to private type mirror
dennisrijsdijk May 19, 2026
6336134
Merge pull request #3494 from dennisrijsdijk/fix/cheermessage-cheermo…
zunderscore May 19, 2026
a66ab30
fix: Linux build prep
zunderscore May 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/compile-and-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,9 @@ jobs:

- name: Linux Build Prep
if: runner.os == 'linux'
run: sudo apt-get install libx11-dev libxtst-dev libpng-dev
run: |
sudo apt-get update
sudo apt-get install libx11-dev libxtst-dev libpng-dev

- name: MacOS Build Prep
if: runner.os == 'macOS'
Expand Down
6 changes: 4 additions & 2 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,7 @@
"prettier.trailingComma": "none",
"[scss]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}
},
"js/ts.tsdk.path": "node_modules/typescript/lib",
"js/ts.tsdk.promptToUseWorkspaceVersion": true
}
524 changes: 269 additions & 255 deletions package-lock.json

Large diffs are not rendered by default.

13 changes: 5 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "firebotv5",
"version": "5.65.4",
"version": "5.66.0",
"description": "Powerful all-in-one bot for Twitch streamers.",
"main": "build/main.js",
"scripts": {
Expand Down Expand Up @@ -35,7 +35,7 @@
"@types/unzipper": "^0.10.11",
"@types/yargs-parser": "^21.0.3",
"@typescript-eslint/parser": "^8.46.0",
"electron": "^39.2.4",
"electron": "^42.0.1",
"electron-installer-dmg": "^5.0.1",
"electron-winstaller": "^5.4.0",
"eslint": "^9.37.0",
Expand All @@ -54,10 +54,8 @@
"dependencies": {
"@aws-sdk/client-polly": "^3.26.0",
"@seald-io/nedb": "^4.0.4",
"@twurple/api": "^8.0.3",
"@twurple/auth": "^8.0.3",
"@twurple/chat": "^8.0.3",
"@twurple/eventsub-ws": "^8.0.3",
"@twurple/chat": "^8.1.4",
"@twurple/eventsub-ws": "^8.1.4",
"@types/tinycolor2": "^1.4.6",
"@zunderscore/elgato-light-control": "^1.2.0",
"angular": "^1.8.0",
Expand Down Expand Up @@ -93,11 +91,10 @@
"escape-html": "^1.0.3",
"eventsource": "^1.0.7",
"express": "^5.1.0",
"expressionish": "github:SReject/expressionish#ab800d753263d46990c8ad5ba1459c366c1acca9",
"expressionish": "github:SReject/expressionish#27f38753346b60c5a09d69ebe407bf70583eec2d",
"extra-life-ts": "^0.4.0",
"firebot-nutjs": "github:crowbartools/firebot-nutjs#f52581d4c4426cf7f4dcc2b0d26cf56777e115f8",
"form-data": "^4.0.5",
"fs-extra": "^11.2.0",
"fuse.js": "^7.1.0",
"glob": "^10.3.10",
"he": "^1.2.0",
Expand Down
23 changes: 13 additions & 10 deletions src/backend/app-management/electron/events/when-ready.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import frontendCommunicator from "../../../common/frontend-communicator";
import logger from "../../../logwrapper";

export async function whenReady() {

logger.debug("...Applying IPC events");
const { setupIpcEvents } = await import("./ipc-events");
setupIpcEvents();
Expand All @@ -23,6 +22,10 @@ export async function whenReady() {
const { ensureRequiredFoldersExist } = await import("../../data-tasks");
await ensureRequiredFoldersExist();

windowManagement.updateSplashScreenStatus("Loading pronoun cache...");
const { FirebotPronounManager } = await import("../../../pronouns/pronoun-manager");
await FirebotPronounManager.cachePronouns();

// load twitch auth
windowManagement.updateSplashScreenStatus("Loading Twitch login system...");
await import("../../../auth/auth-manager");
Expand Down Expand Up @@ -52,8 +55,7 @@ export async function whenReady() {

windowManagement.updateSplashScreenStatus("Refreshing Twitch account data...");

// Loading these first so that the refresh caches the account avatar URLs
const _chatHelpers = await import("../../../chat/chat-helpers");
// Loading this first so that the refresh caches the account avatar URLs
const _eventSubChatHelpers = await import("../../../streaming-platforms/twitch/api/eventsub/eventsub-chat-helpers");

const { TwitchApi } = await import("../../../streaming-platforms/twitch/api");
Expand Down Expand Up @@ -263,6 +265,10 @@ export async function whenReady() {
const channelRewardManager = (await import("../../../channel-rewards/channel-reward-manager")).default;
await channelRewardManager.loadChannelRewards();

windowManagement.updateSplashScreenStatus("Loading power-ups...");
const powerUpsManager = (await import("../../../power-ups/power-ups-manager")).default;
await powerUpsManager.loadPowerUps();

// load activity feed manager
await import("../../../events/activity-feed-manager");

Expand All @@ -283,19 +289,16 @@ export async function whenReady() {
// start crowbar relay websocket
await import("../../../crowbar-relay/crowbar-relay-websocket");

const countdownManager = (await import("../../../overlay-widgets/builtin-types/countdown/countdown-manager")).default;
const countdownManager = (await import("../../../overlay-widgets/builtin-types/countdown/countdown-manager"))
.default;
countdownManager.startTimer();

logger.debug("...loading main window");
windowManagement.updateSplashScreenStatus("Here we go!");
await windowManagement.createMainWindow();

// Receive log messages from frontend
frontendCommunicator.on("logging", (data: {
level: string;
message: string;
meta?: unknown[];
}) => {
frontendCommunicator.on("logging", (data: { level: string, message: string, meta?: unknown[] }) => {
logger.log(data.level, data.message, ...(data.meta ?? []));
});
};
}
5 changes: 1 addition & 4 deletions src/backend/channel-rewards/channel-reward-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class ChannelRewardManager {
TwitchApi.channelRewards.getTotalChannelRewardCount);

frontendCommunicator.on("get-channel-rewards", () => Object.values(this.channelRewards));
frontendCommunicator.onAsync("get-channel-rewards", async () => Object.values(this.channelRewards));

frontendCommunicator.on("get-channel-rewards-eligibility", () => this._eligible);

Expand Down Expand Up @@ -432,10 +433,6 @@ class ChannelRewardManager {
}

async refreshChannelRewardRedemptions(): Promise<void> {
if (AccountAccess.getAccounts().streamer.broadcasterType === "") {
return;
}

this._channelRewardRedemptions = await TwitchApi.channelRewards.getOpenChannelRewardRedemptions();

frontendCommunicator.send("channel-reward-redemptions-updated", this.getChannelRewardRedemptions());
Expand Down
6 changes: 3 additions & 3 deletions src/backend/chat/active-user-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type { HelixChatChatter } from "@twurple/api";

import { SettingsManager } from "../common/settings-manager";
import { TwitchApi } from "../streaming-platforms/twitch/api";
import chatHelpers from "./chat-helpers";
import { TwitchEventSubChatHelpers } from "../streaming-platforms/twitch/api/eventsub/eventsub-chat-helpers";
import chatRolesManager from "../roles/chat-roles-manager";
import viewerDatabase from "../viewers/viewer-database";
import frontendCommunicator from "../common/frontend-communicator";
Expand Down Expand Up @@ -202,7 +202,7 @@ class ActiveUserHandler extends TypedEmitter<Events> {
disableViewerList: false
};

chatHelpers.setUserProfilePicUrl(twitchUser.id, twitchUser.profilePictureUrl);
TwitchEventSubChatHelpers.setUserProfilePicUrl(twitchUser.id, twitchUser.profilePictureUrl);

await viewerDatabase.addNewViewerFromChat(userDetails, true);

Expand Down Expand Up @@ -242,7 +242,7 @@ class ActiveUserHandler extends TypedEmitter<Events> {
...(chatUser.isMod || chatUser.badges?.has("lead_moderator") ? ['mod'] : []),
...(chatUser.isVip ? ['vip'] : [])
],
profilePicUrl: (await chatHelpers.getUserProfilePicUrl(chatUser.userId)),
profilePicUrl: (await TwitchEventSubChatHelpers.getUserProfilePicUrl(chatUser.userId)),
disableViewerList: !!user?.disableViewerList
};

Expand Down
Loading