|
| 1 | +import { sql } from 'kysely'; |
| 2 | +import { GrenadeName } from 'csdm/common/types/counter-strike'; |
| 3 | +import type { Point } from 'csdm/common/types/point'; |
| 4 | +import type { PlayerHeatmapFilter } from 'csdm/common/types/heatmap-filters'; |
| 5 | +import { db } from 'csdm/node/database/database'; |
| 6 | +import { HeatmapEvent } from 'csdm/common/types/heatmap-event'; |
| 7 | + |
| 8 | +export async function fetchPlayerGrenadePoints(filters: PlayerHeatmapFilter): Promise<Point[]> { |
| 9 | + const grenadeNames: GrenadeName[] = []; |
| 10 | + switch (filters.event) { |
| 11 | + case HeatmapEvent.Smoke: |
| 12 | + grenadeNames.push(GrenadeName.Smoke); |
| 13 | + break; |
| 14 | + case HeatmapEvent.Decoy: |
| 15 | + grenadeNames.push(GrenadeName.Decoy); |
| 16 | + break; |
| 17 | + case HeatmapEvent.Flashbang: |
| 18 | + grenadeNames.push(GrenadeName.Flashbang); |
| 19 | + break; |
| 20 | + case HeatmapEvent.HeGrenade: |
| 21 | + grenadeNames.push(GrenadeName.HE); |
| 22 | + break; |
| 23 | + case HeatmapEvent.Molotov: |
| 24 | + grenadeNames.push(GrenadeName.Molotov, GrenadeName.Incendiary); |
| 25 | + break; |
| 26 | + default: |
| 27 | + throw new Error(`Unsupported grenade event: ${filters.event}`); |
| 28 | + } |
| 29 | + |
| 30 | + let query = db |
| 31 | + .selectFrom('grenade_projectiles_destroy') |
| 32 | + .select(['x', 'y']) |
| 33 | + .leftJoin('matches', 'checksum', 'match_checksum') |
| 34 | + .where('matches.map_name', '=', filters.mapName) |
| 35 | + .where('thrower_steam_id', '=', filters.steamId) |
| 36 | + .where('grenade_name', 'in', grenadeNames); |
| 37 | + |
| 38 | + if (filters.startDate !== undefined && filters.endDate !== undefined) { |
| 39 | + query = query.where(sql<boolean>`matches.date between ${filters.startDate} and ${filters.endDate}`); |
| 40 | + } |
| 41 | + |
| 42 | + if (filters.sources.length > 0) { |
| 43 | + query = query.where('matches.source', 'in', filters.sources); |
| 44 | + } |
| 45 | + |
| 46 | + if (filters.games.length > 0) { |
| 47 | + query = query.where('matches.game', 'in', filters.games); |
| 48 | + } |
| 49 | + |
| 50 | + if (filters.demoTypes.length > 0) { |
| 51 | + query = query.where('matches.type', 'in', filters.demoTypes); |
| 52 | + } |
| 53 | + |
| 54 | + if (filters.gameModes.length > 0) { |
| 55 | + query = query.where('matches.game_mode_str', 'in', filters.gameModes); |
| 56 | + } |
| 57 | + |
| 58 | + if (filters.maxRounds.length > 0) { |
| 59 | + query = query.where('max_rounds', 'in', filters.maxRounds); |
| 60 | + } |
| 61 | + |
| 62 | + if (filters.sides.length > 0) { |
| 63 | + query = query.where('thrower_side', 'in', filters.sides); |
| 64 | + } |
| 65 | + |
| 66 | + if (filters.tagIds.length > 0) { |
| 67 | + query = query |
| 68 | + .leftJoin('checksum_tags', 'checksum_tags.checksum', 'matches.checksum') |
| 69 | + .where('checksum_tags.tag_id', 'in', filters.tagIds); |
| 70 | + } |
| 71 | + |
| 72 | + const points = query.execute(); |
| 73 | + |
| 74 | + return points; |
| 75 | +} |
0 commit comments