diff --git a/.github/workflows/website.yaml b/.github/workflows/website.yaml index 5ac92d6cf..28945976b 100644 --- a/.github/workflows/website.yaml +++ b/.github/workflows/website.yaml @@ -34,6 +34,25 @@ on: - preview - opentest + client_provider: + description: Client provider + + type: choice + required: true + default: steam + + options: + - steam + - zip + - wgpkg + + client_source: + description: Client source + + type: string + required: true + default: 444200/windows + permissions: contents: read @@ -42,6 +61,13 @@ concurrency: cancel-in-progress: true env: + # client + STEAM_USERNAME: ${{ secrets.STEAM_USERNAME }} + STEAM_PASSWORD: ${{ secrets.STEAM_PASSWORD }} + CLIENT_PROVIDER: ${{ inputs.client_provider || 'steam' }} + CLIENT_SOURCE: ${{ inputs.client_source || '444200/windows' }} + CLIENT_DIR: ../../temp/game + # blitzkit PUBLIC_ENVIRONMENT: ${{ inputs.environment || 'production' }} PUBLIC_PROMOTE_OPENTEST: false @@ -52,7 +78,6 @@ env: WOTB_GLOSSARY: ${{ secrets.WOTB_GLOSSARY }} WOTB_GLOSSARY_DOMAIN: ${{ secrets.WOTB_GLOSSARY_DOMAIN }} WOTB_GLOSSARY_PATH: ${{ secrets.WOTB_GLOSSARY_PATH }} - GAME_DIR: ../../temp/game # google PUBLIC_GOOGLE_TAG_MANAGER_ID: ${{ secrets.PUBLIC_GOOGLE_TAG_MANAGER_ID }} @@ -60,12 +85,6 @@ env: # wargaming PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }} - # steam - STEAM_USERNAME: ${{ secrets.STEAM_USERNAME }} - STEAM_PASSWORD: ${{ secrets.STEAM_PASSWORD }} - STEAM_APP: 444200 - STEAM_OS: windows - jobs: build: name: Build website @@ -102,38 +121,8 @@ jobs: - name: Install dependencies run: bun install - - name: Setup DepotDownloader - run: | - REPO_USER="SteamRE" - REPO_NAME="DepotDownloader" - TEMP="temp" - - OUT="$TEMP/$REPO_NAME" - ZIP="$TEMP/$REPO_NAME.zip" - - URL=$( - curl -s "https://api.github.com/repos/$REPO_USER/$REPO_NAME/releases/latest" \ - | jq -r '.assets[] - | select(.name | contains("linux-x64")) - | .browser_download_url' \ - | head -n 1 - ) - - mkdir -p "$TEMP" - curl -L "$URL" -o "$ZIP" - unzip -p "$ZIP" "$REPO_NAME" > "$OUT" - rm "$ZIP" - - chmod +x "$OUT" - - - name: Download game - run: | - TEMP="temp" - - DEPOT_DOWNLOADER="$TEMP/DepotDownloader" - GAME="$TEMP/game" - - $DEPOT_DOWNLOADER -os $STEAM_OS -app $STEAM_APP -username $STEAM_USERNAME -password $STEAM_PASSWORD -dir $GAME -max-downloads 256 + - name: Download Client + run: bun run download-client - name: Build run: bun run --bun build diff --git a/package.json b/package.json index 340587062..9fd485a92 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "build": "cd packages/website && bun run build", "discover-ids": "cd packages/scripts && bun run discover-ids", "build-protos": "cd packages/scripts && bun run build-protos", - "record-performance": "cd packages/scripts && bun run record-performance" + "record-performance": "cd packages/scripts && bun run record-performance", + "download-client": "cd packages/scripts && bun run download-client" }, "type": "module", "workspaces": [ diff --git a/packages/scripts/package.json b/packages/scripts/package.json index a401cc068..70765e5f0 100644 --- a/packages/scripts/package.json +++ b/packages/scripts/package.json @@ -4,7 +4,8 @@ "scripts": { "discover-ids": "bun src/discoverIds/index.ts", "build-protos": "bun src/protos.ts", - "record-performance": "bun src/recordPerformance/index.ts" + "record-performance": "bun src/recordPerformance/index.ts", + "download-client": "bun src/downloadClient/index.ts" }, "dependencies": { "@blitzkit/closed": "workspace:*", diff --git a/packages/scripts/src/downloadClient/constants.ts b/packages/scripts/src/downloadClient/constants.ts new file mode 100644 index 000000000..6a6a15507 --- /dev/null +++ b/packages/scripts/src/downloadClient/constants.ts @@ -0,0 +1,4 @@ +// dava engine has a lot of tiny files, this is faster +export const DEPOT_DOWNLOADER_MAX_DOWNLOADS = 256; +export const DEPOT_DOWNLOADER_OUTPUT = "../../temp/depotdownloader"; +export const DEPOT_DOWNLOADER_EXECUTABLE = `${DEPOT_DOWNLOADER_OUTPUT}/DepotDownloader`; diff --git a/packages/scripts/src/downloadClient/index.ts b/packages/scripts/src/downloadClient/index.ts new file mode 100644 index 000000000..16b52bfb0 --- /dev/null +++ b/packages/scripts/src/downloadClient/index.ts @@ -0,0 +1,50 @@ +import { assertSecret } from "@blitzkit/core"; +import { $ } from "bun"; +import { rm } from "node:fs/promises"; +import { + DEPOT_DOWNLOADER_EXECUTABLE, + DEPOT_DOWNLOADER_MAX_DOWNLOADS, + DEPOT_DOWNLOADER_OUTPUT, +} from "./constants"; +import { QuickGitHubRelease } from "./types"; + +const provider = assertSecret(import.meta.env.CLIENT_PROVIDER); +const source = assertSecret(import.meta.env.CLIENT_SOURCE); +const dir = assertSecret(import.meta.env.CLIENT_DIR); + +if (provider === "steam") { + const [id, platform] = source.split("/"); + + console.log("Downloading Depot Downloader..."); + + const releases = await fetch( + "https://api.github.com/repos/SteamRE/DepotDownloader/releases/latest", + ).then((response) => response.json() as Promise); + const asset = releases.assets.find((asset) => + asset.name.includes("linux-x64"), + ); + + if (!asset) { + throw new Error("No linux-x64 asset found for Steam DepotDownloader"); + } + + await rm(dir, { recursive: true, force: true }); + await rm(DEPOT_DOWNLOADER_OUTPUT, { recursive: true, force: true }); + + await $`curl -L "${asset.browser_download_url}" -o "${DEPOT_DOWNLOADER_OUTPUT}.zip"`; + await $`unzip "${DEPOT_DOWNLOADER_OUTPUT}.zip" -d "${DEPOT_DOWNLOADER_OUTPUT}"`; + await $`chmod +x "${DEPOT_DOWNLOADER_EXECUTABLE}"`; + + console.log("Downloading client..."); + + const username = assertSecret(import.meta.env.STEAM_USERNAME); + const password = assertSecret(import.meta.env.STEAM_PASSWORD); + + await $`${DEPOT_DOWNLOADER_EXECUTABLE} -os ${ + platform + } -app ${id} -username ${username} -password ${ + password + } -dir ${dir} -max-downloads ${DEPOT_DOWNLOADER_MAX_DOWNLOADS}`; +} else { + throw new Error(`Unknown provider: ${provider}`); +} diff --git a/packages/scripts/src/downloadClient/types.ts b/packages/scripts/src/downloadClient/types.ts new file mode 100644 index 000000000..dd5701ad7 --- /dev/null +++ b/packages/scripts/src/downloadClient/types.ts @@ -0,0 +1,8 @@ +export interface QuickGitHubRelease { + assets: Asset[]; +} + +interface Asset { + name: string; + browser_download_url: string; +} diff --git a/packages/website/src/core/blitzkit/vfs.ts b/packages/website/src/core/blitzkit/vfs.ts index 19bd8e044..a94b39bae 100644 --- a/packages/website/src/core/blitzkit/vfs.ts +++ b/packages/website/src/core/blitzkit/vfs.ts @@ -1,4 +1,4 @@ import { assertSecret } from "@blitzkit/core"; import { LocalVFS } from "@blitzkit/core/src/blitzkit/vfs/local"; -export const vfs = new LocalVFS(assertSecret(import.meta.env.GAME_DIR)); +export const vfs = new LocalVFS(assertSecret(import.meta.env.CLIENT_DIR));