diff --git a/packages/webapp/src/routes/pazismemod/We Are Charlie Kirk.mp3 b/packages/webapp/src/routes/pazismemod/We Are Charlie Kirk.mp3 new file mode 100755 index 0000000..ef1da32 Binary files /dev/null and b/packages/webapp/src/routes/pazismemod/We Are Charlie Kirk.mp3 differ diff --git a/packages/webapp/src/routes/pazismemod/index.tsx b/packages/webapp/src/routes/pazismemod/index.tsx index 8dd8f33..f7e65de 100644 --- a/packages/webapp/src/routes/pazismemod/index.tsx +++ b/packages/webapp/src/routes/pazismemod/index.tsx @@ -1,15 +1,89 @@ import { createFileRoute } from "@tanstack/react-router" +import { useEffect, useRef } from "react" import "./index.css" import screen1 from "./screen1.png" +import song from "./We Are Charlie Kirk.mp3" export const Route = createFileRoute("/pazismemod/")({ component: RouteComponent, }) +const SONG_START_TIME = 46 + function RouteComponent() { + const audioRef = useRef(null) + + useEffect(() => { + const audio = audioRef.current + + if (!audio) { + return + } + + const syncStartTime = () => { + if (Number.isFinite(audio.duration) && audio.duration > SONG_START_TIME) { + audio.currentTime = SONG_START_TIME + } + } + + const loopFromOffset = async () => { + syncStartTime() + + try { + await audio.play() + } + catch { + // Ignore autoplay failures. Some embedded browsers require user interaction. + } + } + + const tryAutoplay = async () => { + syncStartTime() + + try { + await audio.play() + } + catch { + // Ignore autoplay failures. Some embedded browsers require user interaction. + } + } + + const gameDetails = ( + _servername: string, + _serverurl: string, + _mapname: string, + _maxplayers: string, + _steamid: string, + _gamemode: string, + volume: number | string, + ) => { + const parsedVolume = Number(volume) + + if (Number.isFinite(parsedVolume)) { + audio.volume = Math.min(1, Math.max(0, parsedVolume)) + } + } + + audio.addEventListener("loadedmetadata", syncStartTime) + audio.addEventListener("ended", loopFromOffset) + void tryAutoplay() + ;(window as Window & { GameDetails?: typeof gameDetails }).GameDetails = gameDetails + + return () => { + audio.removeEventListener("loadedmetadata", syncStartTime) + audio.removeEventListener("ended", loopFromOffset) + + if ((window as Window & { GameDetails?: typeof gameDetails }).GameDetails === gameDetails) { + delete (window as Window & { GameDetails?: typeof gameDetails }).GameDetails + } + } + }, []) + return (
+