From e42ac84b405b5bf1b9d3137cc47c6a702fe4bfa7 Mon Sep 17 00:00:00 2001 From: Lucas Winther Date: Tue, 18 Aug 2026 21:30:09 +0200 Subject: [PATCH] feat(ingest): read a summoning campaign as a banner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every game names its gacha something else, and inferType only knew the five words the game8 sources use. Fate/Grand Order calls its banners "Summoning Campaign" — the whole of that page's banner vocabulary — so without this every FGO pull lands as "other" and the type filter stops meaning anything for that lane. Nothing on the current English page carries the word, so no checked-in expected output moves; the unit case is what pins the behaviour until the next refresh brings a banner in. Co-Authored-By: Claude Opus 5 (1M context) --- src/ingest/parsers/game8.ts | 6 +++++- test/adapters/game8.test.ts | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ingest/parsers/game8.ts b/src/ingest/parsers/game8.ts index cd80b44..f5f0489 100644 --- a/src/ingest/parsers/game8.ts +++ b/src/ingest/parsers/game8.ts @@ -373,7 +373,11 @@ function parseRange( export function inferType(title: string): EventType { const t = title.toLowerCase(); if (/\brerun\b/.test(t)) return "rerun"; - if (/\b(banner|wish|warp|convene|gacha)\b/.test(t)) return "banner"; + // Every game names its gacha something else — "Summoning Campaign" is the + // Fate/Grand Order one, and it is the whole of that page's banner vocabulary. + if (/\b(banner|wish|warp|convene|gacha|summon(?:ing)?)\b/.test(t)) { + return "banner"; + } if (/\b(login|log-in|sign-in|check-in|daily bonus)\b/.test(t)) return "login"; if (/\b(challenge|trial|onslaught|abyss|tower|test runs?|clash|combat)\b/.test(t)) return "challenge"; diff --git a/test/adapters/game8.test.ts b/test/adapters/game8.test.ts index 4a8f946..2d7af4d 100644 --- a/test/adapters/game8.test.ts +++ b/test/adapters/game8.test.ts @@ -178,6 +178,7 @@ describe("inferType", () => { ["Gold Clash", "challenge"], ["Seize the Day Login Bonus", "login"], ["Epitome Invocation Banner", "banner"], + ["Chaldea Boys Collection Summoning Campaign", "banner"], ["Mutual Aid in Bloom: Into the Frostlands", "other"], ]; test.each(cases)("%s → %s", (title, expected) => {