feat: add Punishing: Gray Raven with karendar.com source

Add karendar.com as the event source for Punishing: Gray Raven (PGR).
Karendar publishes a dedicated Global event calendar with exact UTC
timestamps in clean server-rendered HTML.

- Register 'pgr' in GameId and GAMES registry (#CC292B, Kuro Games).
- Add parseWeekdayDayMonthYearUtc in src/ingest/dates.ts with unit tests.
- Implement karendarParser in src/ingest/parsers/karendar.ts reading
  'week', 'ongoing', and 'upcoming' sections, mapping indefinite/permanent
  ends to endsAt: null, and categorizing tags to EventType.
- Register pgr-karendar-events in src/ingest/adapters/index.ts.
- Add pinned fixture, expected output, and comprehensive test suites.
- Update documentation in AGENTS.md, README.md, docs/INGESTION.md,
  and docs/SOURCES.md.
This commit is contained in:
Lucas Winther committed 2026-09-12 09:10:02 +02:00
1 parent 2d6299445c
commit 4382ed35ee
15 files changed
+1645 -22

No files matched your search

+4
View File
@@ -162,6 +162,10 @@ export const GAMES: Record<GameId, GameMeta> = {
// per-region split, so there is nothing here that could evidence a server
// map even if a clock appeared. See src/ingest/parsers/arustats.ts.
hi3: { id: "hi3", name: "Honkai Impact 3rd", short: "Honkai 3rd", hue: "#8B5CF6", studio: "HoYoverse", dailyTasks: "Daily missions, stamina" },
// No `resetOffsets`: Karendar states all times for the Global server in UTC
// with no per-region columns and no stated reset hour, so PGR takes the
// default regional reset until a source evidences an override.
pgr: { id: "pgr", name: "Punishing: Gray Raven", short: "PGR", hue: "#CC292B", studio: "Kuro Games", dailyTasks: "Daily missions, serum" },
};
export const GAME_LIST: GameMeta[] = Object.values(GAMES);
+1
View File
@@ -22,6 +22,7 @@ export const GameId = z.enum([
// first segment of every completion key their game will ever have.
"nikke", // Goddess of Victory: Nikke
"hi3", // Honkai Impact 3rd
"pgr", // Punishing: Gray Raven
]);
export type GameId = z.infer<typeof GameId>;