From c421d93e7cd707fbcf82621b4f63134b4ae9d1ff Mon Sep 17 00:00:00 2001 From: FlaminSarge Date: Tue, 17 Sep 2024 17:30:05 -0700 Subject: [PATCH] Better structure and parsing for summary object --- src/components/ChatSummary.svelte | 6 +++--- src/ts/chat-parser.ts | 25 ++++++++++++++++++++++--- src/ts/typings/ytc.d.ts | 8 +++++--- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/components/ChatSummary.svelte b/src/components/ChatSummary.svelte index 07c50b5..fded6f1 100644 --- a/src/components/ChatSummary.svelte +++ b/src/components/ChatSummary.svelte @@ -40,7 +40,7 @@ {/if} - {#each summary.header as run} + {#each summary.item.header as run} {#if run.type === 'text'} {run.text} {/if} @@ -61,10 +61,10 @@ {#if !shorten && !dismissed}
- +
- +
{/if} diff --git a/src/ts/chat-parser.ts b/src/ts/chat-parser.ts index d12803b..f25b0a6 100644 --- a/src/ts/chat-parser.ts +++ b/src/ts/chat-parser.ts @@ -61,14 +61,33 @@ const parseMessageRuns = (runs?: Ytc.MessageRun[]): Ytc.ParsedRun[] => { return parsedRuns; }; +const splitRunsByNewline = (runs: Ytc.ParsedRun[], maxSplit: number = -1): Ytc.ParsedRun[][] => { + // takes an array of runs, finds newline-only runs, and splits the array by them, up to maxSplit times + let currSplit = 0; + const output: Ytc.ParsedRun[][] = []; + output.push(runs.reduce((acc: Ytc.ParsedRun[], run: Ytc.ParsedRun) => { + if (run.type === 'text' && run.text === '\n' && (maxSplit == -1 || currSplit < maxSplit)) { + currSplit++; + output.push(acc); + return []; + } + acc.push(run); + return acc; + }, [])); + return output; +} + const parseChatSummary = (renderer: Ytc.AddChatItem, isEphemeral: boolean | undefined, bannerTimeoutMs: number | undefined): Ytc.ParsedSummary | undefined => { const baseRenderer = renderer.liveChatBannerChatSummaryRenderer!; const runs = parseMessageRuns(renderer.liveChatBannerChatSummaryRenderer?.chatSummary.runs); + const splitRuns = splitRunsByNewline(runs, 2); const item: Ytc.ParsedSummary = { type: 'summary', - header: [runs[0]], - subheader: [runs[2]], - summary: runs.slice(4), + item: { + header: splitRuns[0], + subheader: splitRuns[1], + message: splitRuns[2], + }, icon: baseRenderer.icon && { iconType: baseRenderer.icon?.iconType.toLowerCase(), }, diff --git a/src/ts/typings/ytc.d.ts b/src/ts/typings/ytc.d.ts index 71d3fa7..95b1061 100644 --- a/src/ts/typings/ytc.d.ts +++ b/src/ts/typings/ytc.d.ts @@ -382,9 +382,11 @@ declare namespace Ytc { interface ParsedSummary { type: 'summary'; - header: ParsedRun[]; - subheader: ParsedRun[]; - summary: ParsedRun[]; + item: { + header: ParsedRun[]; + subheader: ParsedRun[]; + message: ParsedRun[]; + }; id: string; icon?: { /** Unlocalized string */