diff --git a/src/backend/streaming-platforms/twitch/api/eventsub/eventsub-client.ts b/src/backend/streaming-platforms/twitch/api/eventsub/eventsub-client.ts index 27a9ddfa5..bfaade49f 100644 --- a/src/backend/streaming-platforms/twitch/api/eventsub/eventsub-client.ts +++ b/src/backend/streaming-platforms/twitch/api/eventsub/eventsub-client.ts @@ -72,7 +72,8 @@ class TwitchEventSubClient { event.userDisplayName, event.bits, totalBits, - event.messageText ?? "" + event.messageText ?? "", + event.messageParts ); break; } diff --git a/src/backend/streaming-platforms/twitch/api/twurple-private-types.d.ts b/src/backend/streaming-platforms/twitch/api/twurple-private-types.d.ts index 6fb48d73c..49e7d909d 100644 --- a/src/backend/streaming-platforms/twitch/api/twurple-private-types.d.ts +++ b/src/backend/streaming-platforms/twitch/api/twurple-private-types.d.ts @@ -46,6 +46,8 @@ export interface EventSubChatMessageMentionPart { export type EventSubChatMessagePart = EventSubChatMessageTextPart | EventSubChatMessageCheermotePart | EventSubChatMessageEmotePart | EventSubChatMessageMentionPart; +export type EventSubChannelBitsUseMessagePart = EventSubChatMessageTextPart | EventSubChatMessageCheermotePart | EventSubChatMessageEmotePart; + export interface EventSubChatMessageData { text: string; fragments: EventSubChatMessagePart[]; diff --git a/src/backend/streaming-platforms/twitch/events/bits.ts b/src/backend/streaming-platforms/twitch/events/bits.ts index a357c0efe..f0d25d627 100644 --- a/src/backend/streaming-platforms/twitch/events/bits.ts +++ b/src/backend/streaming-platforms/twitch/events/bits.ts @@ -1,6 +1,7 @@ import { EventManager } from "../../../events/event-manager"; import powerUpsManager from "../../../power-ups/power-ups-manager"; import frontendCommunicator from "../../../common/frontend-communicator"; +import { EventSubChannelBitsUseMessagePart } from "../api/twurple-private-types"; export function triggerCheer( username: string, @@ -8,7 +9,8 @@ export function triggerCheer( userDisplayName: string, bits: number, totalBits: number, - cheerMessage: string + cheerMessage: string, + cheerMessageParts: EventSubChannelBitsUseMessagePart[] ): void { void EventManager.triggerEvent("twitch", "cheer", { username, @@ -17,7 +19,8 @@ export function triggerCheer( isAnonymous: false, bits, totalBits, - cheerMessage + cheerMessage, + cheerMessageParts }); } diff --git a/src/backend/streaming-platforms/twitch/variables/bits/cheer-message.ts b/src/backend/streaming-platforms/twitch/variables/bits/cheer-message.ts index 263a55668..ac54fcb04 100644 --- a/src/backend/streaming-platforms/twitch/variables/bits/cheer-message.ts +++ b/src/backend/streaming-platforms/twitch/variables/bits/cheer-message.ts @@ -1,4 +1,5 @@ import type { ReplaceVariable, Trigger, TriggersObject } from "../../../../../types/variables"; +import { EventSubChannelBitsUseMessagePart } from "../../api/twurple-private-types"; const triggers: TriggersObject = {}; triggers["event"] = ["twitch:cheer", "twitch:bits-powerup-message-effect", "twitch:bits-powerup-gigantified-emote"]; @@ -13,10 +14,24 @@ const model : ReplaceVariable = { possibleDataOutput: ["text"] }, evaluator: (trigger: Trigger) => { - const cheerMessage = (trigger.metadata.eventData.cheerMessage || ""); - return cheerMessage - .replace(/[a-zA-Z]+\d+( |\b)/g, "") - .trim(); + if (trigger.metadata.eventData.cheerMessageParts == null) { + const cheerMessage = (trigger.metadata.eventData.cheerMessage || "") as string; + return cheerMessage + .replace(/[a-zA-Z]+\d+( |\b)/g, "") + .trim(); + } + + const cheerMessageParts: string[] = []; + + for (const part of (trigger.metadata.eventData.cheerMessageParts as EventSubChannelBitsUseMessagePart[])) { + if (part.type === "cheermote") { + continue; + } + + cheerMessageParts.push(part.text.trim()); + } + + return cheerMessageParts.join(" "); } };