diff --git a/src/lib/api/transformers.ts b/src/lib/api/transformers.ts index 7581717..dcfe7bd 100644 --- a/src/lib/api/transformers.ts +++ b/src/lib/api/transformers.ts @@ -195,7 +195,10 @@ export function transformPlayerStats(legacy: LegacyPlayerStats): MatchPlayer { flash_duration_enemy: legacy.flash?.duration?.enemy, flash_total_self: legacy.flash?.total?.self, flash_total_team: legacy.flash?.total?.team, - flash_total_enemy: legacy.flash?.total?.enemy + flash_total_enemy: legacy.flash?.total?.enemy, + // Ban status + vac: legacy.player.vac, + game_ban: legacy.player.game_ban }; } diff --git a/src/lib/schemas/match.schema.ts b/src/lib/schemas/match.schema.ts index 3028adf..ed98de0 100644 --- a/src/lib/schemas/match.schema.ts +++ b/src/lib/schemas/match.schema.ts @@ -54,7 +54,11 @@ export const matchPlayerSchema = z.object({ // Other crosshair: z.string().optional(), color: z.enum(['green', 'yellow', 'purple', 'blue', 'orange', 'grey']).optional(), - avg_ping: z.number().nonnegative().optional() + avg_ping: z.number().nonnegative().optional(), + + // Ban status + vac: z.boolean().optional(), + game_ban: z.boolean().optional() }); /** Match schema */ diff --git a/src/lib/types/Match.ts b/src/lib/types/Match.ts index 4dfaa39..62a8118 100644 --- a/src/lib/types/Match.ts +++ b/src/lib/types/Match.ts @@ -134,6 +134,10 @@ export interface MatchPlayer { crosshair?: string; color?: 'green' | 'yellow' | 'purple' | 'blue' | 'orange' | 'grey'; avg_ping?: number; + + // Ban status + vac?: boolean; // Whether player has VAC ban + game_ban?: boolean; // Whether player has game ban } /** diff --git a/src/mocks/fixtures.ts b/src/mocks/fixtures.ts index b8f4c19..292dd52 100644 --- a/src/mocks/fixtures.ts +++ b/src/mocks/fixtures.ts @@ -74,7 +74,9 @@ export const mockMatchPlayers: MatchPlayer[] = [ ud_flash: 5, ud_smoke: 3, avg_ping: 25.5, - color: 'yellow' + color: 'yellow', + vac: false, + game_ban: false }, { id: '765611980876543', @@ -93,7 +95,9 @@ export const mockMatchPlayers: MatchPlayer[] = [ dmg_enemy: 2180, dmg_team: 85, avg_ping: 32.1, - color: 'blue' + color: 'blue', + vac: false, + game_ban: false }, { id: '765611980111111', @@ -112,7 +116,9 @@ export const mockMatchPlayers: MatchPlayer[] = [ dmg_enemy: 2680, dmg_team: 45, avg_ping: 18.3, - color: 'green' + color: 'green', + vac: false, + game_ban: false } ]; diff --git a/src/routes/match/[id]/details/+page.svelte b/src/routes/match/[id]/details/+page.svelte index 59fadc7..751d746 100644 --- a/src/routes/match/[id]/details/+page.svelte +++ b/src/routes/match/[id]/details/+page.svelte @@ -131,6 +131,28 @@ if (numValue > 0) return `${numValue}`; return '-'; } + }, + { + key: 'vac' as keyof (typeof playersWithStats)[0], + label: 'Status', + sortable: true, + align: 'center' as const, + render: ( + _value: string | number | boolean | undefined, + row: (typeof playersWithStats)[0] + ) => { + const badges = []; + if (row.vac) { + badges.push('VAC'); + } + if (row.game_ban) { + badges.push('BAN'); + } + if (badges.length > 0) { + return `