feat: add Nikke, the third Fandom template
Its robots.txt was read in a browser and is the standard Fandom file: no Disallow: / for *, /api.php?action= explicitly allowed, and only the namespaces we never want refused. The AI crawlers it blocks by name are not us. That was the one thing missing — the API itself has always answered our own User-Agent with a 200, and it is only robots.txt that a datacentre address cannot read. The zone lives in the column header, Start(UTC+9) / End(UTC+9), and no date in any cell carries an offset. So the header is the safety property: a table that stops naming its zone is refused rather than read as UTC, which is the Blue Archive hazard arriving one column to the left. Two shapes worth knowing. Every title is an image read from <a title>, and the newest row is the one whose logo has not been uploaded yet — it renders as a red link reading "File:Persona on Frontline logo.png", so a reader that only understood the link title would silently drop today's live event. And story events state a clock only on the end, so the start keeps the day the page printed rather than being shifted nine hours into the previous one; the start's day is half an event ID. That is the FGO rule applied to the opposite gap. resetOffsets and resetHourLocal ship with the game because the page evidences both: events end 04:59:59 and the banner replacing them starts 05:00:00, one second later, on a stated UTC+9. Adding that later would re-label day keys readers had already logged ticks under. Seconds now survive the date helpers, since rounding 04:59:59 to the minute would make an event overlap the banner that succeeds it. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 5
parent
c9e9359808
commit
bd385855c0
+12
-1
@@ -10,7 +10,7 @@ import { z } from "zod";
|
||||
|
||||
export const GameId = z.enum([
|
||||
"genshin", "hsr", "zzz", "wuwa", "arknights", "endfield", "nte", "nikki", "p5x", "r1999",
|
||||
"ba", "fgo", "holodori", "gfl2", "stellasora", "czn", "uma",
|
||||
"ba", "fgo", "holodori", "gfl2", "stellasora", "czn", "uma", "nikke",
|
||||
]);
|
||||
|
||||
export const EventType = z.enum([
|
||||
@@ -308,6 +308,17 @@ nothing to add, which is the point worth carrying to the next game: an override
|
||||
the game moves nobody, while the same override added a year later re-labels every tick already
|
||||
logged under the old clock. Get it right at introduction or accept a migration.
|
||||
|
||||
Nikke is the third game to earn one from the source rather than from habit, after Arknights and
|
||||
Reverse: 1999, and it earns `resetHourLocal` too: every schedule column on its wiki is headed
|
||||
`Start(UTC+9)` / `End(UTC+9)`, and the rows show where the day turns — a story event ends at
|
||||
04:59:59 and the pickup banner replacing it starts at 05:00:00, one second later. So UTC+9 for every
|
||||
region, rolling at 05:00 rather than 04:00. It shipped in the same commit as the game, which costs
|
||||
nothing while no reader has a day key for it.
|
||||
|
||||
Note also that `nikke` and `nikki` are one letter apart and are different games — Goddess of Victory:
|
||||
Nikke and Infinity Nikki. Both are the first segment of every completion key their game will ever
|
||||
have, so a typo in either direction is silent data loss for real readers.
|
||||
|
||||
Infinity Nikki, P5X, Blue Archive, Chaos Zero Nightmare and Umamusume carry **no `resetOffsets`
|
||||
entry**, so they take the regional default. That is an assumption, not a verified server map — none
|
||||
of those sources states one. Two of the 2026-08-19 additions are worth separating out, because they
|
||||
|
||||
+2
-1
@@ -51,7 +51,7 @@ Consequences worth internalising:
|
||||
| `game8` | game8.co article calendars | Genshin, Star Rail, Wuthering Waves, ZZZ, Endfield, NTE, Infinity Nikki, Persona 5: The Phantom X, Chaos Zero Nightmare, Umamusume |
|
||||
| `wikigg` | wiki.gg MediaWiki `mp-event` templates | Endfield |
|
||||
| `akwiki` | arknights.wiki.gg's `mrfz-wtable` "Ongoing/upcoming" table | Arknights |
|
||||
| `fandom` | Fandom wikis via the MediaWiki `action=parse` API — two page templates: `Event \| Time Period \| Version` wikitables, and FGO's picture-fenced `ONGOING EVENTS` blocks | Reverse: 1999, Fate/Grand Order |
|
||||
| `fandom` | Fandom wikis via the MediaWiki `action=parse` API — three page templates: `Event \| Time Period \| Version` wikitables, FGO's picture-fenced `ONGOING EVENTS` blocks, and Nikke's `Event \| Start(UTC+9) \| End(UTC+9)` tables | Reverse: 1999, Fate/Grand Order, Nikke |
|
||||
| `bawiki` | bluearchive.wiki's rendered `/wiki/Events` — a JP/Global tabber over `Name (EN) \| Start date \| End date \| Notes` wikitables | Blue Archive |
|
||||
| `holodoriwiki` | holodori.wiki's rendered `/wiki/Events` — `Current Events` and `Past Events` wikitables over `Event \| Type \| Start Date \| End Date` | hololive Dreams |
|
||||
| `iopwiki` | iopwiki.com's `gf-table event-period` tables — `Title \| Period (start/end) \| Server \| Type \| Comment`, one table per event and one row per server | Girls' Frontline 2 |
|
||||
@@ -144,6 +144,7 @@ All live in `src/ingest/dates.ts`, each returning null rather than inferring any
|
||||
| `parseSlashClockZone` | `08/17/2026 8:00PM (JST)` (one boundary per column, 12-hour clock, **named** zone) | hololive Dreams |
|
||||
| `parseIsoClockRangeUtc` | `2026-08-06 13:00 - 2026-08-26 22:59 (UTC)` (whole range in one cell, **zone required**, nothing converted) | Girls' Frontline 2 |
|
||||
| `parseIsoOffsetInstant` | `2026-08-03T21:00-07:00` (a machine-readable `<time datetime>` attribute; **offset required**) | Stella Sora |
|
||||
| `parseDayMonthYearClock` | `12 August 2026`, `10 September 202604:59:59` (day-first; the offset comes from the **column header**, and a clockless boundary keeps its printed day) | Nikke |
|
||||
| `parseOpenRange` | `Jul. 24, 2026 - End of 4.6`, `July 10, 2026 - Permanent` | Star Rail, Wuthering Waves |
|
||||
|
||||
**A day-precision result is 00:00Z, and that is a placeholder rather than a time.** Every reader
|
||||
|
||||
+2
-2
@@ -59,7 +59,7 @@ have a source — this table is the launch scope, not a roster to keep in sync.
|
||||
|
||||
Adding a game must require no change to `GachaEvent` — only a `GameId` entry, its `games.ts`
|
||||
metadata, and a source registration. That is the test of whether the data model is right, and it has
|
||||
held: the seventeen games here have cost the event schema nothing. Per-game *metadata* does occasionally
|
||||
held: the eighteen games here have cost the event schema nothing. Per-game *metadata* does occasionally
|
||||
grow (Reverse: 1999 needed `resetHourLocal` for a 05:00 reset), which is a different file and moves
|
||||
no stored key. A game may have several sources; see `docs/INGESTION.md` § Three layers.
|
||||
|
||||
@@ -90,7 +90,7 @@ default `"game"` — the board every existing reader already has). Merged, the o
|
||||
`endingSoonestFirst`, the same comparator behind the list's "Ending soonest" (F2), so the two views
|
||||
cannot mean different things by the same words and an unannounced end still sorts behind every dated
|
||||
one rather than claiming a place in the queue. Merged there is also no lane heading to say whose
|
||||
event a bar is, and hue alone cannot answer that once seventeen games share a stack — so each bar
|
||||
event a bar is, and hue alone cannot answer that once eighteen games share a stack — so each bar
|
||||
carries its game's short name, with the full name in its tooltip. A bar too narrow for a tag and a
|
||||
title both keeps the title: a chopped game name reads as a broken word, and the hue and the tooltip
|
||||
still answer it.
|
||||
|
||||
Reference in New Issue
Block a user