diff --git a/app/db/tables.ts b/app/db/tables.ts index 630a5254ce..1f7784a61e 100644 --- a/app/db/tables.ts +++ b/app/db/tables.ts @@ -366,8 +366,8 @@ export interface Skill { matchesCount: number; mu: number; ordinal: number; - season: number; sigma: number; + season: number; tournamentId: number | null; userId: number | null; } @@ -377,6 +377,14 @@ export interface SkillTeamUser { userId: number; } +export interface SeedingSkill { + mu: number; + ordinal: number; + sigma: number; + userId: number; + type: "RANKED" | "UNRANKED"; +} + export interface SplatoonPlayer { id: GeneratedAlways; splId: string; @@ -878,7 +886,6 @@ export interface DB { LFGPost: LFGPost; MapPoolMap: MapPoolMap; MapResult: MapResult; - migrations: Migrations; PlayerResult: PlayerResult; PlusSuggestion: PlusSuggestion; PlusTier: PlusTier; @@ -887,6 +894,7 @@ export interface DB { ReportedWeapon: ReportedWeapon; Skill: Skill; SkillTeamUser: SkillTeamUser; + SeedingSkill: SeedingSkill; SplatoonPlayer: SplatoonPlayer; TaggedArt: TaggedArt; Team: Team; diff --git a/app/features/mmr/mmr-utils.server.ts b/app/features/mmr/mmr-utils.server.ts index 4075584c03..4903b4b273 100644 --- a/app/features/mmr/mmr-utils.server.ts +++ b/app/features/mmr/mmr-utils.server.ts @@ -1,7 +1,9 @@ import { rating } from "openskill"; +import type { Tables } from "../../db/tables"; import { identifierToUserIds } from "./mmr-utils"; import { findCurrentSkillByUserId } from "./queries/findCurrentSkillByUserId.server"; import { findCurrentTeamSkillByIdentifier } from "./queries/findCurrentTeamSkillByIdentifier.server"; +import { findSeedingSkill } from "./queries/findSeedingSkill.server"; export function queryCurrentUserRating({ userId, @@ -19,6 +21,17 @@ export function queryCurrentUserRating({ return { rating: rating(skill), matchesCount: skill.matchesCount }; } +export function queryCurrentUserSeedingRating(args: { + userId: number; + type: Tables["SeedingSkill"]["type"]; +}) { + const skill = findSeedingSkill(args); + + if (!skill) return rating(); + + return skill; +} + export function queryCurrentTeamRating({ identifier, season, diff --git a/app/features/mmr/queries/findSeedingSkill.server.ts b/app/features/mmr/queries/findSeedingSkill.server.ts new file mode 100644 index 0000000000..6367adb1c0 --- /dev/null +++ b/app/features/mmr/queries/findSeedingSkill.server.ts @@ -0,0 +1,21 @@ +import { sql } from "~/db/sql"; +import type { Tables } from "../../../db/tables"; + +const stm = sql.prepare(/* sql */ ` + select + "mu", + "sigma" + from + "SeedingSkill" + where + "userId" = @userId + and + "type" = @type +`); + +export function findSeedingSkill(args: { + userId: number; + type: Tables["SeedingSkill"]["type"]; +}) { + return stm.get(args) as Pick | null; +} diff --git a/app/features/tournament-bracket/core/Tournament.ts b/app/features/tournament-bracket/core/Tournament.ts index 4b6ac5d588..a5cdfe2757 100644 --- a/app/features/tournament-bracket/core/Tournament.ts +++ b/app/features/tournament-bracket/core/Tournament.ts @@ -81,22 +81,16 @@ export class Tournament { a: TournamentData["ctx"]["teams"][number], b: TournamentData["ctx"]["teams"][number], ) { - const aPlus = a.members - .flatMap((a) => (a.plusTier ? [a.plusTier] : [])) - .sort((a, b) => a - b) - .slice(0, 4); - const bPlus = b.members - .flatMap((b) => (b.plusTier ? [b.plusTier] : [])) - .sort((a, b) => a - b) - .slice(0, 4); - - for (let i = 0; i < 4; i++) { - if (aPlus[i] && !bPlus[i]) return -1; - if (!aPlus[i] && bPlus[i]) return 1; - - if (aPlus[i] !== bPlus[i]) { - return aPlus[i] - bPlus[i]; - } + if (a.avgSeedingSkillOrdinal && b.avgSeedingSkillOrdinal) { + return b.avgSeedingSkillOrdinal - a.avgSeedingSkillOrdinal; + } + + if (a.avgSeedingSkillOrdinal && !b.avgSeedingSkillOrdinal) { + return -1; + } + + if (!a.avgSeedingSkillOrdinal && b.avgSeedingSkillOrdinal) { + return 1; } return a.createdAt - b.createdAt; @@ -528,6 +522,20 @@ export class Tournament { }); } + /** What seeding skill rating this tournament counts for */ + get skillCountsFor() { + if (this.ranked) { + return "RANKED"; + } + + // exclude gimmicky tournaments + if (this.minMembersPerTeam === 4 && !this.ctx.tags?.includes("SPECIAL")) { + return "UNRANKED"; + } + + return null; + } + get minMembersPerTeam() { return this.ctx.settings.minMembersPerTeam ?? 4; } diff --git a/app/features/tournament-bracket/core/summarizer.server.ts b/app/features/tournament-bracket/core/summarizer.server.ts index f7c9c82fb0..8e6b86e6d8 100644 --- a/app/features/tournament-bracket/core/summarizer.server.ts +++ b/app/features/tournament-bracket/core/summarizer.server.ts @@ -1,5 +1,6 @@ import shuffle from "just-shuffle"; import type { Rating } from "node_modules/openskill/dist/types"; +import { ordinal } from "openskill"; import type { MapResult, PlayerResult, @@ -13,6 +14,7 @@ import { } from "~/features/mmr/mmr-utils"; import { removeDuplicates } from "~/utils/arrays"; import invariant from "~/utils/invariant"; +import type { Tables } from "../../../db/tables"; import type { AllMatchResult } from "../queries/allMatchResultsByTournamentId.server"; import type { Standing } from "./Bracket"; @@ -21,6 +23,7 @@ export interface TournamentSummary { Skill, "tournamentId" | "id" | "ordinal" | "season" | "groupMatchId" >[]; + seedingSkills: Tables["SeedingSkill"][]; mapResultDeltas: Omit[]; playerResultDeltas: Omit[]; tournamentResults: Omit[]; @@ -40,6 +43,8 @@ export function tournamentSummary({ queryCurrentTeamRating, queryTeamPlayerRatingAverage, queryCurrentUserRating, + queryCurrentSeedingRating, + seedingSkillCountsFor, calculateSeasonalStats = true, }: { results: AllMatchResult[]; @@ -48,6 +53,8 @@ export function tournamentSummary({ queryCurrentTeamRating: (identifier: string) => Rating; queryTeamPlayerRatingAverage: (identifier: string) => Rating; queryCurrentUserRating: (userId: number) => Rating; + queryCurrentSeedingRating: (userId: number) => Rating; + seedingSkillCountsFor: Tables["SeedingSkill"]["type"] | null; calculateSeasonalStats?: boolean; }): TournamentSummary { const userIdsToTeamId = userIdsToTeamIdRecord(teams); @@ -62,6 +69,17 @@ export function tournamentSummary({ queryTeamPlayerRatingAverage, }) : [], + seedingSkills: seedingSkillCountsFor + ? calculateIndividualPlayerSkills({ + queryCurrentUserRating: queryCurrentSeedingRating, + results, + userIdsToTeamId, + }).map((skill) => ({ + ...skill, + type: seedingSkillCountsFor, + ordinal: ordinal(skill), + })) + : [], mapResultDeltas: calculateSeasonalStats ? mapResultDeltas({ results, userIdsToTeamId }) : [], @@ -75,7 +93,7 @@ export function tournamentSummary({ }; } -function userIdsToTeamIdRecord(teams: TeamsArg) { +export function userIdsToTeamIdRecord(teams: TeamsArg) { const result: UserIdToTeamId = {}; for (const team of teams) { @@ -102,7 +120,7 @@ function skills(args: { return result; } -function calculateIndividualPlayerSkills({ +export function calculateIndividualPlayerSkills({ results, userIdsToTeamId, queryCurrentUserRating, diff --git a/app/features/tournament-bracket/core/summarizer.test.ts b/app/features/tournament-bracket/core/summarizer.test.ts index 6acdba5a37..19e91405df 100644 --- a/app/features/tournament-bracket/core/summarizer.test.ts +++ b/app/features/tournament-bracket/core/summarizer.test.ts @@ -1,6 +1,7 @@ import { ordinal, rating } from "openskill"; import { describe, expect, test } from "vitest"; import invariant from "~/utils/invariant"; +import type { Tables } from "../../../db/tables"; import type { AllMatchResult } from "../queries/allMatchResultsByTournamentId.server"; import type { TournamentDataTeam } from "./Tournament.server"; import { tournamentSummary } from "./summarizer.server"; @@ -14,6 +15,7 @@ describe("tournamentSummary()", () => { createdAt: 0, id: teamId, inviteCode: null, + avgSeedingSkillOrdinal: null, mapPool: [], members: userIds.map((userId) => ({ country: null, @@ -38,7 +40,13 @@ describe("tournamentSummary()", () => { pickupAvatarUrl: null, }); - function summarize({ results }: { results?: AllMatchResult[] } = {}) { + function summarize({ + results, + seedingSkillCountsFor, + }: { + results?: AllMatchResult[]; + seedingSkillCountsFor?: Tables["SeedingSkill"]["type"]; + } = {}) { return tournamentSummary({ finalStandings: [ { @@ -123,6 +131,8 @@ describe("tournamentSummary()", () => { queryCurrentTeamRating: () => rating(), queryCurrentUserRating: () => rating(), queryTeamPlayerRatingAverage: () => rating(), + queryCurrentSeedingRating: () => rating(), + seedingSkillCountsFor: seedingSkillCountsFor ?? null, }); } @@ -141,6 +151,31 @@ describe("tournamentSummary()", () => { expect(ordinal(winnerSkill)).toBeGreaterThan(ordinal(loserSkill)); }); + test("seeding skill is calculated the same as normal skill", () => { + const summary = summarize({ seedingSkillCountsFor: "RANKED" }); + const winnerSkill = summary.skills.find((s) => s.userId === 1); + const winnerSeedingSkill = summary.skills.find((s) => s.userId === 1); + + invariant(winnerSkill, "winnerSkill should be defined"); + invariant(winnerSeedingSkill, "winnerSeedingSkill should be defined"); + + expect(ordinal(winnerSkill)).toBe(ordinal(winnerSeedingSkill)); + }); + + test("no seeding skill calculated if seedingSkillCountsFor is null", () => { + const summary = summarize(); + + expect(summary.seedingSkills.length).toBe(0); + }); + + test("seeding skills type matches the given seedingSkillCountsFor", () => { + const summary = summarize({ seedingSkillCountsFor: "RANKED" }); + expect(summary.seedingSkills[0].type).toBe("RANKED"); + + const summary2 = summarize({ seedingSkillCountsFor: "UNRANKED" }); + expect(summary2.seedingSkills[0].type).toBe("UNRANKED"); + }); + const resultsWith20: AllMatchResult[] = [ { maps: [ diff --git a/app/features/tournament-bracket/core/tests/mocks.ts b/app/features/tournament-bracket/core/tests/mocks.ts index 4a224b9e92..33230d8ed6 100644 --- a/app/features/tournament-bracket/core/tests/mocks.ts +++ b/app/features/tournament-bracket/core/tests/mocks.ts @@ -1979,6 +1979,7 @@ export const PADDLING_POOL_257 = () => ctx: { id: 27, organization: null, + tags: null, eventId: 1352, settings: { bracketProgression: [ @@ -2106,6 +2107,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709743534, @@ -2219,6 +2221,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709737918, @@ -2270,7 +2273,6 @@ export const PADDLING_POOL_257 = () => customUrl: "splating", inGameName: "Splating#3238", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709744756, @@ -2345,6 +2347,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709743523, @@ -2458,6 +2461,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709743262, @@ -2571,6 +2575,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709741396, @@ -2609,7 +2614,6 @@ export const PADDLING_POOL_257 = () => customUrl: "eli", inGameName: "elibvn♪#1082", country: "NO", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709741404, @@ -2622,7 +2626,6 @@ export const PADDLING_POOL_257 = () => customUrl: "gusplatoon", inGameName: "GUS?#1100", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709741421, @@ -2635,7 +2638,6 @@ export const PADDLING_POOL_257 = () => customUrl: "luples", inGameName: "Luples #3315", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709741503, @@ -2697,6 +2699,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709711811, @@ -2709,7 +2712,6 @@ export const PADDLING_POOL_257 = () => customUrl: "proto", inGameName: "-> Proto#4769", country: "US", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709711811, @@ -2722,7 +2724,6 @@ export const PADDLING_POOL_257 = () => customUrl: "red", inGameName: "pee-liter#9771", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709711816, @@ -2748,7 +2749,6 @@ export const PADDLING_POOL_257 = () => customUrl: "asan", inGameName: "Asan#5055", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709711972, @@ -2823,6 +2823,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709738831, @@ -2848,7 +2849,6 @@ export const PADDLING_POOL_257 = () => customUrl: "keurbii", inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709738840, @@ -2861,7 +2861,6 @@ export const PADDLING_POOL_257 = () => customUrl: "kchouuu", inGameName: "ZkG Kchou'#7905", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709738848, @@ -2874,7 +2873,6 @@ export const PADDLING_POOL_257 = () => customUrl: "yegzu8", inGameName: "mrmeow#3260", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709738852, @@ -2887,7 +2885,6 @@ export const PADDLING_POOL_257 = () => customUrl: "sparadox", inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709749164, @@ -2949,6 +2946,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709737837, @@ -2961,7 +2959,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "Bomm☆Sz♪#1943", country: "FR", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709737837, @@ -2974,7 +2971,6 @@ export const PADDLING_POOL_257 = () => customUrl: "jiky", inGameName: "Sて Jιky#3308", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709737849, @@ -2987,7 +2983,6 @@ export const PADDLING_POOL_257 = () => customUrl: "adil", inGameName: null, country: "DZ", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709737853, @@ -3062,6 +3057,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709741719, @@ -3074,7 +3070,6 @@ export const PADDLING_POOL_257 = () => customUrl: "xino", inGameName: "XINOBI!#2889", country: "SN", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709741719, @@ -3087,7 +3082,6 @@ export const PADDLING_POOL_257 = () => customUrl: "necrew", inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709741826, @@ -3113,7 +3107,6 @@ export const PADDLING_POOL_257 = () => customUrl: "agatespl", inGameName: "AGATE#1417", country: "NG", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709743574, @@ -3201,6 +3194,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709730354, @@ -3239,7 +3233,6 @@ export const PADDLING_POOL_257 = () => customUrl: "xone", inGameName: "Raven#1340", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709730361, @@ -3252,7 +3245,6 @@ export const PADDLING_POOL_257 = () => customUrl: "korii", inGameName: "zzz Koriii#9444", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709731364, @@ -3265,7 +3257,6 @@ export const PADDLING_POOL_257 = () => customUrl: "elo", inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709732359, @@ -3327,6 +3318,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709745630, @@ -3339,7 +3331,6 @@ export const PADDLING_POOL_257 = () => customUrl: "phantom_spl", inGameName: "Phantom#5343", country: "US", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709745630, @@ -3365,7 +3356,6 @@ export const PADDLING_POOL_257 = () => customUrl: "rosearrow", inGameName: "†’Rose#1636", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709746716, @@ -3391,7 +3381,6 @@ export const PADDLING_POOL_257 = () => customUrl: "tdmblue", inGameName: "TmBlue#2324", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709747701, @@ -3450,6 +3439,7 @@ export const PADDLING_POOL_257 = () => seed: 12, prefersNotToHost: 1, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709592381, @@ -3462,7 +3452,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709592381, @@ -3475,7 +3464,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "4 Devil~#1653", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709592386, @@ -3488,7 +3476,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "4 γµshi~#2216", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709592764, @@ -3501,7 +3488,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709629441, @@ -3514,7 +3500,6 @@ export const PADDLING_POOL_257 = () => customUrl: "dismaqe", inGameName: null, country: "EE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709674615, @@ -3527,7 +3512,6 @@ export const PADDLING_POOL_257 = () => customUrl: "bandito", inGameName: null, country: "EE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709674777, @@ -3589,6 +3573,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709723749, @@ -3601,7 +3586,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "gugusdu45#2420", country: null, - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709723749, @@ -3614,7 +3598,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "Slord.#2406", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709723767, @@ -3627,7 +3610,6 @@ export const PADDLING_POOL_257 = () => customUrl: "zenhmi", inGameName: "ZENHMi#3291", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709723792, @@ -3640,7 +3622,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "★MεgαЯ★#9963", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709723958, @@ -3715,6 +3696,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709668399, @@ -3727,7 +3709,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: null, country: "ES", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709668399, @@ -3740,7 +3721,6 @@ export const PADDLING_POOL_257 = () => customUrl: "aprhodite", inGameName: "Aprhodite#2749", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709668513, @@ -3753,7 +3733,6 @@ export const PADDLING_POOL_257 = () => customUrl: "ruben", inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709668696, @@ -3766,7 +3745,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "い izoweN#2592", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709668807, @@ -3779,7 +3757,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "キおう 〆仝 At⇔#3946", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709669282, @@ -3792,7 +3769,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "い Neomegax#2245", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709743110, @@ -3854,6 +3830,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709735267, @@ -3866,7 +3843,6 @@ export const PADDLING_POOL_257 = () => customUrl: "magyk", inGameName: "hl。Magyk♪#9557", country: "US", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709735267, @@ -3879,7 +3855,6 @@ export const PADDLING_POOL_257 = () => customUrl: "theory", inGameName: " SistaLexi#5048", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709735362, @@ -3892,7 +3867,6 @@ export const PADDLING_POOL_257 = () => customUrl: "salti64", inGameName: null, country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709735442, @@ -3905,7 +3879,6 @@ export const PADDLING_POOL_257 = () => customUrl: "angeel", inGameName: "May ナー#3235", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709741586, @@ -3972,6 +3945,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709745849, @@ -3984,7 +3958,6 @@ export const PADDLING_POOL_257 = () => customUrl: "shiruu_", inGameName: "-シルウ-#2124", country: "DE", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709745849, @@ -3997,7 +3970,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "ねこ#12226", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709745857, @@ -4010,7 +3982,6 @@ export const PADDLING_POOL_257 = () => customUrl: "yame", inGameName: "Yame#3318", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709745932, @@ -4023,7 +3994,6 @@ export const PADDLING_POOL_257 = () => customUrl: "seb", inGameName: "200FULLBOX#1297", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709746722, @@ -4090,6 +4060,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709742258, @@ -4102,7 +4073,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "[DI] Tiger#1131", country: "GB", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709742258, @@ -4115,7 +4085,6 @@ export const PADDLING_POOL_257 = () => customUrl: "afroking", inGameName: "[DI] Afro#1667", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709742263, @@ -4128,7 +4097,6 @@ export const PADDLING_POOL_257 = () => customUrl: "mooj", inGameName: "[DI] mooj#1498", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709742273, @@ -4141,7 +4109,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "[DI] tame#2126", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709742276, @@ -4154,7 +4121,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "[DI] Polly#1095", country: "NO", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709745042, @@ -4213,6 +4179,7 @@ export const PADDLING_POOL_257 = () => seed: 18, prefersNotToHost: 1, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709738744, @@ -4225,7 +4192,6 @@ export const PADDLING_POOL_257 = () => customUrl: "hyperstar", inGameName: "▼* Hyper☆#1744", country: "GB", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709738744, @@ -4238,7 +4204,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: null, country: "PT", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709738763, @@ -4251,7 +4216,6 @@ export const PADDLING_POOL_257 = () => customUrl: "buffheavy", inGameName: "salty#2163", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709738768, @@ -4264,7 +4228,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "Slasher#1494", country: "BE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709738771, @@ -4277,7 +4240,6 @@ export const PADDLING_POOL_257 = () => customUrl: "yaga", inGameName: "▼* yaga . #3291", country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709738778, @@ -4339,6 +4301,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709746054, @@ -4351,7 +4314,6 @@ export const PADDLING_POOL_257 = () => customUrl: "pallo_spl", inGameName: "Pallo♪#1547", country: "DK", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709746054, @@ -4364,7 +4326,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "★Dark☆#2415", country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709746062, @@ -4377,7 +4338,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "¥Endo#1758", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709746066, @@ -4390,7 +4350,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "Mop#3970", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709746069, @@ -4454,6 +4413,7 @@ export const PADDLING_POOL_257 = () => seed: 20, prefersNotToHost: 1, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709744894, @@ -4466,7 +4426,6 @@ export const PADDLING_POOL_257 = () => customUrl: "shadow_carbon", inGameName: "✞Shadøw#2265", country: "PT", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709744894, @@ -4479,7 +4438,6 @@ export const PADDLING_POOL_257 = () => customUrl: "bake", inGameName: "り·Baké#2955", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709744896, @@ -4492,7 +4450,6 @@ export const PADDLING_POOL_257 = () => customUrl: "hinanamu", inGameName: "Sekai#2518", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709744933, @@ -4505,7 +4462,6 @@ export const PADDLING_POOL_257 = () => customUrl: "myst", inGameName: "Myst#2412", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709745146, @@ -4567,6 +4523,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709728278, @@ -4579,7 +4536,6 @@ export const PADDLING_POOL_257 = () => customUrl: "ati", inGameName: "Ati#1543", country: "TR", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709728278, @@ -4592,7 +4548,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "Chris#1351", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709728284, @@ -4605,7 +4560,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "AliDerBoss#4018", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709728411, @@ -4618,7 +4572,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709730409, @@ -4680,6 +4633,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709715006, @@ -4692,7 +4646,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: null, country: "DE", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709715006, @@ -4705,7 +4658,6 @@ export const PADDLING_POOL_257 = () => customUrl: "skyend", inGameName: "SkyEnd <3#1382", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709715010, @@ -4718,7 +4670,6 @@ export const PADDLING_POOL_257 = () => customUrl: "spheonix", inGameName: "$ρhηiχ▽LOS#3326", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709715013, @@ -4731,7 +4682,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "lookitslu#9311", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709715015, @@ -4793,6 +4743,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709660578, @@ -4805,7 +4756,6 @@ export const PADDLING_POOL_257 = () => customUrl: "bobbela", inGameName: "×··Bobbela#3286", country: "PT", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709660578, @@ -4818,7 +4768,6 @@ export const PADDLING_POOL_257 = () => customUrl: "napple", inGameName: "×··Napple#1455", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709660989, @@ -4831,7 +4780,6 @@ export const PADDLING_POOL_257 = () => customUrl: "goober", inGameName: "×··goober#1440", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709668986, @@ -4844,7 +4792,6 @@ export const PADDLING_POOL_257 = () => customUrl: "icedmango", inGameName: "×··Mango#1847", country: "NL", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709673459, @@ -4911,6 +4858,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709721869, @@ -4923,7 +4871,6 @@ export const PADDLING_POOL_257 = () => customUrl: "mirval", inGameName: "Mirval#1257", country: "FR", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709721869, @@ -4936,7 +4883,6 @@ export const PADDLING_POOL_257 = () => customUrl: "mishy", inGameName: "mishy#2235", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709721879, @@ -4949,7 +4895,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "Aerα#4357", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709722102, @@ -4962,7 +4907,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "pk sili#2673", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709723277, @@ -4975,7 +4919,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "Huge :)#1919", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709745438, @@ -5039,6 +4982,7 @@ export const PADDLING_POOL_257 = () => seed: 25, prefersNotToHost: 1, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709743633, @@ -5051,7 +4995,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709743633, @@ -5064,7 +5007,6 @@ export const PADDLING_POOL_257 = () => customUrl: "splatos", inGameName: "仝Splatos仝#1932", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709743650, @@ -5077,7 +5019,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "仝Lowasis ♪#3146", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709743701, @@ -5090,7 +5031,6 @@ export const PADDLING_POOL_257 = () => customUrl: "alonika", inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709743849, @@ -5157,6 +5097,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709738747, @@ -5169,7 +5110,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "2.GoldA#2405", country: "DE", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709738747, @@ -5182,7 +5122,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "2.piiiro?!#1274", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709738768, @@ -5195,7 +5134,6 @@ export const PADDLING_POOL_257 = () => customUrl: "flemmi", inGameName: "2.flemmi#3395", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709738774, @@ -5208,7 +5146,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "2.WolfiJr#1423", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709739032, @@ -5221,7 +5158,6 @@ export const PADDLING_POOL_257 = () => customUrl: "ninjar04", inGameName: "Ninjar04#1774", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709740549, @@ -5288,6 +5224,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709626047, @@ -5300,7 +5237,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "1нρ jj#3153", country: "GB", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709626047, @@ -5313,7 +5249,6 @@ export const PADDLING_POOL_257 = () => customUrl: "splatdroid", inGameName: "1нρ Đroid#1097", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709626053, @@ -5326,7 +5261,6 @@ export const PADDLING_POOL_257 = () => customUrl: "sneaky", inGameName: "1нρ Sneaky#1502", country: "BE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709626056, @@ -5339,7 +5273,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "1нρ dani#2982", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709626059, @@ -5352,7 +5285,6 @@ export const PADDLING_POOL_257 = () => customUrl: "enamel", inGameName: "Enamel#2070", country: "AT", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709626392, @@ -5414,6 +5346,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709727951, @@ -5426,7 +5359,6 @@ export const PADDLING_POOL_257 = () => customUrl: "xploriver", inGameName: "の\tXploRivr#5566", country: "CH", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709727951, @@ -5439,7 +5371,6 @@ export const PADDLING_POOL_257 = () => customUrl: "hugeaux", inGameName: "の Hugeaux#1049", country: "CH", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709727955, @@ -5452,7 +5383,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "の εδ⇔Ligma#1885", country: "CH", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709728867, @@ -5465,7 +5395,6 @@ export const PADDLING_POOL_257 = () => customUrl: "depito", inGameName: "の εδ⟺Deez#7973", country: "CH", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709729336, @@ -5527,6 +5456,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709741482, @@ -5539,7 +5469,6 @@ export const PADDLING_POOL_257 = () => customUrl: "funiaxolotl", inGameName: "AQ¤Axo#6223", country: "IS", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709741482, @@ -5552,7 +5481,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: null, country: "AT", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709741787, @@ -5565,7 +5493,6 @@ export const PADDLING_POOL_257 = () => customUrl: "itis_karma", inGameName: "Karma#2126", country: "SE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709742200, @@ -5578,7 +5505,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709744132, @@ -5591,7 +5517,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "xlimit#3360", country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709746800, @@ -5604,7 +5529,6 @@ export const PADDLING_POOL_257 = () => customUrl: "kelvin52point5", inGameName: "MLP★Goldeb#9709", country: "FI", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709746904, @@ -5663,6 +5587,7 @@ export const PADDLING_POOL_257 = () => seed: 30, prefersNotToHost: 1, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709744451, @@ -5675,7 +5600,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709744451, @@ -5688,7 +5612,6 @@ export const PADDLING_POOL_257 = () => customUrl: "krixxor", inGameName: "Krixxor#2871", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709744453, @@ -5701,7 +5624,6 @@ export const PADDLING_POOL_257 = () => customUrl: "forceur", inGameName: "Mat F#3359", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709744456, @@ -5714,7 +5636,6 @@ export const PADDLING_POOL_257 = () => customUrl: "s4", inGameName: "S4#3238", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709744458, @@ -5781,6 +5702,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709726536, @@ -5793,7 +5715,6 @@ export const PADDLING_POOL_257 = () => customUrl: "axolt", inGameName: "Axølt#2675", country: "FR", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709726536, @@ -5806,7 +5727,6 @@ export const PADDLING_POOL_257 = () => customUrl: "soraa", inGameName: "Mafuyu <3#1525", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709726748, @@ -5819,7 +5739,6 @@ export const PADDLING_POOL_257 = () => customUrl: "error", inGameName: "の{Error ♪#2000", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709726853, @@ -5832,7 +5751,6 @@ export const PADDLING_POOL_257 = () => customUrl: "dam", inGameName: "Kanade <3#2259", country: "MA", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709743306, @@ -5894,6 +5812,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709558706, @@ -5906,7 +5825,6 @@ export const PADDLING_POOL_257 = () => customUrl: "ohitsana19", inGameName: "сн;An An#4207", country: "CH", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709558706, @@ -5919,7 +5837,6 @@ export const PADDLING_POOL_257 = () => customUrl: "nah-id-win", inGameName: null, country: "AT", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709560421, @@ -5932,7 +5849,6 @@ export const PADDLING_POOL_257 = () => customUrl: "zylerisafool", inGameName: "TM©Zyler#2894", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709562784, @@ -5945,7 +5861,6 @@ export const PADDLING_POOL_257 = () => customUrl: "v1p3r", inGameName: "V1P3R☆#2962", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709577646, @@ -6012,6 +5927,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709744323, @@ -6024,7 +5940,6 @@ export const PADDLING_POOL_257 = () => customUrl: "djfroody", inGameName: "<_>Froody#4402", country: "DE", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709744323, @@ -6037,7 +5952,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709746879, @@ -6050,7 +5964,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "<_>Nghtmre#2433", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709747066, @@ -6063,7 +5976,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "<_>Weemo#2306", country: "CH", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709747080, @@ -6076,7 +5988,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709749833, @@ -6143,6 +6054,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709677397, @@ -6155,7 +6067,6 @@ export const PADDLING_POOL_257 = () => customUrl: "yumsie", inGameName: "yuums#1006", country: null, - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709677397, @@ -6168,7 +6079,6 @@ export const PADDLING_POOL_257 = () => customUrl: "shl69", inGameName: "LOWTIERShL#9645", country: "RU", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709677403, @@ -6181,7 +6091,6 @@ export const PADDLING_POOL_257 = () => customUrl: "soosh", inGameName: "soosh ;3#9106", country: "SE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709677405, @@ -6194,7 +6103,6 @@ export const PADDLING_POOL_257 = () => customUrl: "cajus", inGameName: "Cajus#2115", country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709700369, @@ -6256,6 +6164,7 @@ export const PADDLING_POOL_257 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709618711, @@ -6268,7 +6177,6 @@ export const PADDLING_POOL_257 = () => customUrl: "flip", inGameName: "GGG Flip#5641", country: "DE", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1709618711, @@ -6281,7 +6189,6 @@ export const PADDLING_POOL_257 = () => customUrl: "noot", inGameName: "GGG Noot#2393", country: "DK", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709620129, @@ -6294,7 +6201,6 @@ export const PADDLING_POOL_257 = () => customUrl: "chaoticarlyn", inGameName: "GGG Arlyn#1987", country: "DK", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709621809, @@ -6307,7 +6213,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: null, country: "NL", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709640176, @@ -6320,7 +6225,6 @@ export const PADDLING_POOL_257 = () => customUrl: null, inGameName: "Lianzi#3090", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1709654306, @@ -7976,6 +7880,7 @@ export const PADDLING_POOL_255 = () => ctx: { id: 18, organization: null, + tags: null, eventId: 1286, settings: { bracketProgression: [ @@ -8092,6 +7997,7 @@ export const PADDLING_POOL_255 = () => seed: 1, prefersNotToHost: 1, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708476597, @@ -8130,7 +8036,6 @@ export const PADDLING_POOL_255 = () => customUrl: "bab", inGameName: null, country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708476602, @@ -8205,6 +8110,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708535137, @@ -8318,6 +8224,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708533764, @@ -8330,7 +8237,6 @@ export const PADDLING_POOL_255 = () => customUrl: "haru", inGameName: "MG haru#2445", country: "FR", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708533764, @@ -8441,6 +8347,7 @@ export const PADDLING_POOL_255 = () => seed: 4, prefersNotToHost: 1, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708537512, @@ -8466,7 +8373,6 @@ export const PADDLING_POOL_255 = () => customUrl: "teensuicide", inGameName: null, country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708537563, @@ -8567,6 +8473,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708533309, @@ -8680,6 +8587,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708430641, @@ -8731,7 +8639,6 @@ export const PADDLING_POOL_255 = () => customUrl: "proto", inGameName: "-> Proto#4769", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708489707, @@ -8806,6 +8713,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708536306, @@ -8916,6 +8824,7 @@ export const PADDLING_POOL_255 = () => seed: 8, prefersNotToHost: 1, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708526368, @@ -8928,7 +8837,6 @@ export const PADDLING_POOL_255 = () => customUrl: "ilias", inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708526368, @@ -8954,7 +8862,6 @@ export const PADDLING_POOL_255 = () => customUrl: "la_mystifiance", inGameName: "MYSTIIIIIK#2855", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708527117, @@ -9029,6 +8936,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708506060, @@ -9054,7 +8962,6 @@ export const PADDLING_POOL_255 = () => customUrl: "keurbii", inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708506068, @@ -9067,7 +8974,6 @@ export const PADDLING_POOL_255 = () => customUrl: "naka", inGameName: "Nakaverne#1908", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708506073, @@ -9093,7 +8999,6 @@ export const PADDLING_POOL_255 = () => customUrl: "kchouuu", inGameName: "ZkG Kchou'#7905", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708506761, @@ -9106,7 +9011,6 @@ export const PADDLING_POOL_255 = () => customUrl: "kaiju", inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708512496, @@ -9168,6 +9072,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708526814, @@ -9180,7 +9085,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "Bomm☆Sz♪#1943", country: "FR", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708526814, @@ -9206,7 +9110,6 @@ export const PADDLING_POOL_255 = () => customUrl: "jiky", inGameName: "Sて Jιky#3308", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708526839, @@ -9219,7 +9122,6 @@ export const PADDLING_POOL_255 = () => customUrl: "adil", inGameName: null, country: "DZ", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708526882, @@ -9278,6 +9180,7 @@ export const PADDLING_POOL_255 = () => seed: 11, prefersNotToHost: 1, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708466421, @@ -9290,7 +9193,6 @@ export const PADDLING_POOL_255 = () => customUrl: "shadow_carbon", inGameName: "✞Shadøw#2265", country: "PT", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708466421, @@ -9303,7 +9205,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "Lottared!#2387", country: "RU", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708466429, @@ -9316,7 +9217,6 @@ export const PADDLING_POOL_255 = () => customUrl: "bake", inGameName: "り·Baké#2955", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708466434, @@ -9329,7 +9229,6 @@ export const PADDLING_POOL_255 = () => customUrl: "hiro", inGameName: " hiro#1617", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708466442, @@ -9342,7 +9241,6 @@ export const PADDLING_POOL_255 = () => customUrl: "dakirikouuu", inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708538756, @@ -9404,6 +9302,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708377426, @@ -9416,7 +9315,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: "ES", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708377426, @@ -9429,7 +9327,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "い izoweN#2592", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708377436, @@ -9442,7 +9339,6 @@ export const PADDLING_POOL_255 = () => customUrl: "aprhodite", inGameName: "Aprhodite#2749", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708377438, @@ -9455,7 +9351,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "い Neomegax#2245", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708377441, @@ -9468,7 +9363,6 @@ export const PADDLING_POOL_255 = () => customUrl: "seb", inGameName: "200FULLBOX#1297", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708441387, @@ -9527,6 +9421,7 @@ export const PADDLING_POOL_255 = () => seed: 13, prefersNotToHost: 1, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708448289, @@ -9539,7 +9434,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708448289, @@ -9552,7 +9446,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708448337, @@ -9565,7 +9458,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "4 γµshi~#2216", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708448389, @@ -9578,7 +9470,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "4 Devil~#1653", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708448483, @@ -9591,7 +9482,6 @@ export const PADDLING_POOL_255 = () => customUrl: "bandito", inGameName: null, country: "EE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708529130, @@ -9604,7 +9494,6 @@ export const PADDLING_POOL_255 = () => customUrl: "dismaqe", inGameName: null, country: "EE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708529242, @@ -9666,6 +9555,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708532602, @@ -9678,7 +9568,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "Space#0329", country: "ES", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708532602, @@ -9691,7 +9580,6 @@ export const PADDLING_POOL_255 = () => customUrl: "alerri", inGameName: "Alexri#5508", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708532608, @@ -9704,7 +9592,6 @@ export const PADDLING_POOL_255 = () => customUrl: "akygos", inGameName: "Akygos#2217", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708532611, @@ -9717,7 +9604,6 @@ export const PADDLING_POOL_255 = () => customUrl: "ruben", inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708532829, @@ -9779,6 +9665,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708535205, @@ -9791,7 +9678,6 @@ export const PADDLING_POOL_255 = () => customUrl: "agatespl", inGameName: "AGATE#1417", country: "NG", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708535205, @@ -9804,7 +9690,6 @@ export const PADDLING_POOL_255 = () => customUrl: "xino", inGameName: "XINOBI!#2889", country: "SN", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708535233, @@ -9817,7 +9702,6 @@ export const PADDLING_POOL_255 = () => customUrl: "peli", inGameName: "™Peli#1223", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708535987, @@ -9830,7 +9714,6 @@ export const PADDLING_POOL_255 = () => customUrl: "gaberainery", inGameName: "Gabe#1867", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708536053, @@ -9843,7 +9726,6 @@ export const PADDLING_POOL_255 = () => customUrl: "benx", inGameName: "Benxium#3215", country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708538642, @@ -9905,6 +9787,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708515945, @@ -9917,7 +9800,6 @@ export const PADDLING_POOL_255 = () => customUrl: "necrew", inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708515945, @@ -9930,7 +9812,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708515949, @@ -9943,7 +9824,6 @@ export const PADDLING_POOL_255 = () => customUrl: "angeel", inGameName: "May ナー#3235", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708515954, @@ -9956,7 +9836,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "Gb Armand #1593", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708536412, @@ -10018,6 +9897,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708453334, @@ -10030,7 +9910,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "ラブ Zeke#1927", country: "ES", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708453334, @@ -10043,7 +9922,6 @@ export const PADDLING_POOL_255 = () => customUrl: "lacyice", inGameName: "Lacyice#2603", country: "SE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708453338, @@ -10056,7 +9934,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708453341, @@ -10069,7 +9946,6 @@ export const PADDLING_POOL_255 = () => customUrl: "rrayhm", inGameName: "tax evader#2461", country: "FI", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708453343, @@ -10128,6 +10004,7 @@ export const PADDLING_POOL_255 = () => seed: 18, prefersNotToHost: 1, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708522730, @@ -10140,7 +10017,6 @@ export const PADDLING_POOL_255 = () => customUrl: "hyperstar", inGameName: "▼* Hyper☆#1744", country: "GB", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708522730, @@ -10153,7 +10029,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: "PT", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708522740, @@ -10166,7 +10041,6 @@ export const PADDLING_POOL_255 = () => customUrl: "buffheavy", inGameName: "salty#2163", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708522745, @@ -10179,7 +10053,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "Slasher#1494", country: "BE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708522748, @@ -10192,7 +10065,6 @@ export const PADDLING_POOL_255 = () => customUrl: "yaga", inGameName: "▼* yaga . #3291", country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708522751, @@ -10254,6 +10126,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708375443, @@ -10266,7 +10139,6 @@ export const PADDLING_POOL_255 = () => customUrl: "enamel", inGameName: "Enamel#2070", country: "AT", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708375443, @@ -10279,7 +10151,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "[DI] Polly#1095", country: "NO", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708375472, @@ -10292,7 +10163,6 @@ export const PADDLING_POOL_255 = () => customUrl: "eider", inGameName: "Eider :3#2363", country: "MX", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708459362, @@ -10305,7 +10175,6 @@ export const PADDLING_POOL_255 = () => customUrl: "sfntr", inGameName: "SFNTR#1928", country: "MA", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708524557, @@ -10318,7 +10187,6 @@ export const PADDLING_POOL_255 = () => customUrl: "acing", inGameName: "∴§∵ Acing#2148", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708535255, @@ -10380,6 +10248,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708532665, @@ -10392,7 +10261,6 @@ export const PADDLING_POOL_255 = () => customUrl: "shiruu_", inGameName: "-シルウ-#2124", country: "DE", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708532665, @@ -10405,7 +10273,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "ねこ#12226", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708532693, @@ -10418,7 +10285,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708533020, @@ -10431,7 +10297,6 @@ export const PADDLING_POOL_255 = () => customUrl: "wolfinium", inGameName: "moo Wolfi#6655", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708534559, @@ -10498,6 +10363,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708364254, @@ -10510,7 +10376,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: "DE", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708364254, @@ -10523,7 +10388,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "lookitslu#9311", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708364259, @@ -10536,7 +10400,6 @@ export const PADDLING_POOL_255 = () => customUrl: "skyend", inGameName: "SkyEnd <3#1382", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708364262, @@ -10549,7 +10412,6 @@ export const PADDLING_POOL_255 = () => customUrl: "spheonix", inGameName: "$ρhηiχ▽LOS#3326", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708364266, @@ -10562,7 +10424,6 @@ export const PADDLING_POOL_255 = () => customUrl: "sakeo", inGameName: "something with sakeo#9999", country: "NL", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708536943, @@ -10629,6 +10490,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708464101, @@ -10641,7 +10503,6 @@ export const PADDLING_POOL_255 = () => customUrl: "equira", inGameName: "Equira~#1561", country: "NL", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708464101, @@ -10654,7 +10515,6 @@ export const PADDLING_POOL_255 = () => customUrl: "neemadreamer", inGameName: "★Neema★#2702", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708464106, @@ -10667,7 +10527,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708464107, @@ -10680,7 +10539,6 @@ export const PADDLING_POOL_255 = () => customUrl: "season", inGameName: "season#2514", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708464108, @@ -10693,7 +10551,6 @@ export const PADDLING_POOL_255 = () => customUrl: "harryxyz", inGameName: "MLP★Harry#1007", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708464111, @@ -10757,6 +10614,7 @@ export const PADDLING_POOL_255 = () => seed: 23, prefersNotToHost: 1, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708520249, @@ -10769,7 +10627,6 @@ export const PADDLING_POOL_255 = () => customUrl: "smmuiii", inGameName: "ハバタクカミ#8074", country: "DE", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708520249, @@ -10782,7 +10639,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "みやむら#2759", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708521940, @@ -10795,7 +10651,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708526825, @@ -10808,7 +10663,6 @@ export const PADDLING_POOL_255 = () => customUrl: "nexus_spl", inGameName: "Neχus♪#9314", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708526832, @@ -10821,7 +10675,6 @@ export const PADDLING_POOL_255 = () => customUrl: "patfat", inGameName: "αм »patツ#8728", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708527650, @@ -10883,6 +10736,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708535804, @@ -10895,7 +10749,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "Mop#3970", country: "GB", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708535804, @@ -10908,7 +10761,6 @@ export const PADDLING_POOL_255 = () => customUrl: "pallo_spl", inGameName: "Pallo♪#1547", country: "DK", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708535807, @@ -10921,7 +10773,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "¥Endo#1758", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708535808, @@ -10934,7 +10785,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "★Dark☆#2415", country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708535811, @@ -10996,6 +10846,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708535891, @@ -11008,7 +10859,6 @@ export const PADDLING_POOL_255 = () => customUrl: "ati", inGameName: "Ati#1543", country: "TR", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708535891, @@ -11021,7 +10871,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "AliDerBoss#4018", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708535898, @@ -11034,7 +10883,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "Chris#1351", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708535907, @@ -11047,7 +10895,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "Obēd1ēnt#3231", country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708535910, @@ -11060,7 +10907,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708535940, @@ -11122,6 +10968,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708521749, @@ -11134,7 +10981,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "[DI] Tiger#1131", country: "GB", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708521749, @@ -11147,7 +10993,6 @@ export const PADDLING_POOL_255 = () => customUrl: "mooj", inGameName: "[DI] mooj#1498", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708521759, @@ -11160,7 +11005,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "[DI] tame#2126", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708521763, @@ -11173,7 +11017,6 @@ export const PADDLING_POOL_255 = () => customUrl: "scepidilionz", inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708521766, @@ -11186,7 +11029,6 @@ export const PADDLING_POOL_255 = () => customUrl: "afroking", inGameName: "[DI] Afro#1667", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708521774, @@ -11248,6 +11090,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708536584, @@ -11260,7 +11103,6 @@ export const PADDLING_POOL_255 = () => customUrl: "protoh3d", inGameName: "proto#2463", country: "IT", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708536584, @@ -11273,7 +11115,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "Dragon#1120", country: "IT", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708536597, @@ -11286,7 +11127,6 @@ export const PADDLING_POOL_255 = () => customUrl: "ohitsana19", inGameName: "сн;An An#4207", country: "CH", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708536705, @@ -11299,7 +11139,6 @@ export const PADDLING_POOL_255 = () => customUrl: "byabyabya", inGameName: "{} bee-a #3122", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708537202, @@ -11361,6 +11200,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708537772, @@ -11373,7 +11213,6 @@ export const PADDLING_POOL_255 = () => customUrl: "splatos", inGameName: "仝Splatos仝#1932", country: "FR", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708537772, @@ -11386,7 +11225,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708537777, @@ -11399,7 +11237,6 @@ export const PADDLING_POOL_255 = () => customUrl: "inkurey22", inGameName: "の{Curry#4218", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708537780, @@ -11412,7 +11249,6 @@ export const PADDLING_POOL_255 = () => customUrl: "alonika", inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708537783, @@ -11438,7 +11274,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "仝Lowasis ♪#3146", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708543316, @@ -11505,6 +11340,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708379916, @@ -11517,7 +11353,6 @@ export const PADDLING_POOL_255 = () => customUrl: "cronik", inGameName: "CrⓄnik#1845", country: "IT", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708379916, @@ -11530,7 +11365,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "Yp carota #1253", country: "IT", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708379926, @@ -11543,7 +11377,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "Anca ðx#6380", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708379930, @@ -11556,7 +11389,6 @@ export const PADDLING_POOL_255 = () => customUrl: "waffleuser", inGameName: "ソρ くkuriり#2152", country: "NL", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708379935, @@ -11569,7 +11401,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708379937, @@ -11631,6 +11462,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708519753, @@ -11643,7 +11475,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "2.GoldA#2405", country: "DE", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708519753, @@ -11656,7 +11487,6 @@ export const PADDLING_POOL_255 = () => customUrl: "flemmi", inGameName: "2.flemmi#3395", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708519764, @@ -11669,7 +11499,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "2.WolfiJr#1423", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708519774, @@ -11682,7 +11511,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "2.piiiro?!#1274", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708519786, @@ -11695,7 +11523,6 @@ export const PADDLING_POOL_255 = () => customUrl: "ninjar04", inGameName: "Ninjar04#1774", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708519793, @@ -11762,6 +11589,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708534312, @@ -11774,7 +11602,6 @@ export const PADDLING_POOL_255 = () => customUrl: "kyopon", inGameName: "Kyopon#2269", country: "FR", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708534312, @@ -11787,7 +11614,6 @@ export const PADDLING_POOL_255 = () => customUrl: "skyban", inGameName: "Skyban#1919", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708534331, @@ -11800,7 +11626,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "Slord.#2406", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708534335, @@ -11813,7 +11638,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708534343, @@ -11826,7 +11650,6 @@ export const PADDLING_POOL_255 = () => customUrl: "coolkidnextdoor", inGameName: "Katchanえ#2466", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708536150, @@ -11890,6 +11713,7 @@ export const PADDLING_POOL_255 = () => seed: 32, prefersNotToHost: 1, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708531929, @@ -11902,7 +11726,6 @@ export const PADDLING_POOL_255 = () => customUrl: "capri", inGameName: "capri :')#1930", country: "AT", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708531929, @@ -11915,7 +11738,6 @@ export const PADDLING_POOL_255 = () => customUrl: "r", inGameName: "2.RJ#1600", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708531954, @@ -11928,7 +11750,6 @@ export const PADDLING_POOL_255 = () => customUrl: "senator", inGameName: "sapnu puas#3233", country: "DE", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708531966, @@ -11941,7 +11762,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: "AT", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708534592, @@ -12003,6 +11823,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708477155, @@ -12015,7 +11836,6 @@ export const PADDLING_POOL_255 = () => customUrl: "kym", inGameName: "CHAEWON □#8872", country: "PH", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708477155, @@ -12028,7 +11848,6 @@ export const PADDLING_POOL_255 = () => customUrl: "bazin", inGameName: "Bazin#1533", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708477159, @@ -12041,7 +11860,6 @@ export const PADDLING_POOL_255 = () => customUrl: "steeze", inGameName: "YUNJIN <3#3252", country: "MY", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708477162, @@ -12054,7 +11872,6 @@ export const PADDLING_POOL_255 = () => customUrl: "onionzura", inGameName: "kohammy <3#1762", country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708482782, @@ -12121,6 +11938,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708531564, @@ -12133,7 +11951,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: "KP", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708531564, @@ -12146,7 +11963,6 @@ export const PADDLING_POOL_255 = () => customUrl: "shiromg", inGameName: "Shiro ツ#2933", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708531574, @@ -12159,7 +11975,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "Inkle#4537", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708531640, @@ -12172,7 +11987,6 @@ export const PADDLING_POOL_255 = () => customUrl: "thewave", inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708532419, @@ -12185,7 +11999,6 @@ export const PADDLING_POOL_255 = () => customUrl: "kadxx", inGameName: "ZkG Kadxx#1086", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708533636, @@ -12198,7 +12011,6 @@ export const PADDLING_POOL_255 = () => customUrl: "kamarade", inGameName: "GB Solev#1587", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708540197, @@ -12211,7 +12023,6 @@ export const PADDLING_POOL_255 = () => customUrl: "luka", inGameName: "∆Luka~#2385", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708543351, @@ -12278,6 +12089,7 @@ export const PADDLING_POOL_255 = () => noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708503356, @@ -12290,7 +12102,6 @@ export const PADDLING_POOL_255 = () => customUrl: "rekie", inGameName: "よ°rekie#3307", country: "GB", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1708503356, @@ -12303,7 +12114,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "Shortcake!#2855", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708503369, @@ -12316,7 +12126,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: "Tetra#3027", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708503374, @@ -12329,7 +12138,6 @@ export const PADDLING_POOL_255 = () => customUrl: null, inGameName: null, country: "MT", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708503381, @@ -12342,7 +12150,6 @@ export const PADDLING_POOL_255 = () => customUrl: "alphiqus", inGameName: "Alphi#1030", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708503385, @@ -12355,7 +12162,6 @@ export const PADDLING_POOL_255 = () => customUrl: "asri", inGameName: "FBK Asri#5473", country: "RU", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1708503399, @@ -14311,6 +14117,7 @@ export const IN_THE_ZONE_32 = ({ ctx: { id: 11, organization: null, + tags: null, eventId: 1134, settings: { bracketProgression: [ @@ -14391,6 +14198,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707443313, @@ -14491,6 +14299,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707366405, @@ -14591,6 +14400,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1706912643, @@ -14691,6 +14501,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707359335, @@ -14817,6 +14628,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707171426, @@ -14930,6 +14742,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707342696, @@ -15043,6 +14856,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707513942, @@ -15169,6 +14983,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707526815, @@ -15295,6 +15110,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707583385, @@ -15395,6 +15211,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707486395, @@ -15495,6 +15312,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707513290, @@ -15595,6 +15413,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707531084, @@ -15695,6 +15514,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707568466, @@ -15808,6 +15628,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707481625, @@ -15908,6 +15729,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707530166, @@ -15959,7 +15781,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: null, inGameName: null, country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707530172, @@ -16008,6 +15829,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707181792, @@ -16121,6 +15943,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707550321, @@ -16239,6 +16062,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707575096, @@ -16352,6 +16176,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707569490, @@ -16478,6 +16303,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707537425, @@ -16578,6 +16404,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707564691, @@ -16629,7 +16456,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "haru", inGameName: "MG haru#2445", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707564699, @@ -16655,7 +16481,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "shark", inGameName: "EU_Shark#1136", country: null, - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707584403, @@ -16709,6 +16534,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707145818, @@ -16816,6 +16642,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707558330, @@ -16841,7 +16668,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "keurbii", inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707558336, @@ -16854,7 +16680,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "dakirikouuu", inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707558339, @@ -16867,7 +16692,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "naka", inGameName: "Nakaverne#1908", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707558342, @@ -16916,6 +16740,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707586842, @@ -16941,7 +16766,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: null, inGameName: "Caad#2876", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707586869, @@ -16967,7 +16791,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "rosearrow", inGameName: "†’Rose#1636", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707586936, @@ -17016,6 +16839,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707583597, @@ -17028,7 +16852,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: null, inGameName: null, country: "ES", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1707583597, @@ -17041,7 +16864,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: null, inGameName: null, country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707583602, @@ -17054,7 +16876,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: null, inGameName: "い Neomegax#2245", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707583609, @@ -17067,7 +16888,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: null, inGameName: "キおう 〆仝 At⇔#3946", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707583616, @@ -17080,7 +16900,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "seb", inGameName: "200FULLBOX#1297", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707586602, @@ -17093,7 +16912,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "aprhodite", inGameName: "Aprhodite#2749", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707586606, @@ -17142,6 +16960,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707429804, @@ -17154,7 +16973,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: null, inGameName: "Space#0329", country: "ES", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1707429804, @@ -17167,7 +16985,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "akygos", inGameName: "Akygos#2217", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707429808, @@ -17180,7 +16997,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "alerri", inGameName: "Alexri#5508", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707571232, @@ -17193,7 +17009,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "cidy", inGameName: null, country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707586254, @@ -17206,7 +17021,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "lasky", inGameName: "Lasky#3152", country: "ES", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707586657, @@ -17255,6 +17069,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707539973, @@ -17267,7 +17082,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "elemental", inGameName: "ELEMENTAL!#1489", country: "CA", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1707539973, @@ -17280,7 +17094,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "munkee", inGameName: "MUNKEE!!!!#1357", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707539978, @@ -17293,7 +17106,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "bubbles", inGameName: "●βubbles#1084", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707539980, @@ -17319,7 +17131,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "mel0mania", inGameName: "MEL0MANIA★#1137", country: "CA", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707539985, @@ -17373,6 +17184,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707507831, @@ -17385,7 +17197,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "alexxx", inGameName: null, country: "US", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1707507831, @@ -17398,7 +17209,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "radishes", inGameName: null, country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707507835, @@ -17411,7 +17221,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "kabi", inGameName: "Kabi#5484", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707507836, @@ -17424,7 +17233,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "ang", inGameName: "ang#1115", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707507840, @@ -17437,7 +17245,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "noxraven42", inGameName: null, country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707507912, @@ -17486,6 +17293,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707586297, @@ -17498,7 +17306,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "rexyyy", inGameName: null, country: "HN", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1707586297, @@ -17511,7 +17318,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "bdusty", inGameName: "b.dusty#1304", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707586302, @@ -17524,7 +17330,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "phantom_spl", inGameName: "Phantom#5343", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707586330, @@ -17537,7 +17342,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "eider", inGameName: "Eider :3#2363", country: "MX", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707587341, @@ -17550,7 +17354,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "echo", inGameName: "1¤ echo!#2760", country: "GB", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707587544, @@ -17596,6 +17399,7 @@ export const IN_THE_ZONE_32 = ({ seed: 30, prefersNotToHost: 1, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707583885, @@ -17608,7 +17412,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "ty", inGameName: "マ∞マTyraid#2368", country: "US", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1707583885, @@ -17621,7 +17424,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "eziooooo", inGameName: null, country: "CA", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707583904, @@ -17634,7 +17436,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "soro", inGameName: ".Soro<3#3320", country: "CU", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707583961, @@ -17647,7 +17448,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "guigas", inGameName: "σ Guigas#6660", country: "BR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707584003, @@ -17660,7 +17460,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "nowpose", inGameName: "Pose.#2400", country: "US", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707586447, @@ -17673,7 +17472,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "datzu", inGameName: "Datzu#1760", country: "CO", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707592366, @@ -17722,6 +17520,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707578076, @@ -17734,7 +17533,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: null, inGameName: "pk sili#2673", country: "FR", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1707578076, @@ -17760,7 +17558,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "kura1708", inGameName: "kura#3173", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707578080, @@ -17773,7 +17570,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "klaz", inGameName: "Klaz#3153", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707578084, @@ -17786,7 +17582,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "tentman", inGameName: "「♪」 Layrin#3133", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707578089, @@ -17837,6 +17632,7 @@ export const IN_THE_ZONE_32 = ({ seed: 32, prefersNotToHost: 1, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707582953, @@ -17849,7 +17645,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "shadow_carbon", inGameName: "✞Shadøw#2265", country: "PT", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1707582953, @@ -17862,7 +17657,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "hiro", inGameName: " hiro#1617", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707582958, @@ -17875,7 +17669,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: null, inGameName: "Lottared!#2387", country: "RU", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707582962, @@ -17888,7 +17681,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "bake", inGameName: "り·Baké#2955", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707582993, @@ -17937,6 +17729,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707575330, @@ -17949,7 +17742,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "chiaki_spl", inGameName: null, country: "FR", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1707575330, @@ -17962,7 +17754,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "mirval", inGameName: "Mirval#1257", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707575334, @@ -17975,7 +17766,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "mishy", inGameName: "mishy#2235", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707575341, @@ -17988,7 +17778,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: null, inGameName: "Aerα#4357", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707575345, @@ -18001,7 +17790,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "akuma", inGameName: "Akuma#9476", country: "FR", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707575350, @@ -18057,6 +17845,7 @@ export const IN_THE_ZONE_32 = ({ noScreen: 0, team: null, inviteCode: null, + avgSeedingSkillOrdinal: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707527645, @@ -18069,7 +17858,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: null, inGameName: null, country: "US", - plusTier: null, twitch: null, isOwner: 1, createdAt: 1707527645, @@ -18082,7 +17870,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "okaysaffra", inGameName: "ƒ* saffra#7686", country: "CA", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707527672, @@ -18095,7 +17882,6 @@ export const IN_THE_ZONE_32 = ({ customUrl: "gyaru", inGameName: "3★ GYARU#1420", country: "CA", - plusTier: null, twitch: null, isOwner: 0, createdAt: 1707534384, diff --git a/app/features/tournament-bracket/core/tests/test-utils.ts b/app/features/tournament-bracket/core/tests/test-utils.ts index e90c98d9c9..8d61160f14 100644 --- a/app/features/tournament-bracket/core/tests/test-utils.ts +++ b/app/features/tournament-bracket/core/tests/test-utils.ts @@ -13,6 +13,7 @@ const tournamentCtxTeam = ( createdAt: 0, id: teamId, inviteCode: null, + avgSeedingSkillOrdinal: null, team: null, mapPool: [], members: [], @@ -58,6 +59,7 @@ export const testTournament = ({ ctx: { eventId: 1, id: 1, + tags: null, description: null, organization: null, rules: null, diff --git a/app/features/tournament-bracket/queries/addSummary.server.ts b/app/features/tournament-bracket/queries/addSummary.server.ts index 7157cb8f24..f715be9fa7 100644 --- a/app/features/tournament-bracket/queries/addSummary.server.ts +++ b/app/features/tournament-bracket/queries/addSummary.server.ts @@ -27,6 +27,23 @@ const addSkillStm = sql.prepare(/* sql */ ` ) returning * `); +// on conflict it replaces (set in migration) +const addSeedingSkillStm = sql.prepare(/* sql */ ` + insert into "SeedingSkill" ( + "type", + "mu", + "sigma", + "ordinal", + "userId" + ) values ( + @type, + @mu, + @sigma, + @ordinal, + @userId + ) +`); + const addSkillTeamUserStm = sql.prepare(/* sql */ ` insert into "SkillTeamUser" ( "skillId", @@ -135,6 +152,16 @@ export const addSummary = sql.transaction( } } + for (const seedingSkill of summary.seedingSkills) { + addSeedingSkillStm.run({ + type: seedingSkill.type, + mu: seedingSkill.mu, + sigma: seedingSkill.sigma, + ordinal: seedingSkill.ordinal, + userId: seedingSkill.userId, + }); + } + for (const mapResultDelta of summary.mapResultDeltas) { addMapResultDeltaStm.run({ mode: mapResultDelta.mode, diff --git a/app/features/tournament-bracket/routes/to.$id.brackets.tsx b/app/features/tournament-bracket/routes/to.$id.brackets.tsx index befaa395e5..923d9c1e68 100644 --- a/app/features/tournament-bracket/routes/to.$id.brackets.tsx +++ b/app/features/tournament-bracket/routes/to.$id.brackets.tsx @@ -23,6 +23,7 @@ import { requireUser } from "~/features/auth/core/user.server"; import { queryCurrentTeamRating, queryCurrentUserRating, + queryCurrentUserSeedingRating, queryTeamPlayerRatingAverage, } from "~/features/mmr/mmr-utils.server"; import { currentSeason } from "~/features/mmr/season"; @@ -208,23 +209,36 @@ export const action: ActionFunction = async ({ params, request }) => { const season = currentSeason(tournament.ctx.startTime)?.nth; + const seedingSkillCountsFor = tournament.skillCountsFor; + const summary = tournamentSummary({ + teams: tournament.ctx.teams, + finalStandings: _finalStandings, + results, + calculateSeasonalStats: tournament.ranked, + queryCurrentTeamRating: (identifier) => + queryCurrentTeamRating({ identifier, season: season! }).rating, + queryCurrentUserRating: (userId) => + queryCurrentUserRating({ userId, season: season! }).rating, + queryTeamPlayerRatingAverage: (identifier) => + queryTeamPlayerRatingAverage({ + identifier, + season: season!, + }), + queryCurrentSeedingRating: (userId) => + queryCurrentUserSeedingRating({ + userId, + type: seedingSkillCountsFor!, + }), + seedingSkillCountsFor, + }); + + logger.info( + `Inserting tournament summary. Tournament id: ${tournamentId}, mapResultDeltas.lenght: ${summary.mapResultDeltas.length}, playerResultDeltas.length ${summary.playerResultDeltas.length}, tournamentResults.length ${summary.tournamentResults.length}, skills.length ${summary.skills.length}, seedingSkills.length ${summary.seedingSkills.length}`, + ); + addSummary({ tournamentId, - summary: tournamentSummary({ - teams: tournament.ctx.teams, - finalStandings: _finalStandings, - results, - calculateSeasonalStats: tournament.ranked, - queryCurrentTeamRating: (identifier) => - queryCurrentTeamRating({ identifier, season: season! }).rating, - queryCurrentUserRating: (userId) => - queryCurrentUserRating({ userId, season: season! }).rating, - queryTeamPlayerRatingAverage: (identifier) => - queryTeamPlayerRatingAverage({ - identifier, - season: season!, - }), - }), + summary, season, }); diff --git a/app/features/tournament/TournamentRepository.server.ts b/app/features/tournament/TournamentRepository.server.ts index 0432bd4b59..b5a172a62d 100644 --- a/app/features/tournament/TournamentRepository.server.ts +++ b/app/features/tournament/TournamentRepository.server.ts @@ -21,6 +21,13 @@ import { HACKY_resolvePicture } from "./tournament-utils"; export type FindById = NonNullable>; export async function findById(id: number) { + const isSetAsRanked = await db + .selectFrom("Tournament") + .select("settings") + .where("id", "=", id) + .executeTakeFirst() + .then((row) => row?.settings.isRanked ?? false); + const result = await db .selectFrom("Tournament") .innerJoin("CalendarEvent", "Tournament.id", "CalendarEvent.tournamentId") @@ -33,6 +40,7 @@ export async function findById(id: number) { "Tournament.id", "CalendarEvent.id as eventId", "CalendarEvent.discordUrl", + "CalendarEvent.tags", "Tournament.settings", "Tournament.castTwitchAccounts", "Tournament.castedMatchesInfo", @@ -154,7 +162,15 @@ export async function findById(id: number) { innerEb .selectFrom("TournamentTeamMember") .innerJoin("User", "TournamentTeamMember.userId", "User.id") - .leftJoin("PlusTier", "User.id", "PlusTier.userId") + .leftJoin("SeedingSkill", (join) => + join + .onRef("User.id", "=", "SeedingSkill.userId") + .on( + "SeedingSkill.type", + "=", + isSetAsRanked ? "RANKED" : "UNRANKED", + ), + ) .select([ "User.id as userId", "User.username", @@ -163,7 +179,7 @@ export async function findById(id: number) { "User.customUrl", "User.country", "User.twitch", - "PlusTier.tier as plusTier", + "SeedingSkill.ordinal", "TournamentTeamMember.isOwner", "TournamentTeamMember.createdAt", sql /*sql*/`coalesce( @@ -269,13 +285,27 @@ export async function findById(id: number) { return { ...result, + teams: result.teams.map((team) => ({ + ...team, + members: team.members.map(({ ordinal, ...member }) => member), + avgSeedingSkillOrdinal: nullifyingAvg( + team.members + .map((member) => member.ordinal) + .filter((ordinal) => typeof ordinal === "number"), + ), + })), logoSrc: result.logoUrl ? userSubmittedImage(result.logoUrl) - : `${import.meta.env.VITE_SITE_DOMAIN}${HACKY_resolvePicture(result)}`, + : HACKY_resolvePicture(result), participatedUsers: result.participatedUsers.map((user) => user.userId), }; } +function nullifyingAvg(values: number[]) { + if (values.length === 0) return null; + return values.reduce((acc, cur) => acc + cur, 0) / values.length; +} + export async function findTOSetMapPoolById(tournamentId: number) { return ( await db diff --git a/app/features/tournament/routes/to.$id.seeds.tsx b/app/features/tournament/routes/to.$id.seeds.tsx index fca419bd5e..8fcc31f96e 100644 --- a/app/features/tournament/routes/to.$id.seeds.tsx +++ b/app/features/tournament/routes/to.$id.seeds.tsx @@ -13,18 +13,9 @@ import { sortableKeyboardCoordinates, verticalListSortingStrategy, } from "@dnd-kit/sortable"; -import type { - ActionFunction, - LoaderFunctionArgs, - SerializeFrom, -} from "@remix-run/node"; +import type { ActionFunction, LoaderFunctionArgs } from "@remix-run/node"; import { redirect } from "@remix-run/node"; -import { - Link, - useFetcher, - useLoaderData, - useNavigation, -} from "@remix-run/react"; +import { Link, useFetcher, useNavigation } from "@remix-run/react"; import clsx from "clsx"; import clone from "just-clone"; import * as React from "react"; @@ -32,13 +23,8 @@ import { Alert } from "~/components/Alert"; import { Button } from "~/components/Button"; import { Catcher } from "~/components/Catcher"; import { Draggable } from "~/components/Draggable"; -import { Image, TierImage } from "~/components/Image"; -import { Label } from "~/components/Label"; import { SubmitButton } from "~/components/SubmitButton"; -import { Toggle } from "~/components/Toggle"; import { requireUser } from "~/features/auth/core/user.server"; -import { cachedFullUserLeaderboard } from "~/features/leaderboards/core/leaderboards.server"; -import { currentOrPreviousSeason } from "~/features/mmr/season"; import { type TournamentDataTeam, clearTournamentDataCache, @@ -47,11 +33,10 @@ import { import { useTimeoutState } from "~/hooks/useTimeoutState"; import invariant from "~/utils/invariant"; import { parseRequestPayload, validate } from "~/utils/remix.server"; -import { - navIconUrl, - tournamentBracketsPage, - userResultsPage, -} from "~/utils/urls"; +import { tournamentBracketsPage, userResultsPage } from "~/utils/urls"; +import { Avatar } from "../../../components/Avatar"; +import { InfoPopover } from "../../../components/InfoPopover"; +import { ordinalToRoundedSp } from "../../mmr/mmr-utils"; import { updateTeamSeeds } from "../queries/updateTeamSeeds.server"; import { seedsActionSchema } from "../tournament-schemas.server"; import { tournamentIdFromParams } from "../tournament-utils"; @@ -85,28 +70,10 @@ export const loader = async ({ params, request }: LoaderFunctionArgs) => { throw redirect(tournamentBracketsPage({ tournamentId })); } - const powers = async (season: number) => { - const leaderboard = await cachedFullUserLeaderboard(season); - - return Object.fromEntries( - leaderboard.map((entry) => { - return [entry.id, { power: entry.power, tier: entry.tier }]; - }), - ); - }; - - const currentSeason = currentOrPreviousSeason(new Date())!.nth; - - return { - powers: { - current: await powers(currentSeason), - previous: await powers(currentSeason - 1), - }, - }; + return null; }; export default function TournamentSeedsPage() { - const data = useLoaderData(); const tournament = useTournament(); const navigation = useNavigation(); const [teamOrder, setTeamOrder] = React.useState( @@ -115,8 +82,6 @@ export default function TournamentSeedsPage() { const [activeTeam, setActiveTeam] = React.useState( null, ); - const [usingPreviousSeasonPowers, setUsingPreviousSeasonPowers] = - React.useState(false); const sensors = useSensors( useSensor(PointerSensor, { activationConstraint: { @@ -132,51 +97,71 @@ export default function TournamentSeedsPage() { (a, b) => teamOrder.indexOf(a.id) - teamOrder.indexOf(b.id), ); - const activePowers = usingPreviousSeasonPowers - ? data.powers.previous - : data.powers.current; - - const rankTeam = (team: TournamentDataTeam) => { - const powers = team.members - .map((m) => activePowers[m.userId]?.power) - .filter(Boolean); + const isOutOfOrder = ( + team: TournamentDataTeam, + previousTeam?: TournamentDataTeam, + ) => { + if (!previousTeam) return false; - if (powers.length === 0) return 0; + if ( + typeof team.avgSeedingSkillOrdinal === "number" && + typeof previousTeam.avgSeedingSkillOrdinal === "number" + ) { + return team.avgSeedingSkillOrdinal > previousTeam.avgSeedingSkillOrdinal; + } - return powers.reduce((acc, cur) => acc + cur, 0) / powers.length; + return Boolean(previousTeam.avgSeedingSkillOrdinal); }; + const noOrganizerSetSeeding = tournament.ctx.teams.every( + (team) => !team.seed, + ); + return (
-
- -
- - -
+
+ {noOrganizerSetSeeding ? ( +
+ As long as you don't manually set the seeding, the teams are + automatically sorted by their seeding points value as participating + players change +
+ ) : ( + + )}
  • -
    Seed
    +
    +
    Name
    +
    + SP + + Seeding point is a value that tracks players' head-to-head + performances in tournaments. Ranked and unranked tournaments have + different points. + +
    Players
    @@ -225,7 +210,16 @@ export default function TournamentSeedsPage() { }, )} > - + ))} @@ -233,7 +227,15 @@ export default function TournamentSeedsPage() { {activeTeam && (
  • - +
  • )} @@ -296,24 +298,33 @@ function SeedAlert({ teamOrder }: { teamOrder: number[] }) { function RowContents({ team, seed, - powers, + teamSeedingSkill, }: { team: TournamentDataTeam; seed?: number; - powers: SerializeFrom["powers"]["current"]; + teamSeedingSkill: { + sp: number | null; + outOfOrder: boolean; + }; }) { + const tournament = useTournament(); + return ( <>
    {seed}
    +
    + {team.team?.logoUrl ? ( + + ) : null} +
    {team.checkIns.length > 0 ? "✅ " : "❌ "} {team.name}
    +
    + {teamSeedingSkill.sp} +
    {team.members.map((member) => { - const { power, tier } = powers[member.userId] ?? {}; - const lonely = - (!power && member.plusTier) || (!member.plusTier && power); - return (
    {member.username} - {member.plusTier ? ( -
    - + - {member.plusTier} -
    - ) : ( -
    - )} - {power ? ( -
    - {power} -
    - ) : null}
    ); })} diff --git a/app/features/tournament/routes/to.$id.tsx b/app/features/tournament/routes/to.$id.tsx index e157006266..d81623c44f 100644 --- a/app/features/tournament/routes/to.$id.tsx +++ b/app/features/tournament/routes/to.$id.tsx @@ -55,6 +55,18 @@ export const meta: MetaFunction = (args) => { const title = makeTitle(data.tournament.ctx.name); + const ogImage = () => { + if ( + !data.tournament.ctx.logoSrc || + data.tournament.ctx.logoSrc.startsWith("https") + ) { + return data.tournament.ctx.logoSrc; + } + + // opengraph does not support relative urls + return `${import.meta.env.VITE_SITE_DOMAIN}${data.tournament.ctx.logoSrc}`; + }; + return [ { title }, { @@ -71,7 +83,7 @@ export const meta: MetaFunction = (args) => { }, { property: "og:image", - content: data.tournament.ctx.logoSrc, + content: ogImage(), }, // Twitter special snowflake tags, see https://developer.x.com/en/docs/twitter-for-websites/cards/overview/summary { diff --git a/app/features/tournament/tournament.css b/app/features/tournament/tournament.css index 6eb3c4b626..2892299a24 100644 --- a/app/features/tournament/tournament.css +++ b/app/features/tournament/tournament.css @@ -362,7 +362,7 @@ border-radius: var(--rounded); column-gap: var(--s-1); font-size: var(--fonts-xs); - grid-template-columns: 3rem 8rem 1fr; + grid-template-columns: 1.5rem 2rem 8rem 3rem 1fr; list-style: none; row-gap: var(--s-1-5); } diff --git a/db-test.sqlite3 b/db-test.sqlite3 index 1aaafb3b39..2c633c8ffa 100644 Binary files a/db-test.sqlite3 and b/db-test.sqlite3 differ diff --git a/e2e/tournament-bracket.spec.ts b/e2e/tournament-bracket.spec.ts index a0b95cf164..6f2fd9bf47 100644 --- a/e2e/tournament-bracket.spec.ts +++ b/e2e/tournament-bracket.spec.ts @@ -190,7 +190,7 @@ test.describe("Tournament bracket", () => { }); // 1) - await navigateToMatch(page, 6); + await navigateToMatch(page, 5); await reportResult({ page, amountOfMapsToReport: 2 }); await backToBracket(page); @@ -200,7 +200,7 @@ test.describe("Tournament bracket", () => { page, url: tournamentBracketsPage({ tournamentId }), }); - await navigateToMatch(page, 5); + await navigateToMatch(page, 6); await reportResult({ page, amountOfMapsToReport: 2 }); await backToBracket(page); @@ -214,7 +214,7 @@ test.describe("Tournament bracket", () => { await backToBracket(page); // 4) - await navigateToMatch(page, 6); + await navigateToMatch(page, 5); await isNotVisible(page.getByTestId("reopen-match-button")); await backToBracket(page); @@ -225,7 +225,7 @@ test.describe("Tournament bracket", () => { await backToBracket(page); // 6) - await navigateToMatch(page, 6); + await navigateToMatch(page, 5); await page.getByTestId("reopen-match-button").click(); await expectScore(page, [1, 0]); @@ -235,7 +235,7 @@ test.describe("Tournament bracket", () => { page, url: tournamentBracketsPage({ tournamentId }), }); - await navigateToMatch(page, 6); + await navigateToMatch(page, 5); await page.getByTestId("undo-score-button").click(); await expectScore(page, [0, 0]); await reportResult({ @@ -731,11 +731,11 @@ test.describe("Tournament bracket", () => { await page.getByTestId("finalize-bracket-button").click(); await page.getByTestId("confirm-finalize-bracket-button").click(); - await page.locator('[data-match-id="7"]').click(); + await page.locator('[data-match-id="2"]').click(); await expect(page.getByTestId("screen-allowed")).toBeVisible(); await backToBracket(page); - await page.locator('[data-match-id="8"]').click(); + await page.locator('[data-match-id="1"]').click(); await expect(page.getByTestId("screen-banned")).toBeVisible(); }); diff --git a/migrations/074-seeding-skill.js b/migrations/074-seeding-skill.js new file mode 100644 index 0000000000..4374da4287 --- /dev/null +++ b/migrations/074-seeding-skill.js @@ -0,0 +1,17 @@ +export function up(db) { + db.transaction(() => { + db.prepare( + /*sql*/ ` + create table "SeedingSkill" ( + "mu" real not null, + "sigma" real not null, + "ordinal" real not null, + "userId" integer not null, + "type" text not null, + foreign key ("userId") references "User"("id") on delete cascade, + unique("userId", "type") on conflict replace + ) strict + `, + ).run(); + })(); +} diff --git a/scripts/calc-seeding-skills.ts b/scripts/calc-seeding-skills.ts new file mode 100644 index 0000000000..feb61ead03 --- /dev/null +++ b/scripts/calc-seeding-skills.ts @@ -0,0 +1,94 @@ +import "dotenv/config"; +import { type Rating, ordinal, rating } from "openskill"; +import { db } from "../app/db/sql"; +import type { Tables } from "../app/db/tables"; +import { tournamentFromDB } from "../app/features/tournament-bracket/core/Tournament.server"; +import { + calculateIndividualPlayerSkills, + userIdsToTeamIdRecord, +} from "../app/features/tournament-bracket/core/summarizer.server"; +import { allMatchResultsByTournamentId } from "../app/features/tournament-bracket/queries/allMatchResultsByTournamentId.server"; +import invariant from "../app/utils/invariant"; +import { logger } from "../app/utils/logger"; + +async function main() { + const result: Tables["SeedingSkill"][] = []; + + for (const type of ["RANKED", "UNRANKED"] as const) { + const ratings = new Map(); + let count = 0; + + console.time(`Tournament skills: ${type}`); + for await (const tournament of tournaments(type)) { + count++; + const results = allMatchResultsByTournamentId(tournament.ctx.id); + invariant(results.length > 0, "No results found"); + + const skills = calculateIndividualPlayerSkills({ + queryCurrentUserRating(userId) { + return ratings.get(userId) ?? rating(); + }, + results, + userIdsToTeamId: userIdsToTeamIdRecord(tournament.ctx.teams), + }); + + for (const { userId, mu, sigma } of skills) { + ratings.set(userId, rating({ mu, sigma })); + } + } + console.timeEnd(`Tournament skills: ${type}`); + logger.info(`Processed ${count} tournaments`); + + for (const [userId, { mu, sigma }] of ratings) { + result.push({ + mu, + sigma, + ordinal: ordinal(rating({ mu, sigma })), + type, + userId, + }); + } + } + + await db.transaction().execute(async (trx) => { + await trx.deleteFrom("SeedingSkill").execute(); + for (const skill of result) { + await trx.insertInto("SeedingSkill").values(skill).execute(); + } + }); + logger.info(`Done. Total of ${result.length} seeding skills inserted`); +} + +async function* tournaments(type: "RANKED" | "UNRANKED") { + const maxId = await db + .selectFrom("Tournament") + .select(({ fn }) => fn.max("id").as("maxId")) + .executeTakeFirstOrThrow() + .then((row) => row.maxId); + + for (let tournamentId = 1; tournamentId <= maxId; tournamentId++) { + try { + const tournament = await tournamentFromDB({ + tournamentId, + user: undefined, + }); + + if (!tournament.ctx.isFinalized) { + continue; + } + + if (tournament.skillCountsFor === "RANKED" && type === "RANKED") { + yield tournament; + } else if ( + tournament.skillCountsFor === "UNRANKED" && + type === "UNRANKED" + ) { + yield tournament; + } + } catch (err) { + // logger.info(`Skipped tournament with id ${tournamentId}`); + } + } +} + +main();