From f724ec6c0d66c19eccaa25beeddc54cae822d841 Mon Sep 17 00:00:00 2001 From: Dean Wenstrand Date: Thu, 6 Aug 2026 11:08:26 -0700 Subject: [PATCH] Let shot filters select a single player within a video Adds playerIndex to FilterInput, backing ShooterIdentity.player_index -- the cluster-assigned shooter, 0-based and stable only within one video. Deliberately separate from userId, which is populated only once a cluster has been confirmed against a registered account. Multiplayer sessions are usually played against someone without a Railbird login, so filtering by userId cannot express "the other player" in the common case; the cluster index always can. Co-Authored-By: Claude Opus 5 --- src/index.tsx | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/schema.gql | 1 + 2 files changed, 88 insertions(+) diff --git a/src/index.tsx b/src/index.tsx index f268c40..7ec536b 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -476,6 +476,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -520,6 +521,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -564,6 +566,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -608,6 +611,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -652,6 +656,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -696,6 +701,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -740,6 +746,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -784,6 +791,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -828,6 +836,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -872,6 +881,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -916,6 +926,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -960,6 +971,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1004,6 +1016,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1048,6 +1061,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1092,6 +1106,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1136,6 +1151,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1180,6 +1196,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1224,6 +1241,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1268,6 +1286,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1312,6 +1331,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1356,6 +1376,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1400,6 +1421,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1444,6 +1466,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1488,6 +1511,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1532,6 +1556,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1576,6 +1601,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1620,6 +1646,7 @@ export type FilterInput = missAngleInDegrees: FloatRangeFilter; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1664,6 +1691,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter: FilterInput; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1708,6 +1736,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters: Array; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1752,6 +1781,52 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex: Array; + runId?: never; + runLength?: never; + shotDirection?: never; + spinType?: never; + tableSize?: never; + tags?: never; + targetPocketAngle?: never; + targetPocketAngleDirection?: never; + targetPocketDistance?: never; + totalDistance?: never; + userId?: never; + username?: never; + videoId?: never; + } + | { + andFilters?: never; + annotations?: never; + backcut?: never; + bankAngle?: never; + bankDistance?: never; + createdAt?: never; + cueAngleAfterObject?: never; + cueBallSpeed?: never; + cueObjectAngle?: never; + cueObjectDistance?: never; + cueSpeedAfterObject?: never; + difficulty?: never; + falsePositiveScore?: never; + fargoRating?: never; + intendedPocketType?: never; + isBreakHeuristic?: never; + isDirect?: never; + isLeft?: never; + isLeftMiss?: never; + isRight?: never; + isRightMiss?: never; + isStraight?: never; + kickAngle?: never; + kickDistance?: never; + make?: never; + marginOfErrorInDegrees?: never; + missAngleInDegrees?: never; + notFilter?: never; + orFilters?: never; + playerIndex?: never; runId: Array; runLength?: never; shotDirection?: never; @@ -1796,6 +1871,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength: FloatRangeFilter; shotDirection?: never; @@ -1840,6 +1916,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection: Array; @@ -1884,6 +1961,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1928,6 +2006,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -1972,6 +2051,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -2016,6 +2096,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -2060,6 +2141,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -2104,6 +2186,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -2148,6 +2231,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -2192,6 +2276,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -2236,6 +2321,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; @@ -2280,6 +2366,7 @@ export type FilterInput = missAngleInDegrees?: never; notFilter?: never; orFilters?: never; + playerIndex?: never; runId?: never; runLength?: never; shotDirection?: never; diff --git a/src/schema.gql b/src/schema.gql index c46b2b5..9de1cc7 100644 --- a/src/schema.gql +++ b/src/schema.gql @@ -413,6 +413,7 @@ input FilterInput @oneOf { userId: [Int!] runId: [Int!] username: [String!] + playerIndex: [Int!] fargoRating: FloatRangeFilter make: [Boolean!] tags: [VideoTagInput!]