• v1.9.0 c565ac8822

    v1.9.0 — LoL Classic result handling
    All checks were successful
    CI / build-and-test (push) Successful in 1m55s
    CI / docker-build (push) Successful in 32s
    Stable

    joeyr released this 2026-08-02 21:00:25 -05:00 | 4 commits to main since this release

    Stops chasing LoL Classic match results that Riot never publishes, and makes Classic predictions opt-in.

    Why

    Riot serves LoL Classic (JADE, queue 4310) through Spectator v5 but not Match v5. Verified against the live API with the production key:

    Probe Result
    matches/NA1_<classic> 403 Forbidden — the match file exists, a third-party key may not read it
    matches/NA1_9999999999 404 match file not found — genuinely absent looks different
    matches/NA1_<ranked SR> 200 — same key, same routing, so the key is fine
    ids?queue=4310 [] — zero Classic matches in history

    So the result never arrives, and never will.

    Added

    • LOL_PREDICTION_CLASSIC_ENABLED (default false) — predict LoL Classic games. Off because a Classic prediction can never be scored. Set true to restore the old behaviour. Ranked predictions are untouched.
    • CLASSIC_QUEUE_ID exported from the LoL config module, replacing bare 4310 literals.

    Fixed

    • A match Riot refuses to serve no longer earns 30 minutes of retries. GameEndHandler treated the 403 like any other failure and started its deferred retry timer — 30 more attempts, 60s apart, each a guaranteed 403. Every Classic game cost 31 pointless Riot calls and held its entry open for half an hour. The fetch now separates pending (retry) from unavailable (403 — stop), and the retry loop aborts if a 403 first appears mid-retry.
    • A 403 no longer masquerades as an expired API key. 401 and 403 were logged together as "Riot API auth error" at error level, so each Classic game emitted 31 error lines claiming the key had died — enough to bury a genuine expiry. 401 keeps error level; 403 now logs at warn as "Riot API forbidden". Both still throw RiotApiError with the status.

    Changed

    • The game-end embed now reads "Riot doesn't publish results for this queue" instead of "results unavailable", which implied one was still coming.

    Full gate green: format, lint, typecheck, 742 tests / 54 suites, build.

    Downloads