From a1331212cb61e86271682e4dba543d11b64a21cc Mon Sep 17 00:00:00 2001 From: Matt Sijbers Date: Tue, 5 May 2026 00:19:05 +0100 Subject: [PATCH] Initial commit: Brass & Sigil monorepo Self-hosted Minecraft modpack distribution + administration system. - launcher/ Avalonia 12 desktop client; single-file win-x64 publish. Microsoft auth via XboxAuthNet, manifest+SHA-1 mod sync, portable install path, sidecar settings. - server/ brass-sigil-server daemon (.NET 8, linux-x64). Wraps the MC subprocess, embedded Kestrel admin panel with cookie auth + rate limiting, RCON bridge, scheduled backups, BlueMap CLI integration with player markers + skin proxy, friend-side whitelist request flow, world wipe with seed selection (keep current / random / custom). - pack/ pack.lock.json (Modrinth + manual CurseForge entries), data-only tweak source under tweaks/, build outputs in overrides/ (gitignored). - scripts/ Build-Pack / Build-Tweaks / Update-Pack / Check-Updates plus Deploy-Brass.ps1 unified one-shot deploy with version-bump pre-flight and daemon-state detection. --- .gitignore | 62 + LICENSE | 21 + README.md | 68 + launcher/App.axaml | 9 + launcher/App.axaml.cs | 23 + launcher/Assets/build-icon.ps1 | 98 ++ launcher/Assets/build-noise.ps1 | 43 + launcher/Assets/icon.ico | Bin 0 -> 155508 bytes launcher/Assets/icon.png | Bin 0 -> 648751 bytes launcher/Assets/noise.png | Bin 0 -> 22723 bytes launcher/MainWindow.axaml | 395 ++++++ launcher/MainWindow.axaml.cs | 980 +++++++++++++ launcher/Models/LauncherConfig.cs | 106 ++ launcher/Models/LauncherSettings.cs | 54 + launcher/Models/Manifest.cs | 110 ++ launcher/ModpackLauncher.csproj | 65 + launcher/Program.cs | 24 + launcher/README.md | 112 ++ launcher/Services/AuthService.cs | 95 ++ launcher/Services/FileLog.cs | 45 + launcher/Services/IrisConfigService.cs | 65 + launcher/Services/LaunchService.cs | 227 +++ launcher/Services/ManifestSyncService.cs | 252 ++++ launcher/Services/ProgressReport.cs | 17 + launcher/Services/ServerListService.cs | 101 ++ launcher/Services/SystemInfo.cs | 67 + launcher/Services/WebView2Check.cs | 39 + launcher/Services/WhitelistRequestService.cs | 67 + launcher/app.manifest | 18 + launcher/launcher-config.template.json | 10 + launcher/manifest.example.json | 33 + pack/pack.lock.json | 349 +++++ pack/tweaks/README.md | 91 ++ .../META-INF/neoforge.mods.toml | 42 + .../worldgen_modifier/skylands_end_stone.json | 6 + .../skylands_end_stone_ore.json | 18 + .../skylands_end_stone_ore.json | 16 + pack/tweaks/brassandsigil-tweaks/pack.mcmeta | 6 + scripts/Build-Pack.ps1 | 183 +++ scripts/Build-Tweaks.ps1 | 115 ++ scripts/Check-Updates.ps1 | 101 ++ scripts/Deploy-Brass.ps1 | 231 ++++ scripts/Update-Pack.ps1 | 207 +++ scripts/deploy.config.template.ps1 | 37 + server/Assets/icon.ico | Bin 0 -> 151634 bytes server/Assets/server-icon.png | Bin 0 -> 8659 bytes server/BrassAndSigilServer.csproj | 40 + server/Commands/BaseCommandSettings.cs | 11 + server/Commands/CheckCommand.cs | 90 ++ server/Commands/InstallCommand.cs | 141 ++ server/Commands/RunCommand.cs | 1225 +++++++++++++++++ server/Commands/SetPasswordCommand.cs | 44 + server/Commands/SyncCommand.cs | 32 + server/Models/Manifest.cs | 62 + server/Models/ServerConfig.cs | 77 ++ server/Program.cs | 52 + server/Services/BackupScheduler.cs | 202 +++ server/Services/BackupService.cs | 257 ++++ server/Services/BlueMapPlayers.cs | 145 ++ server/Services/BlueMapService.cs | 321 +++++ server/Services/Broadcaster.cs | 109 ++ server/Services/JavaInstaller.cs | 156 +++ server/Services/JsonOpts.cs | 24 + server/Services/ManifestSync.cs | 199 +++ server/Services/NeoForgeInstaller.cs | 112 ++ server/Services/RconClient.cs | 93 ++ server/Services/RconManager.cs | 68 + server/Services/ServerProcess.cs | 405 ++++++ server/Services/ServerPropertiesService.cs | 149 ++ server/Services/UpdaterService.cs | 260 ++++ server/Services/WhitelistRequestService.cs | 145 ++ server/Services/WindowsJobObject.cs | 124 ++ server/Services/WorldService.cs | 229 +++ server/deploy/Caddyfile | 50 + server/deploy/bns-admin.sijbers.uk.conf | 27 + server/deploy/brass-and-sigil.html | 284 ++++ server/deploy/brass-sigil-server.service | 26 + server/deploy/cleanup-sudo.sh | 105 ++ server/deploy/manifest.json | 135 ++ server/deploy/server-config.example.json | 12 + server/wwwroot/app.js | 42 + server/wwwroot/favicon.png | Bin 0 -> 8808 bytes server/wwwroot/index.html | 379 +++++ server/wwwroot/modules/api.js | 28 + server/wwwroot/modules/auth.js | 115 ++ server/wwwroot/modules/autocomplete.js | 263 ++++ server/wwwroot/modules/backup.js | 183 +++ server/wwwroot/modules/console.js | 76 + server/wwwroot/modules/danger.js | 111 ++ server/wwwroot/modules/map.js | 114 ++ server/wwwroot/modules/modal.js | 57 + server/wwwroot/modules/panels.js | 117 ++ server/wwwroot/modules/pregen.js | 222 +++ server/wwwroot/modules/serverControls.js | 16 + server/wwwroot/modules/settings.js | 135 ++ server/wwwroot/modules/state.js | 18 + server/wwwroot/modules/update.js | 138 ++ server/wwwroot/modules/whitelist.js | 86 ++ server/wwwroot/styles.css | 521 +++++++ 99 files changed, 12640 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 launcher/App.axaml create mode 100644 launcher/App.axaml.cs create mode 100644 launcher/Assets/build-icon.ps1 create mode 100644 launcher/Assets/build-noise.ps1 create mode 100644 launcher/Assets/icon.ico create mode 100644 launcher/Assets/icon.png create mode 100644 launcher/Assets/noise.png create mode 100644 launcher/MainWindow.axaml create mode 100644 launcher/MainWindow.axaml.cs create mode 100644 launcher/Models/LauncherConfig.cs create mode 100644 launcher/Models/LauncherSettings.cs create mode 100644 launcher/Models/Manifest.cs create mode 100644 launcher/ModpackLauncher.csproj create mode 100644 launcher/Program.cs create mode 100644 launcher/README.md create mode 100644 launcher/Services/AuthService.cs create mode 100644 launcher/Services/FileLog.cs create mode 100644 launcher/Services/IrisConfigService.cs create mode 100644 launcher/Services/LaunchService.cs create mode 100644 launcher/Services/ManifestSyncService.cs create mode 100644 launcher/Services/ProgressReport.cs create mode 100644 launcher/Services/ServerListService.cs create mode 100644 launcher/Services/SystemInfo.cs create mode 100644 launcher/Services/WebView2Check.cs create mode 100644 launcher/Services/WhitelistRequestService.cs create mode 100644 launcher/app.manifest create mode 100644 launcher/launcher-config.template.json create mode 100644 launcher/manifest.example.json create mode 100644 pack/pack.lock.json create mode 100644 pack/tweaks/README.md create mode 100644 pack/tweaks/brassandsigil-tweaks/META-INF/neoforge.mods.toml create mode 100644 pack/tweaks/brassandsigil-tweaks/data/brassandsigil_tweaks/lithostitched/worldgen_modifier/skylands_end_stone.json create mode 100644 pack/tweaks/brassandsigil-tweaks/data/brassandsigil_tweaks/worldgen/configured_feature/skylands_end_stone_ore.json create mode 100644 pack/tweaks/brassandsigil-tweaks/data/brassandsigil_tweaks/worldgen/placed_feature/skylands_end_stone_ore.json create mode 100644 pack/tweaks/brassandsigil-tweaks/pack.mcmeta create mode 100644 scripts/Build-Pack.ps1 create mode 100644 scripts/Build-Tweaks.ps1 create mode 100644 scripts/Check-Updates.ps1 create mode 100644 scripts/Deploy-Brass.ps1 create mode 100644 scripts/Update-Pack.ps1 create mode 100644 scripts/deploy.config.template.ps1 create mode 100644 server/Assets/icon.ico create mode 100644 server/Assets/server-icon.png create mode 100644 server/BrassAndSigilServer.csproj create mode 100644 server/Commands/BaseCommandSettings.cs create mode 100644 server/Commands/CheckCommand.cs create mode 100644 server/Commands/InstallCommand.cs create mode 100644 server/Commands/RunCommand.cs create mode 100644 server/Commands/SetPasswordCommand.cs create mode 100644 server/Commands/SyncCommand.cs create mode 100644 server/Models/Manifest.cs create mode 100644 server/Models/ServerConfig.cs create mode 100644 server/Program.cs create mode 100644 server/Services/BackupScheduler.cs create mode 100644 server/Services/BackupService.cs create mode 100644 server/Services/BlueMapPlayers.cs create mode 100644 server/Services/BlueMapService.cs create mode 100644 server/Services/Broadcaster.cs create mode 100644 server/Services/JavaInstaller.cs create mode 100644 server/Services/JsonOpts.cs create mode 100644 server/Services/ManifestSync.cs create mode 100644 server/Services/NeoForgeInstaller.cs create mode 100644 server/Services/RconClient.cs create mode 100644 server/Services/RconManager.cs create mode 100644 server/Services/ServerProcess.cs create mode 100644 server/Services/ServerPropertiesService.cs create mode 100644 server/Services/UpdaterService.cs create mode 100644 server/Services/WhitelistRequestService.cs create mode 100644 server/Services/WindowsJobObject.cs create mode 100644 server/Services/WorldService.cs create mode 100644 server/deploy/Caddyfile create mode 100644 server/deploy/bns-admin.sijbers.uk.conf create mode 100644 server/deploy/brass-and-sigil.html create mode 100644 server/deploy/brass-sigil-server.service create mode 100644 server/deploy/cleanup-sudo.sh create mode 100644 server/deploy/manifest.json create mode 100644 server/deploy/server-config.example.json create mode 100644 server/wwwroot/app.js create mode 100644 server/wwwroot/favicon.png create mode 100644 server/wwwroot/index.html create mode 100644 server/wwwroot/modules/api.js create mode 100644 server/wwwroot/modules/auth.js create mode 100644 server/wwwroot/modules/autocomplete.js create mode 100644 server/wwwroot/modules/backup.js create mode 100644 server/wwwroot/modules/console.js create mode 100644 server/wwwroot/modules/danger.js create mode 100644 server/wwwroot/modules/map.js create mode 100644 server/wwwroot/modules/modal.js create mode 100644 server/wwwroot/modules/panels.js create mode 100644 server/wwwroot/modules/pregen.js create mode 100644 server/wwwroot/modules/serverControls.js create mode 100644 server/wwwroot/modules/settings.js create mode 100644 server/wwwroot/modules/state.js create mode 100644 server/wwwroot/modules/update.js create mode 100644 server/wwwroot/modules/whitelist.js create mode 100644 server/wwwroot/styles.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c6448d3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,62 @@ +# ─── .NET build outputs ─────────────────────────────────────────────────── +bin/ +obj/ +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ll]og/ +[Ll]ogs/ +*.pdb +*.user +*.suo +*.userosscache +*.sln.docstates + +# ─── IDE state ──────────────────────────────────────────────────────────── +.vs/ +.vscode/ +.idea/ +*.sln.iml + +# ─── NuGet / package caches ─────────────────────────────────────────────── +*.nupkg +*.snupkg +.nuget/ +packages/ +project.lock.json +project.fragment.lock.json +artifacts/ + +# ─── Build / publish output (every project) ─────────────────────────────── +publish/ + +# ─── Misc OS junk ───────────────────────────────────────────────────────── +*.swp +.DS_Store +Thumbs.db + +# ─── Local secrets / runtime config (track template, ignore real values) ─ +launcher/launcher-config.json +server/deploy/server-config.json +scripts/deploy.config.ps1 + +# ─── Local AI assistant artifacts (Claude, Cursor, Copilot) ─────────────── +# Kept out of the public repo so collaborators aren't surprised by tool- +# specific orientation files. Local copies stay usable in the working tree. +CLAUDE.md +.claude/ +.cursor/ +.cursorrules +.aider* +.github/copilot* + +# ─── Build artifacts that get regenerated ───────────────────────────────── +# Tweak jars rebuilt by scripts/Build-Tweaks.ps1 +pack/overrides/ +# manifest.json regenerated by scripts/Build-Pack.ps1 -- produced at scripts/ +# (default OutputPath) and copied to the deploy share by Deploy-Brass.ps1 +scripts/manifest.json +pack/manifest.json diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0b5ccd9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Matt Sijbers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..4d5f3f4 --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +# Brass & Sigil + +Self-hosted Minecraft modpack distribution + administration system. +Three components, one repo: + +``` +brass-and-sigil/ +├── launcher/ ← Avalonia desktop client (Windows .NET 8) +│ Auths with Microsoft, syncs the modpack, launches the game. +├── server/ ← brass-sigil-server daemon (Linux .NET 8) +│ Wraps the MC subprocess, exposes the admin web panel, +│ syncs mods, runs backups + BlueMap, handles whitelist. +├── pack/ ← Modpack content +│ ├── pack.lock.json Source of truth for mod versions / URLs / hashes +│ ├── tweaks/ Hand-written data-only tweak source +│ └── overrides/ Build output / hand-placed local files (gitignored) +├── scripts/ ← Build + deploy entry points (run from repo root) +│ ├── Update-Pack.ps1 Refresh pack.lock.json from Modrinth/CurseForge +│ ├── Check-Updates.ps1 Non-mutating "what's new?" report +│ ├── Build-Tweaks.ps1 Compile tweaks/ into pack/overrides/mods/*.jar +│ ├── Build-Pack.ps1 Generate manifest.json from the lockfile +│ └── Deploy-Brass.ps1 One-shot build + deploy everything +└── docs/ ← Operational notes, deploy runbook, schema docs +``` + +## Quick start + +```powershell +# Pull dependencies, copy and edit the deploy profile +git clone brass-and-sigil +cd brass-and-sigil +Copy-Item scripts\deploy.config.template.ps1 scripts\deploy.config.ps1 +notepad scripts\deploy.config.ps1 # fill in deploy share, SSH host, etc. + +# Build + deploy everything in one go +.\scripts\Deploy-Brass.ps1 +``` + +`deploy.config.ps1` is gitignored -- local values never get committed. + +## Component reference + +| Component | What it does | Technology | +|-----------|--------------|------------| +| `launcher/` | Friend-distributed client. Auths with Microsoft via WebView2 + XboxAuthNet, downloads mods, launches Minecraft. Single self-contained `.exe` published from `publish/`. | Avalonia 12 + CmlLib.Core | +| `server/` | Daemon running alongside the MC process on Linux. Hosts a Kestrel web panel for admin (cookie-auth, rate-limited), bridges RCON, runs scheduled backups + BlueMap renders, handles whitelist requests. | ASP.NET Core minimal APIs | +| `pack/` | Lockfile-driven modpack content. `pack.lock.json` resolves mod slug → URL+SHA-1; `Build-Pack.ps1` walks it and produces `manifest.json` for the launcher and the server-tool to consume. | PowerShell tooling | + +## Workflow + +1. **Bump mod versions:** `.\scripts\Update-Pack.ps1` (queries Modrinth + manual CurseForge entries). +2. **Sanity-check:** `.\scripts\Check-Updates.ps1` for a non-mutating availability report. +3. **Edit tweaks** under `pack/tweaks//` if you're changing recipes / loot / etc. +4. **Deploy:** `.\scripts\Deploy-Brass.ps1` -- builds launcher + server, regenerates manifest, mirrors everything to the deploy share, scp's the server binary. + +## Secrets / config files + +| File | Tracked? | Notes | +|------|----------|-------| +| `launcher/launcher-config.template.json` | ✓ | Empty placeholders, public-safe | +| `launcher/launcher-config.json` | ✗ | Local override; merged into the published exe at build time if present | +| `server/deploy/server-config.example.json` | ✓ | Template; rename to `server-config.json` on the server with real values | +| `server/deploy/server-config.json` | ✗ | Production config; lives on the server only | +| `scripts/deploy.config.ps1` | ✗ | Local deploy profile (paths, SSH host, share location) | + +## License + +See `LICENSE`. diff --git a/launcher/App.axaml b/launcher/App.axaml new file mode 100644 index 0000000..468f2a2 --- /dev/null +++ b/launcher/App.axaml @@ -0,0 +1,9 @@ + + + + + + diff --git a/launcher/App.axaml.cs b/launcher/App.axaml.cs new file mode 100644 index 0000000..8372e5e --- /dev/null +++ b/launcher/App.axaml.cs @@ -0,0 +1,23 @@ +using Avalonia; +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Markup.Xaml; + +namespace ModpackLauncher; + +public partial class App : Application +{ + public override void Initialize() + { + AvaloniaXamlLoader.Load(this); + } + + public override void OnFrameworkInitializationCompleted() + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + desktop.MainWindow = new MainWindow(); + } + + base.OnFrameworkInitializationCompleted(); + } +} \ No newline at end of file diff --git a/launcher/Assets/build-icon.ps1 b/launcher/Assets/build-icon.ps1 new file mode 100644 index 0000000..dde57bc --- /dev/null +++ b/launcher/Assets/build-icon.ps1 @@ -0,0 +1,98 @@ +#requires -Version 5 +# One-shot helper: produces a multi-resolution icon.ico from icon.png. +# Run only when the source icon changes; commit the resulting icon.ico. + +Add-Type -AssemblyName System.Drawing +Add-Type -AssemblyName PresentationCore +Add-Type -AssemblyName WindowsBase + +$here = Split-Path -Parent $MyInvocation.MyCommand.Path +$srcPath = Join-Path $here 'icon.png' +$icoPath = Join-Path $here 'icon.ico' + +if (-not (Test-Path $srcPath)) { throw "icon.png not found at $srcPath" } + +# Detect if the file is actually a different format renamed to .png (e.g. WebP from AI tools). +# If so, transcode via WPF's WIC pipeline to a real PNG before feeding GDI+. +$head = [System.IO.File]::ReadAllBytes($srcPath)[0..3] +$isPng = $head[0] -eq 0x89 -and $head[1] -eq 0x50 -and $head[2] -eq 0x4E -and $head[3] -eq 0x47 +if (-not $isPng) { + Write-Host "Source file is not a PNG (likely WebP from AI tool). Transcoding via WIC..." + $bytes = [System.IO.File]::ReadAllBytes($srcPath) + $stream = New-Object System.IO.MemoryStream(,$bytes) + $decoder = [System.Windows.Media.Imaging.BitmapDecoder]::Create( + $stream, + [System.Windows.Media.Imaging.BitmapCreateOptions]::PreservePixelFormat, + [System.Windows.Media.Imaging.BitmapCacheOption]::OnLoad) + $frame = $decoder.Frames[0] + # Force BGRA32 so GDI+ can later handle it cleanly with alpha + $converted = New-Object System.Windows.Media.Imaging.FormatConvertedBitmap( + $frame, + [System.Windows.Media.PixelFormats]::Bgra32, + $null, + 0) + $encoder = New-Object System.Windows.Media.Imaging.PngBitmapEncoder + $encoder.Frames.Add([System.Windows.Media.Imaging.BitmapFrame]::Create($converted)) + $outStream = New-Object System.IO.MemoryStream + $encoder.Save($outStream) + [System.IO.File]::WriteAllBytes($srcPath, $outStream.ToArray()) + $outStream.Dispose() + $stream.Dispose() + Write-Host "Transcoded to real PNG ($($outStream.Length) bytes)." +} + +$sizes = 16, 32, 48, 64, 128, 256 +$src = [System.Drawing.Image]::FromFile($srcPath) +$frames = @{} + +foreach ($size in $sizes) { + $bmp = New-Object System.Drawing.Bitmap $size, $size, ([System.Drawing.Imaging.PixelFormat]::Format32bppArgb) + $g = [System.Drawing.Graphics]::FromImage($bmp) + $g.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic + $g.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::HighQuality + $g.PixelOffsetMode = [System.Drawing.Drawing2D.PixelOffsetMode]::HighQuality + $g.CompositingQuality = [System.Drawing.Drawing2D.CompositingQuality]::HighQuality + $g.DrawImage($src, 0, 0, $size, $size) + $g.Dispose() + + $ms = New-Object System.IO.MemoryStream + $bmp.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png) + $frames[$size] = $ms.ToArray() + $bmp.Dispose() + $ms.Dispose() +} + +$out = New-Object System.IO.MemoryStream +$bw = New-Object System.IO.BinaryWriter($out) + +# ICONDIR header +$bw.Write([UInt16]0) +$bw.Write([UInt16]1) +$bw.Write([UInt16]$sizes.Count) + +$dataOffset = 6 + (16 * $sizes.Count) +foreach ($size in $sizes) { + $bytes = $frames[$size] + $w = if ($size -ge 256) { [byte]0 } else { [byte]$size } + $h = if ($size -ge 256) { [byte]0 } else { [byte]$size } + $bw.Write([byte]$w) + $bw.Write([byte]$h) + $bw.Write([byte]0) + $bw.Write([byte]0) + $bw.Write([UInt16]1) + $bw.Write([UInt16]32) + $bw.Write([UInt32]$bytes.Length) + $bw.Write([UInt32]$dataOffset) + $dataOffset += $bytes.Length +} + +foreach ($size in $sizes) { + $bw.Write($frames[$size]) +} + +[System.IO.File]::WriteAllBytes($icoPath, $out.ToArray()) +$bw.Dispose() +$out.Dispose() +$src.Dispose() + +"Wrote: $icoPath ($((Get-Item $icoPath).Length) bytes, $($sizes.Count) sizes)" diff --git a/launcher/Assets/build-noise.ps1 b/launcher/Assets/build-noise.ps1 new file mode 100644 index 0000000..2bddeb5 --- /dev/null +++ b/launcher/Assets/build-noise.ps1 @@ -0,0 +1,43 @@ +#requires -Version 5 +# One-shot helper: generates a subtle warm-tinted tileable noise texture +# at Assets/noise.png. Run only when you want to regenerate the texture. + +Add-Type -AssemblyName System.Drawing + +$here = Split-Path -Parent $MyInvocation.MyCommand.Path +$outPath = Join-Path $here 'noise.png' + +$size = 128 +$bmp = New-Object System.Drawing.Bitmap $size, $size, ([System.Drawing.Imaging.PixelFormat]::Format32bppArgb) +$rng = New-Object System.Random 1337 + +# Lock bits for fast pixel access +$rect = New-Object System.Drawing.Rectangle 0, 0, $size, $size +$data = $bmp.LockBits($rect, [System.Drawing.Imaging.ImageLockMode]::WriteOnly, + [System.Drawing.Imaging.PixelFormat]::Format32bppArgb) +$bytes = New-Object byte[] ($data.Stride * $size) + +function Clamp([double]$v, [double]$lo, [double]$hi) { + if ($v -lt $lo) { return $lo } + if ($v -gt $hi) { return $hi } + return $v +} + +for ($y = 0; $y -lt $size; $y++) { + for ($x = 0; $x -lt $size; $x++) { + $offset = ($y * $data.Stride) + ($x * 4) + # Cool dark grain to overlay on a navy backdrop -- gives subtle metallic noise + $n = ($rng.NextDouble() - 0.5) * 2.0 # -1.0 .. 1.0 + $bytes[$offset] = [byte](Clamp (110 + ($n * 50)) 0 255) # B + $bytes[$offset + 1] = [byte](Clamp (105 + ($n * 50)) 0 255) # G + $bytes[$offset + 2] = [byte](Clamp (95 + ($n * 50)) 0 255) # R + $bytes[$offset + 3] = 28 # A (~11%) + } +} + +[System.Runtime.InteropServices.Marshal]::Copy($bytes, 0, $data.Scan0, $bytes.Length) +$bmp.UnlockBits($data) +$bmp.Save($outPath, [System.Drawing.Imaging.ImageFormat]::Png) +$bmp.Dispose() + +"Wrote: $outPath ($((Get-Item $outPath).Length) bytes, ${size}x${size})" diff --git a/launcher/Assets/icon.ico b/launcher/Assets/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..52f8d214c99283a24a13fc520facff71b37c1cf9 GIT binary patch literal 155508 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 literal 0 HcmV?d00001 diff --git a/launcher/Assets/icon.png b/launcher/Assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..969d348b6a30908e4382f06d086a4e603eeff0e5 GIT binary patch literal 648751 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­qFFr{o4 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

    }xU?K+9^`2`CmUmtrzv74@|5 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%0D%*N`ss@1#-P+x{}+1jC}uGZC>p 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 z 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 literal 0 HcmV?d00001 diff --git a/launcher/Assets/noise.png b/launcher/Assets/noise.png new file mode 100644 index 0000000000000000000000000000000000000000..e1136ef0a170765586ea90e4adac9b358da05232 GIT binary patch literal 22723 zcmWh!dpr~T_a7UEVKbLum|=(*qef_$Sv4XR3E2oy%&nBmW3C%>89lk*JuZc)yIwg$VEukqSya-cEmUj|fO#T8kN>==reQbht54|NG zzZrV}+4&pi&ikMLek=L~BkIeCW4r&Ph0GkC|GMzM&4Ww32jzb~eDQ0o{A=gWfoliN zY2`BxTU~$6NA3X+`l|OnO&`a%8+8eaF6{N6lHSaI@xS=pxNnm;z8-YzoZggq@$33u z+e@Jbxk+hzg?rXzF?+|ihoA2kZ3N7VUGkg>jr;XBerx#R!B_S8x$LrN>hWL0Uk|=L zQQzt>kGXPu``1uX|NlW|pf%6PDSmW$`=Iye=*Z`d&=)bsfAH4gendI! zw$_!uZ=d_`i_h&Pb+=1Lk=(;smb>r1<`3O3Yiqf?U0LU}b@B7D$Nyblsf-hRQ#nZA z2rcs58U%jE8NGP?->rp(iKW8e4f@{X=zq#=ol9{M$LYV`Hhlf3{a=-k<-d0So)%ku zUmp8>^sl|I3oka`sfghW!{X+bPXDK_I9K-9r%!RC)u%_iZ$AI={rJJ(H>_tQZT@<` zdG~GX+_f8@E^fsIf}rPxL;sfU`r=h>dbDt-iNq= zsq7oae}_+@g$U-bp!w++zhdUM7pmcDN>oA>?Z3#izwJ_EcRYs9G95~6<~=4qq=OyTQ@STDmdq7%z1L%1HT&bW@4>6=kx`2_*5yy< zj{a-${hpU$l-l#9vWDJ=z_d^`>%#x?LgNc!vFVO<#Aej1Seo&1&SHYsZ_52EJ_E$a zOLZ+fZg`>X;lwSKV;oHt_rp*3}nL{BEURMd?bsU=yr_ zHKL^BTY?wxX7h<aAkWbW!ZqeTwbk5y7%87vZ zgMy-HaP^5K9F51-;wMWQ@grqMpKm)b1p=mc)UBBLgUyXGqTwua>8K5r`;UcbmB-6h z0|H~^=7oN%i0IU>_NWXwE@0pcRFE(sPF#&wF)vTzG$90sJYWE)=bPkaiOWekAx)isd!-D4Vs-l_e_wDP~*!(=<}`AlliG#pl8c^4X~mbRJ>u`!Jql0DoeR1XsTXDp? z$gR7BR>^}IS|6y_`Nk#hR{ZfDO$_rqSwd+GtKU*t$YEU@?7iSuV`0icxP=sKrYR{x zHg7m2S`GVUpAgHtA|k1|IFj&HM87B5*hTCcPwEF-c| z_%8`3C2A^=6J(u7RtfM#I@nkF0P1@?Jqab^zN8X3DhFhj5GRefvWWoZ#E-rz87@tz z@gcJ=8qt{6uiP8}>NB-j{$3ItZed6{jDQ)w7_mXe4u|C8aVzVW6%C^s6^pl_5Bdj?=s)#zA*Z~$Nh>s95sp4{@U|M+PAoV^E zdPWCEIEtR?Fl*jCC#Q43%s`2v;J;-Qrm`|l>M7)euIea!|3Uk}qxlW54& ztcYLV4KZ#%7o5Bv`65b8%G%0sx$f~9PYfP(JJJwto@u%vi&#l>vJTW`dq5r(Ci^ko z_GATONl|y%SkaZ0ZD45M#Y%7%L0kiPBwZCo4c(?15W^pT|JQt>0c><*r|0h;abXz) zs%%C*NcNH?e#KQs+VVywzN0X!a@kMWKUd|tD$(7{Bof#lAzBIdMk`5KhF$B$G zR6LKl!K%OF<;a?fLKL5x2;)8AY$r*s&z5Zkp1#?2mP6Ah8iMt_wcbH{SPN!!p2zLN z;ZCYFnsG(2)`jtdjwIeY9RRm|m7I{rttE}83?Af(FEWWH6zsiGIlee84p$Vt z3*)x8h4WIQQ)wZVtVKM-?I;fakSnAPj8>;_-u(CW_+;68_54RwLRR2)O~vsGpWEHb zg1u`M+;GD%09Xi$fhnrk5Xcn~;>-n!hnyiTmx_gisl_fAODC~}dWs!>+wwb9mL;|RjlN7D0?Qe98t$EZAcXyVLR(neP^7LVzbI=!C zQtYUz2H1~W#nXTBdk2TmP&(~IGp>%K8;kcuk6c|JA}Xmn|5V@?RsOALf&=#mW?;a zZ&VX~4cb9`>R>2g5^?QoOyCcS*!TUWwdL1@M?ER{jwGe{u7>_++Dc~&ZF%!MFmvPnI#;6&Y2$*6*@pot3sR@A7hG&SVU}xnd07t@($T+x@;0g!KgYx z5&Wq6WR0?d@b!~b8NOF>Oz9(f3vL;qF-nI!l+0d>|%JTYe%iEV<=$Jl`0UNR{oe z7Di22nGLNLHp9}O?8=9eg$+#%Ns|93FP1n3(NXaJr*|@IRu1}P#P2G+SFTNFi^90! zStP0oqzk+ZktPaO6B^khl;v}NP1?`xEJ@=pS5>_%FD0Vf^51R#l0BQYX4?%AWx6m= z=oXugDEXCh)6qGG+KnML!Venv-nU5yAhxv2EG63dBG5nQhTz*2rDXl7kD8!F<`5-I z&WH*=t4o`-_nF78TgI>?G&z%NOBYl{9)`|kT4HeCRJ$4r{`43#ZM0rTVx0SrHOUoj z=;J5s-~O++KldLb{oXk>%QyDd3RA540eC$BJlwnS;Uzd$Ew&@4rzWA-zDOrFbS6VDmX4(Lr6JdOV8Z~P=w#L0QQ0=B1Af} z>vvh7-{FGgfhwDzZ<$D2eCo1uMa;lMvGcaL!*CNbG&7ORmo0Bq!op2-moD5_@EmkF ziwT#jzmUc|ZHYI{P^P0Xf?n=@k8QpC1!Zd#MDH0DYeyBtBvra`V2 z!mWgR->|yi-RV=4fmY%~iBaL)n(NC;FO?4#ci0!`sc_LY z8MWDu=iPgCEE$s|#0URFJh+o5zSq|z_zM5*`nPN9rB5%;Y*<_Oa*b7c$4n`MH5tCp z;aBEP;aQ(PDZ7x&7s^gmKm%kKa>I~9`Z*6vQ)V$`M+37QimbpWYp6u7gPPum|tG8;zPFVv5juS<;?FgdzZ1?wRhg`JUhEl z3bM7=%R;WxvvGsTM9eK{w!ny27qlG`Y|SZz)Rxih3cH+p)$+rLDSGom_if^#vMdp@ z+q=30`Hic~9(^u&W4VfZ3wbg^JIuq)vBNfjUb>={jZ}l0Z?d;_nT)ZBu&9P2rOX8I zIYnNh!(+1`>?^va;qb8QjUJm>$bHW8Wv5R10Enpj!cqz9pULp`PY`j-lHded-HBMK<|? zFw#`;shWRr%S*RDtFc#~Z~U(l0LzT&gTD8$ho5jMD?9@7L(XvQA%5tS6k8O+-`^Ry zRPUIXd7`hS-{O1vwMLVtX5b`8!#!AIL>NjZo_*dHtNv!CWhx^-W|(^18}ZhPC$L)z zygd^3v`egbmS&tc|D`_T{C=<02z9Tqmfv22U7U${C7KsQGqC9-Z_j>e2as29`9qUk zwez_CbK1HZLZHSG8$5S6!rVmuumX%jA|#{J-?PxQ5w`(l#uzGWv3PCS0qJU7*ZgQY z)Lg!PXu{V@v)eH`SZUx?U36(v*%gq#tIE-F1KB0jg;2 zolM^M0ppR5LiYiGgXtiSx?WV;*4g4J&Q^Og@$$)-*>(pjQcYaYjcY~qG8nC)Ov$-_ zFjX%<{q8>dW!Aa?ylK6OHw~Lrl)!HUMpfJfCU>O5l)3FXBJ7F=Tw zCR0OW3VS#h9UwNv;?vQT39`(5I5w&Fi+7zhVzc-!IfItu&b;VZ?VNzbqkW$6+#V>k zDZ8!2;EF>U?2`y73^2gBDt*~>?y3|-A{RJj0lwlXm6m_FV&&`3%8IDrp4>_qnw5Um zZ*bncF@|lwj8eLSMY%Z%?m67hZuT%0Vyuk)Ue6!;{XfW8mnYF(j+TA&Z)@%!_JV^vgn|&`CDPs8>8Nd8-89JA6xoEJxni{6^9}{s$G_E5V_!Tmfg|T!h3s0 z%AI0)AHs(PL(hg!E&b48l&lL)3;R8lO@RXFlHoa2SHqpw_J?^)ws1X60)&?TRQ6pd z>k44fg%ju}tnbZ*i8*{oP!z)6+Rm$1M42xnjJAFMf=jaklb(C9vU7q`GW6J#y=`-II}_Xg@x&WS+E?g4k-vh=vSWuAhOs9&jrSJ62kcxOR=+rt=c@c_t4-_Wrl1 zCRBLAYwNvaezoD!OG(L)#c2cD70W#N)29MX1OmStv43oQc~)%S4UiI3N7 zZWh`Wh4SD+K3SUe`=lqd$ds{v03g{ZD`OT$aY-+s0eUr(xADwIdda(0BJrYHYmQEP z05Jz{10EM|!8(P`SX?liTe6modir~7iR6Uok&=zl60A^#3kpxJ!pW521-bkAfe67H zD`QoSbyKUt9*ZA^g;dM_!nT&zDN2(D)|8+JqiJeWu$g0G-rIektxkW-uzVidf0gYr z-|;OGgAFiY)--1t+G|Q~TN9VbCtzN!OvMacRjFAfh$|i}wQ5qdrYXbYqswG)XgQ}= zXsFbKf^;&w$2mNJG*|Ov&bMM%ON{3OACIe@3KP`3{0?8NS>tXp`_rz78ub(>3YGvr zihvILxhkZpVy&`!_7LHN!_t+eQo}7XcBo)J^^n5@lFKF4k_LXy;joqKAd|v*>`aF1 z{`QH0gY(tN1U0gcU-)rq6q8G~Ne$Bm%W`OFl#tJSy5Aw`JI;y&)cZ7T5@I`N<`RmX z?1Mfu3qwD5m)M!bbufcx(YDeESOr}C6eN1i;dW@vIz}}M=??z!<0eQE!o>YTGJ($6MOD++23t@#~`9)k1 zblhc4&Ff3e`O&zE^|E~|R>W#qK6DK`Sb&;dPn7MNqV|;uK*EVL@f*5ZAAB_X_E(O8 z-rGS^Q2Yqh&&qm$V=8lsLmsW-Qo0YJw$k=`=N-7056{-#w!+@+HeM+E#n-+w(}GPy z>}tL;)3B1s`@QpW{*fJ8^X83~k#9D5hB&b$OGmJjb2BVJ#@d7s`cV-xs zfY#e_1fzlDOe%XsnUGVPgwI?;fLe*G#8$vc$Pczj@`Zb+n#T3|G{rPi0)H2#oz+@b zUM>WUMDDAaK{W0ZB&TLF!@K>JvH7b(i4IbIhinj##bNE|Bl2+dWWHEyWMPq`n7O4+ z5fYp_Z|Zs+hZXY`Oh4!oV+9SrtDlcx@pm|X#TP|8A3=IBFZ{#a*mpFq@ z(-P_EXGgvGMOi&+^D}SskxO#)P7g`zru=8~9_<#@+L;K9e5`0-KYDBdt&|1}}w2{aV9KwLaiiz-Q!1J-MmnmuRvKs5SpEyGw# z+ADr3D%-ijy;u-YD}1FLvzMMhuMPSoTR0@ncOH1Njrns;&vwXzHFKA39tG24Uibut zEhcuywH5m@KcDt!`-n#$a4+-k4u%#qQcoc*AQIf&$aL(Rls+Ti`Mg?6V;Qy=}2 ziw~~8;+f}LU9FlWyVi87bJn?>xUN3y zVDW)R*5KEb^p{Q1qT%JyEjRtOdO}SuREKmThWs{+6jWz9sn}p<;Ik|p+GqPMW6=oX zyr+0O3pk76>RxcMDaaSq)*ybQ7CJOB1~JXeQ)*OHal=Q-h!$b*96&~9*L`F^^s1D^ zFG+dh6Poi3fnZGC#M zW!UM%eH|gU;cq{|U+7g2u`i1DOLCTbgcxDNIqPp4_!_2_mH`U1m-b?+*{AYyj|}r5 z0$#(F-a8i~(uX3qy6;=N$KoCx2n_tl1e5^ongfW&w9-0Nwi9IgEm*JtR&6quNt0ga zkV2#ezR@jkStc}wijJ3B47V>Oj`8={KFx&_9KIHF`a9CF77x;~egGTwq0a!HC@)^F z$x^7f*L&M0x5&}J4}Jz%0IALVIl+>gy@@gU%B$uuhrm-yHmbYt^{*Q>mJKNdfOXXDe z{XxB8(Sk&go#LUVlJ2YR&6uKRfS)J_jqslzp-V8VQ@ewW;G<PFnNt!hd{073<=8DOSuqDtH+u zHi8&Yj#l7>w?*iW$Y`f|_8k`L<{vqdGob$~xT=!0v1i|>6Dj_s;uawcs&%?eDO z|H+^q4iwlU&6a5YvtpD;v=Gx@*+|GI`?5_p*wDm};V}vASurj3DA#7m-08EzbB)(w(j zMBe*N!xgtubo*HaWIxMbdg8G#q*)8pqlf!yVE3~72S42nuq}Rm_hRTfuAMsug|wa= z)!m=`9^_-)u`I8mcCg(buEf@$S6`2r%+^6T0^uoPcap&<1sGFEi;*M11ClRNm?M$? zfZMMvM14LG@Pyq{wSgFbyQP~EeM8q8Pr*r zWkz){G8oL$5OWi$%3?zreE8Ofq&y9Jda&`Qlv9S&%Jx}X4RwR*H-3)UYZ`5#4AIb2 zaw&T5#!=}o31h;EPJHahT7~tReFE2#{1?()sfku-WEYO@AkewcB3)u(x*ZxjCycb zQ|m%ion9|=_yO2Q4jiHp0JwWBQcjkknS~Y!&w}R`%T^KxuQFBJk*Gq~EW=-0M*LJj}rKC95v$;@46>M2mS4A*%&yjY^q zSw%Z1Cq~>3aTY2ByDXE2liP+iOD24{)e1#7&+fWc2YQK#xim$M5^dNWyR4;; zVW$JQCqLH8J@A2FGT<{AKB>fn>@0`d&mgsit%&K!1bek$SiSid-%Jm2TR(Wtpk;rx z`wlkGWq5X75w33C;xS6x>Y=!sJqbPTL^srdbGzjzn(C0Ck27e@zessH)xq~L;!#ad}K9;mIISd8dCp?M|p7)H0H^6Okt!I z_)%ZK>4WoEF?OjkNFb$fP=R+Lmgi^3mV?@bA!Wlgs zkVBD+9kx}j!QIQh+*V$v+!hML!g`3N{BN|BSdp6}SayB1Ivf?gJS7!`HW+q1B?6Lc2t4v8^S_U^4s$!>1X;;ey-5z4kwU;ooc4hD-nvWNN+Qu%>k{3)yR_w0~}$+2U3YeG10Q%TR^&t+Xhq|~ zF3w$reMBx`8!fE?yE;*HoqgGA{EF!J9<8)C!5i+|Mm6(=#QX*dL^V_fC(9v0d~!YR zEA=|#fH*79e~p6hW>1c|(6!qwzh)(Eg)b}0(B&;6G<3k{S(M7 z1h;y!uvuR{4eg=l0tW5@I+tza=*@GhAO0tvKM%SrZQk2{$A`Az-#J<7ZVtP>hyZhT zdk#O&UbRp=Z_BGWkD)mwGBfoz!YVU7am?5qZlH`|8u3M!*cPs;FF|;bKYTBRuPG5){%bK4_0VrpY}~YXpjoot&?1^NYBvXKmgUV zx(}V`AWa3pI4^Fx7ND~(yUl#LXaTJ(83l6zCr$m{_0wr^fFTi0)aWx9N549%!P0CG z@IInxu33L704Jl7!@s(2*AZ*Y^uPMuM7(-vkQ~HNB&jysL#7aM=FjrnHFa`}YuOEX z+o>v!EAKrl&C}@&oesL>i{M&6Iooc-+Af5h)$S1EudwZtN9UyTJth{4uJ15MD}uP+ zf62f8C@hTi&DO({!hN6_5L+j&LEpwJuMy2ATyDPRriQjXNdvWuqc(M zH06z*#aG)@Dc_IIH%-%&nbnx6fmhDY3!#5eBztr6- zH2u<$wB2|)9RFn$O1a9b&#?ab0qPmFMXT|V;0vhG=?BLuKS$iEe%-gEwoHojfyW_Je*7m zi5(hzJ@qb4=IN8qUfqw-Sjcn70QH{>9!OVm>3a3ytwO0fOlt7=k^iuKS_<&)I48hB zg(aZ~0tj6bkbUi2L4V^pa;VB^zBA}G;MTtC+Vy^Nc6`?>BG@z-FZup`ZR1lfiQ?skQN__c_CsU6Z#H-TGBl%DR1N z^{}G@sWxJ~kn$)2uP!9`GL_&7JsYCSva@l^Yq}>`qY!XwK0-o>GDg#w z@UVwYMqvm~r5SJqW98BT5*l3~xkYKfBy&^b+PaAbT8N%qTw{@==*;p_3@0V}=3;(6 ztarLJN=a5pcV{kX)XcKT9zM|IzgI9`ex2QWwdiF;=VXsAjaN^l^Gz{q4@Z>_r8l>E zd3e*F;&)1;k&JoMx^u5=jYgFMI!~CY^L1}y`~I$CTM}d`1QMYDrzAvHfYJ}Ng-Dc; z6{4$s07?ZhR}K7RU(`YNy$xy+y-8=S`l_~4UF)BPcgSd-$r-;e455%MgP}FR$YU_5 zw4ExbT!zQ$U+8lDMD{0jI6h%lSO@>cXeDXpSF{W?jQ6%F`XdJ_6@*!t$B`E_jbf*m z*(xuZx+PufU!`&QROqd{e~X*3i<&NbMolLOdXD|~7H{~qmU1>k(OI_lW+$Nq*6*^V z;Z5U0R|5eF&d*vshSuT_L?wjM3HS=W!lgQvOv?#BRl#Od`B=`fH3vG>%dW59Y!|&i zDz`w)sO4q24{Kl=Td;*)3p(ILR6dNZUt~K85#uo)UVp$0sN`;{>%k)1P4J z8O}{~iw;Bnwe@~g*-2n5j2uog5_Au^E1xQ*Ml^YU?*=@{?l4QM=3BvmqmY2EKUGVl z3TsZ&x)YqiZm^d#YoE@^g22+cfW88d1P0PFK(vMP5f}+!7>`WENCafOVkTc#TgS8( zoQg-RXbQs$dvE!p>Uox{(LAi)gGi(5wJz^(%Te(>$>OMi#}5A^-ES+qC?+ygVk3&bg9p!PLL*?-xni zxE|vu*=O6)<-?V-Hcj&=fVEOm$-f4h6n-phOXXRtv}KcvhAm!c+%GZ}b{&wBDdSI7 z1_dZ=EM9glK%_2y8KTqcGpPm6*1;2NN2_7#3jS{QpGv+ZpvTE!A!tQ}koKZhG0QJ9 zYAfO)EYlz_@ndtRdl*Dp;bBKVDqfRdX}cyZB9!7T!n*PzmXZpE1I0c6_4x3p?8Nf- zYhHh48LQ-Js1@!sWDoG=RT}7Miqri1xc0!KJK!A?QIi!72{`g>OSX|O*-&)-%3Dvdi*GQ8E*L3*Lrog97UsNomG<2?&P4yQE0 zm@-4VbVCeu8vd%SnW~TgHez!4rdxY5F`Hw(xw026{RN~2rGY|SX)6B%aa(-2VMMQY zf+P5NsN$0^CNU$)y+(f|17i?mtI&RIdd24X{uHxG)O<1Wl3|{$B_HY>5~U%-Sw}-F zCv8y4U7z2PwWUW)<+jaWSA%G>$nH8{YOlG_qyv7YG0Dqw7GJgK)*cNJJ>J?hS<&$t z5|^%N0^DdS^2!uq6^BP!1s z(w5O(6JDTT>XJ8GHg5a7_KxMczjw*YD_w=&0$j>`ZU3(uKoRXOKZW;Xzj-znMb-sW zbh=cg1Nj~yd1u2CU?rS8Ayoe&i<&Z2>);v$ZbemVhbxWWErO~N<-99z+6VmNx)?J*h;{On4 zJTvsl1IRg-x_@8OSGUtIXi1;8+HJ6FDr03s`Vn85OE=Ax7?qnT9A`>{I07z;xt}x{ zco+#mr*$!}K5K?wRPD%-@fLlUiemTpK&YAfS#aASM@gPwOl{+ei)Mq1@7ubN5&_xr z=9SHrj%QzuGX8W_5K--cQbIKaEF>p*ZYwvF!L%Y(Rsb$$8w5O$N*5|4{9z!P)1jm{ znc*6vx8THXmgXO5Kl-(cY3`*z`_1^SqjKo-aFVAV>eX!&b4mP&8BUZ<&VjSKY_Ad< zl3K8LTk~Dv+_*mH(|K7!jjd{zc3z4d-%Rdn{k3~f#^}pN_y?ZxY)ir8@CF8F8SYRD zsrP@H0e5(`?aherhf4Yv&==fu=5Mt&c@fVuiNxEDI5@0XJQ!Y0&sPL<g{vE7@sO2< zwcP-O@%>S4C?LrbI^o^+)(#P7Dk=niUw)Oof2WuUV%R&Sj{mbRmmk zcPIdHc{@v?+4lYdog9HuDy$?a+4YfTPn@6r$$+rh=EXD1O2Go=V&TX~G8)?o6{(vq z{cB3Ly}IY?zcQPD!!^3*p6{aVr3PGqb|2O7nJ3Xh+0K7BWWN>7<1}TQB=v>0s$$6F z`tc%72a;m@oOO~4CGh>_^N^*|m$&wm2wuwLKR%0`_7q;qcZzm(%ad~|9eIkW6rFUR z8gx8`_qurezf@?3e3PyS3V3t25nGypH?(d1PIP6WXMto}alU{|h|Jg`)Qr^)1Vat*xpO}QGOWPFE*=e?fWc!9fX*zVqQ5c>r@ctwI7~(GBfFP z$L3{&?~8KRk+Ovf7||uBP|^*_U&e;klM^vxXH0W{0i4{{!d1X26BZ68_WJ4jbL51*U&KYHY^b4m}>$c0n5`q*Pu4wK zCvhX*tKmpN)Z_14!G|^`fYrBFc857O(I0TEi6$Yc{Aq*WKzUJ5W6eC1?jZOMND!zx zn!+^}s$wjtsdD8cwo4KcgqY9`{6j-~+bY1H6`xZ7!1wna2!M80Sl>VC+K*XDf%X^b zf;lTULc3SHQl|R)mnW=YrSoU6VGm z{c0(-KydY7s}@N%4Uh@a1a2qNRdNP|3G`x-@3TLcNC33i87;JA7ugC+CsbVzd3%2& zDl2Aq;iB4TK|j$&HxD)fvaxO?j(1D=BKPEb6R;ogFJK1JSEtsUFuU*Dv%4mF?14LJ zbkbo@^7%UC7Z}T(=vHkxywu_2{6guhf$Fs;QR*2-JCLi4!qdV-Uj~vQY~S^R_FMBA z1<6c^SXynR$iF`4b$Ysv41TOPjM)}=P!1+7{#$b|wt6%(ux#jqmqR&WO6G+%_-QIa z4==flT*`twzy@&IIe_~4UEm0j?<<|^dK*!OQ?gVQAt#;KgSM=4jw>x=L&y2G2379pslx4fJ>L zuh09@tj#>KgI`Q$=MAH42es9udoPGh%6h5`O8SQoPw7U=?TJTMM=} zR$w7oSWFnc=e@U#>z(b_qx$4d$9EzwZAJTq7gz>d{eU~{*~2=$5%!PaUQ-+C)w359#&)p^1pW0F*b5XBSkCmOdqIA-<%s4DgBSg zz#H)Ku%+8zYl}k-9BLe-c0nJRGLr8QH_lt3|0s!wlyS_ z_S5I=lRhfqrjpaI+S7Swq}%Y17r5}Ph0^~*Dny893g&aeI3i@wu$kg1wsRjKfo>re zMmQih$3P`oqMn)F@;_eLD4%zN|NXuD!+cI;8Nz&Ct?vu+yvPAJsNAwyDft3oAZ|ah z_<-F{i349b>fk><|37cOm0Mo*uvJ(i^$_Vx$?GYuP_SraL!8B>>i4TuDNgdMC8q!4haY#{ts){u8>dffb>DS@+fNUM=5{YZ zZrtB$chh{0L=3V(=k`;`l@X$wrBrVHixo>iSlNG!8KiF)M3@+5l- zR!~_mq?YO6`kkw%W*9iE`@E_6zlfHElFOd@W#dAN6`pL6IwMmqWdj-M4&Jd=qvhPDN5=9JNK0b(u(0Y;r}7>S_=wq7D|V*`w-DJt?wu&kby-%M*B}0;!z54ucNmx z;<9Xu-nYwY`5RY##4E6daEGT|6SoYBi7`wdVvGxvK%PNB!@ANsYDLiesaKRF=#Ln& zFBg$91(1+d>l(P?g-_r9jLOi$Sttm0wUE{n5=&JTvr+ zLFpGxBR&6!Yy_+nohoQPvsU{dbJg9~q77Gp$M>nv?ljCfc(-+jKH#kv8BdBBX&T=y z_*VL#x=pf9S+N3$dqG35o9&Ofn(Iza`J++xT7ItOc{;KcOryC61ku}AmGl=;q5>Eb z921GHyOjm-eUt^yU+Z{lEy7D7tYXfG^vMkc{*yXAQ)t=tJ>!Xiimiro6m+_tB2cHJYvs@OYwMWk zLiIo2F&Uow&Ty&5NoY`y{#V2QWHii??hJ7!U6q7g&&pw%=2*wez()=y{P1H-P+&AS zQura!lG>!B0Be%BvksuHHq1jlBG0!7EJDDWg#wCbAE9iCU|EIEGS3-=gbxPa{TS4l zLoNUQ=SfVl`>uCQ!-*yc5oG)FTK3vvr-%6Ivu#BcEwD*tIJ1+=nYNmCwAh#&YFSrQ zC&9_r!pD+fDxa`LiDkG$o;zkz3qF>w2K@xa>_K4m3ETe5%K&~Wc_}&p;4iw=rYMuV zE3nn7p*Qm6`%sh~%7EN^>jPGx5oZ}yW2~PqkXveRMpp&yAYqno%Ug z!6)^>orJ0AIv--`MyH`IY9}X)zQGO;W*$-)Hx3%__AWuSj3jy0!Jx-?uyEs8u+Ozj zuFn@N0up{NMTvF4oA0J5-53xHKWo``SJHvFSHj&j#*O3muIN3+^QS;l4Kl~^UoOm^ zs+T}ZGothbuw@8*pwLfs6)<~{z*7RO?IJE=7>QsovxcB)qo(!IU^}OqvV}|MXg`i6 zi+Kovu`tVgF^uYR=PcL`&x=fd$9Fy*bvJ{NlRrbBP$JbAEk;E~dSdT;O!D#TH2;0^ z#K?JekS*-#9(sF$&kBei3PrQtb9|2DxV8i{V}#wJyB)LcVOZ^8LEcBmOJ?{!Gy7C* zhfF(Sy~@jB=S>)M$!8FnU@$*G%C(i_QavRb+k}NGB4+I#XT$#aqx_4Jd)b++nH6Hz zC5{#~X<9s+(CY)X|0$IgyjRGqg!Y4oc|A-!Efc0p`&JvtIyGWvM+>qFebBepmb^9J|M{^L<`~#^(df>S z{hacv<%!=@#`U6 z6t}G0ywRkeFs7IOjZLlvEYZzx9C+oUQxn2*bs=`9OE8`?Vv*F0Om?X_AtI9~r=!3w z({%PU>pnkFmaW5|6^m`*rpdUQ4V-zTg3N>nNT{?Q zcZd!b`a#0N)#R+)66OGWG=^cuw-NP`AZSs0zd{RdEGUdcytR&;$?Y84RlA6uI3GxYM3T*ll{V&BM5ey zb1-Y|898p9Wc`&_f88uY!^rpT>V*v@+4$L;f3W@{MFal&hQF~kT|?pF(6z*1!`QCR zE6w@*EC*MRSW#wbbobb=dEu)731<{%K^d#TpjM~j9S{7nK)AA%AN z3QjP(G6}U{Ds(h?;2hKrpW0{~E-q}U$;zbDOfnLe2j0>=#)%RcA>XqWp2yPO87a>G z_78Mqpx`Gd%NkEc`hlK1XgABMVBwBMts*NBZp86;RL`I@JKZg~FhhE`hjldg*JC&9 z?SeNJjyAZyTsNl}x{%B(3UY4((=M7g=N&WAiRbvF+ds{E;69e@2(1<++X^>kh)Wb8 z;v@yU5)ZwSy>5mTZYLw^KB=1-Wkh23!Rd%nW6w@6OeqgUBwQ15~53awN75sfTmf zC#yCPi7&5(Hs{YrRpC&ZQz!}X7F^mq{n9%Cc@f z4C70ke`n+ivle4^EX4Q4tz}s^NQZcRH49YdKJ}W%fu;p9iaFHY6vO-^(dgR_ns4=+ zttjcIT^$WJ@_Whl4_sC}^7YDm4YWkL5(Gm`0Q2>*b#;SR+DEVyAY)r1 z!%DC}g<@BnTDfdWe0kYoF#D`(h9<2rD;$@O4{vY_L0gD|(@q7Om9i?;Zf^GeeGt?w zv~VH$_FKh z`u_a>i}(BWd_JC?_nh9?re1_CDT>s5QdO!|Oa=e|xj;E>ZZkHX;faAR@RD(rLs`r_V*`vu7$TzNKylnQ> z3kx?Vyc-NPT@V#cJ&(BwzBG)nqd!oJqZh@p{p@$cVu{|5WEBuBK|=C5J~=8u`;_^b zl1(@XBskQnN}67W4FXYl6GC!jD4Cz^Cquf+NLjp@1aG&a8pU=bsp|hoooR{co^SRs zb9s`I6uun+u?)wpeRe(RtE$3DGb}EY`GLd42Lp4n;Q6Q3iz8P`(x#^c562w#M3h|Q9bnhpK`TpjDhq&OcXPI3JZR`wE*FEdk z$uQWd%{q*l^D;Fd#NQPGXrWORJF(R_iXkAxG&1FFf?I7xH(_-6-=B=yc+;LY_X+} zUl!(_{|XVj6~o`E4SbGIR}F9e)R3Pug=g!(0JrH71rZ@%-PDujt#P7 zaTBDBX?w8KVntC3>U%aoA6;?oQ)H5$Ajavd?cMEYj2v`ndOt880SUCD;}|J*rGHFJ z0>gQ~ZW+D>1i3vK#q|Upj&DxB#^GiTk#)3iFTU*X}@y}@5w zzd&Yf4mNhcRi1F{rFO=GoeAmc3{jifoLpK{T5ZbgD}dUTvYwoshTw4TwC~-qL;5J< z*w$X-xCrPB(#GukQOR_sG<-N3deK0@GLT_{q{cil&YFv8+6MT~*t{sQ$I!`r-xmGw zo=4X`5vO(0$?oJ~)fLPh|D{=%gVW)8W3zOb^6e|fbLaI&jqZLD9tE8sZvYSW7({>X;&iP!| zXv&9bn!!Kz(^A_z1MRWY7kkppLnwE{W*+_XXc_8x z8})xwGl^F*7Y-$&_62tP;}Qj2ke6gUQH-+7w(O;tH(Pvo9fYD!hGw#QSH|z+U)1ea zn~nf897v<@-;G`*H4!RO63*oIdm|LLIFI4O^`)QoIeZPes5rp1b!>v4izcp#EkMcd zb!9{7@rkj*MlH>);lWu)Og#Q|u(+LevY2gpM+RLW6&qNIQC$$uorvY!r#yN#pf(w! z9cwyuEHRR#9luRel1AmyQ{R3Z!BA8%QrhKw#xmSlb2~dg*haYo+|&eAg$lIa0<{&5 z%n?1*y2adaZ}Ea+uG9)ONGo7V3m)0JzkCh+FIRM{%|yATL%reVxS z|9hRd%8Ak4NNn@YZL`EaRe>%Q*xR(}YHHT$KJ@@ST8Ls+bx!RYUX66<*i@&|{Q9gl zvz4q4`9dzOyeJ^{YZ_oBt+V)7e%L=|#F? z^P2d}rZ9;L1MH(6_VcQ5Iil6}`SWdNBwCWc(NCjife(~7v-?;<2@bLf9l+!q?b=)P7hY*x<&7)jQ+WtC?#W!myJ!2P^;E}Mog!w(oG6P{NuiD zX$Nn9c1jL>v&wl0UUu5I=Hq4N!6?#UNLIA7#M)`5C&CnTG}k%zd#ylmEG_y0d$^5z z!fvmI)RJ$Cq&R`XMhXrAu{oj5;b8pI3G%OWkk{vzVp!mPmhi=Cja7E=f$G8Ua1{xl z;=PYqY`=kywZRn7GjHhZzgOz&b1rBAmB(*=;B?)E*tqvqMoZ!#Q9py8&zv@=EbSk) zc*Wm)|JJOo+BcD8*T~GE@w;ZoY|92M;f^^@@-|IfMsW1&+y!`r&2Mc-4KA{h=L%CW zbq2KMC#r^5TdbI#4+ps{cqi(WL$eee`LLkZEE=Vm(h?l0c<@OC4;sjB)N)PiM!irm z6&me>h<_2fss`CeJX_l`JKV%6jQ-EI7^CTv{jpKkWO^-*C5cuw*i-IX5Vr+3G$bsH zPLcBr?xD2&a&l`x|M%eXuf;44~6u5~xF%R}PLy+0}qAp;neEJ+d6h&r)_y_36hu z7L*h8C^ul;!&cArm6XM)4mur16&qYmVZPKU(+R5aj$OPwmi*`g6^gaa9|H?6G4ZeT z%VgGOyWovsqL;sk+7xqs$Bx+<4eo;`vuCe^Zd~SzJTwYpEy?YfM6RLtE=P2yMp3>O zrz~`l8r;(k9{D%zIQKhkV(XqQreItead$lHG3ZoSW-~7(H&*N%o7Ed(_hVwKZaZAw zrp2%Y91lxLKWwTf*DxxlQ|L*4>ISbr7TlsyrhYhi0wO9{c^d|FLS}=&xf8!lZO?FV zDRdjX*!OY-r&W=!*&_$@9e$bb*Fmo!RN<}1)OsX2@4g*Z@7pCb7p>en>5}=YBaa$2 zA-48vFw&c#S=%+`qiL5*cp689q1MyyZ>hD#T%aJRlMW#iuVOZ7ui_ZntvWI0T1Ljb zQEW*ij$!Y2{}V4OSOSi~Ny7d;x*Od!Ol3Go&Z5q)k!StI2nwFp=On%ab5l703QIRy zQXFVr#c7zoW_=7UPL%Mm1738d>X~UdntThW}(fg+=1D%RXo*R;Stk?D$6Ls@sed1d5BmX z`NxSF)7I0E@357O0h5Ji&wm2rqNY?H8)TST_ zBvf$TB%bcroivDfW7dgERdK1T1&3kt>^~okhuNBsib%k6WPA;spBQ21t3LNstEE1y z4PrJ$^;#TOU&P%U?xd~vU@S2r!Cf8fPP*URweQmow-eA=ubPblAG=lPKlIm{!>1zw zy7e7Z55ZmGy&=4J^4Gadr5WdraUlmlY7wB;6&KYOjUM!#92^K5bUPdDk0QAG7XWNtp zwAC+rhP@z-gkc@|dUB4E61&b=Mju}f&s_O&_+>t$Ilya(65qWruZS1~ z8@?P{dyDLnwR*3lytSHTvhGf$JJkM}BG6t>=^N*pLk7$j`N`nalSF2qhHu|LT6_l$ zRP!fESP|3A8gHllLdVk1E=n8dqP~f?F^@Z_{H8b7xC4ITp1#0LWAf6-Ag#JqDV?-s z{_U^{C;N$uDjKGxN9hL)VL2j1kF z6As-;>G>I|8+r2Aw`bid#==Cz7{vd$Y~M^fmM>Z+rZ4)4SjPXSaI=nLR*1!B&VY0a zB>cBTUDEAuTCx~$Qoj*nQIX6k^K{29R0#aJaqArrXQ1?!XK_B z==m}K7AtkLc-?B17@Cir4#b)6s>pyP7DL*yY|@o1h65B)PU2r`*V#~qCwZcKH1?oj-YS(M$WJvw1QkS_xy9krU&`Kap|9*5ZV z62dv36zXMZh}+7XY8^Wf16}<7zbv_<%hP=6l@nl7{5lq{SI;6GcDk<+H}80 zC5mIE-fja81%V>Lss#}(&tPjows)a}z-WSw^Xx@OVY?L>4bR3SGXS3nQzbRnd+v*v zhHaq$A;|u(x{(5z6Wotr(G|^W;MWHne8w(0o352%S#<%%#Y0p?u;$Y0`>o7<15AE3 zWZBYk?vDCm656z|JDt)YpQOiEv~~pCYTqAs4~9k+!Z`;vvu$?zkJ@9vdgOz{7QUyG zchRV1iz^iWOV$AB$N^gch;(Y47>26Pux{OGO}{aVN_>M%aDsKy66h>+S|1XtblHri zZpxgsuzpPxq%~n3{xf+!dTuC98;<~5?t+0sKMTgGyPa2xF!_kFkEA%YgBFy1;ZV~h zgC>5hKJC&DpL8jhc6G-{?>61j%$jM7*3=i~^ji13=0}=o04k*pvcD+E#sRv&d($n% z*^8Rjx`!fxzSP=omzLoa;U21i z5a@Dca`s-piAwVsk5nx`5ET*k3wtb(c*!|T*Gf}}aj257=T6!*cSs&^e zGLqQuat>fE&lmDj9xhk_}4KBQ>rp9ZJF#rYlKDV9y7D}~!K8cSlu z?(N3wIQH#sUCA7;gQIIA;+nd@f5e4YJ9PCnHpgNeUf2dZaKqnMZB{!a+u}n@y621{ zg{oZakd+Znevx@@dPFb5&${zD#o#};UK`-XuRVrS%gMHTe*EhrXmP!tFFvxWI^Q=1gOaQ7(Bo6xfZ%omJxB;wt{DS9YbRo{s> z1?2U*8AS&cS*nsiP!=CEiy`H00xEJG8@m5vkwE+e$Ku9rC7PcCfafSoK((h)1`9HZjW*iCuV%*_o*#kbPr zrS%n6N5*wqN9Ft#8gGO2lB48C+8}cK9$(FO4vPK6OZe-9chcKFVAv~u&vI+swYnul zNu%gS<~dQ4^nx%OQKbg_!pR6l^m=@-4Ek172I{vP5!lF^*QlrjF%G21YdKKdetu?N zVa#w^o68q=4l*XbXZ`HoFVy4b1M>2_VIYb6h$B|2ae5KQx-bX;KilVoc7ZAzW01?z zwCiZun>K1T;Xz(dU$HF>_K(?ZmWkfmcPA%iQMl-iraX7xT^reXA~B-X<2EKY+uWuh zJM+*@HtP7dTmEMAPa6oz&uY?A%r_^qxsjh6WkVVK!-ms7%Dc!`JV1__yo-KS_^MVU z3Ef5(oI^TQMCg3?<`Y||E2UeHD3weW-Ld6p0kkJsK=oZ!w6wpbAN7I^+@wu+=5NGE zkv+xskMstX3I7ULzgoh>??r$DaEYi>Q3e|~m|R~uO3q$=+(v5~a2-aD#(X^bZ2^iV z_A6$9{85jg%01Vt1)s;SG1_eP#2z-S;YGZ(EEIHih-WQn9>%6~q}Yq4VF{9Q1MV1Y)0-CCKfLVUI=flK`?nb%I;U z+r4On^$8RB(ybG<;9*emsbr<&>-+--u}6}BHsflL`AM|-g2185z_DK|KLsUo6|&xW zMRHV`s?kx9Yrc-04P*_}e??*8z`*`X#a9bMCo6`Of;bWZLGE8}Y#|-+wEa|RLi!F9 zrV_Y*kR1tL)|629<&@cNc8n;E5K{6}Z6OliMQh<-w(6iV*OZn9(w=zA@v z=|M{%J0d=681*tB=v!~Z9U~*8;ene+&mK^HN~!M&&XV9T?^{V||#$IE_7Xda_Rsm%3z{Q&0qB`aM1ogd-p~Q!QO=m=h{b;ubJVKDcMW^zufyj az*6-s`(GxY<=x?7fW7T0a=kS@?*9Pzg2=r9 literal 0 HcmV?d00001 diff --git a/launcher/MainWindow.axaml b/launcher/MainWindow.axaml new file mode 100644 index 0000000..c5dbf52 --- /dev/null +++ b/launcher/MainWindow.axaml @@ -0,0 +1,395 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launcher/MainWindow.axaml.cs b/launcher/MainWindow.axaml.cs new file mode 100644 index 0000000..bbf42d3 --- /dev/null +++ b/launcher/MainWindow.axaml.cs @@ -0,0 +1,980 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Input; +using Avalonia.Interactivity; +using Avalonia.Media; +using Avalonia.Platform.Storage; +using Avalonia.Threading; +using CmlLib.Core.Auth; +using ModpackLauncher.Models; +using ModpackLauncher.Services; + +namespace ModpackLauncher; + +public partial class MainWindow : Window +{ + private enum LauncherState + { + Checking, // initial / fetching manifest + ConfigError, // manifest URL not set or unreachable + nothing local + NeedsDownload, // no local pack, manifest reachable + NeedsUpdate, // local pack version != manifest version + ReadyNotSignedIn,// up-to-date but not signed in + Ready // up-to-date and signed in + } + + private readonly LauncherConfig _config; + private readonly AuthService _auth; + private readonly ManifestSyncService _sync; + private LauncherSettings _settings; + private LaunchService? _launch; + private MSession? _session; + private Manifest? _remoteManifest; + private LauncherState _state = LauncherState.Checking; + private bool _busy; + private bool _suppressAutoSave; + private bool _infoPanelOpen; + // Cached "what the play button should show when not busy". Updated by ApplyState, + // restored by SetBusy(false). Avoids race between login flow's SetBusy and the + // RefreshStateAsync triggered by ApplySession. + private string _playButtonLabel = "Play"; + private bool _playButtonEnabled; + + public MainWindow() + { + InitializeComponent(); + + FileLog.Init(); + _config = LauncherConfig.Load(); + _auth = new AuthService(_config.MsalClientId); + _sync = new ManifestSyncService(); + _sync.SetBasicAuth(_config.HttpUsername, _config.HttpPassword); + + var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; + var versionText = version is null ? "" : $" v{version.Major}.{version.Minor}.{version.Build}"; + Title = $"{_config.PackName} Launcher{versionText}"; + PackNameText.Text = _config.PackName; + TitleText.Text = $"{_config.PackName} Launcher{versionText}"; + + _settings = LauncherSettings.Load(); + + // Initialise RAM control without triggering auto-save + _suppressAutoSave = true; + RamBox.Value = _settings.MemoryMB ?? _config.MemoryMB; + _suppressAutoSave = false; + RamBox.ValueChanged += OnRamValueChanged; + + UpdateInstallDirDisplay(); + UpdateRamWarning((int)(RamBox.Value ?? _config.MemoryMB)); + + var localVersion = _sync.GetLocalPackVersion(GetInstallDir()); + PackVersionText.Text = localVersion?.Version is { } v + ? $"Installed: v{v}" + : "No pack synced yet"; + + // Maximize is disabled on this launcher -- the slide-out animation gets unhappy + // when the window can't actually resize. If something (Win+Up, Aero Snap, etc.) + // pushes us to Maximized anyway, snap back to Normal. + PropertyChanged += (_, e) => + { + if (e.Property == WindowStateProperty && WindowState == WindowState.Maximized) + { + WindowState = WindowState.Normal; + } + }; + + Opened += async (_, _) => + { + CheckSystemRequirements(); + await TrySilentSignInAsync(); + await RefreshStateAsync(refetchManifest: true); + }; + + // Auto-refresh manifest when window regains focus (e.g. user alt-tabs back) + Activated += async (_, _) => + { + if (_busy) return; + await RefreshStateAsync(refetchManifest: true); + }; + + } + + private async void OnRefreshClick(object? sender, RoutedEventArgs e) + { + if (_busy) return; + _remoteManifest = null; // force a fresh fetch + await RefreshStateAsync(refetchManifest: true); + } + + /// + /// Compare our running assembly version to the manifest's launcherVersion field. + /// If the manifest reports something newer, surface a non-blocking banner that + /// links to the public download URL. Doesn't auto-update -- friends decide when. + /// + private void CheckLauncherVersion(Manifest manifest) + { + UpdateBanner.IsVisible = false; + if (string.IsNullOrWhiteSpace(manifest.LauncherVersion)) return; + + var current = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; + if (current is null) return; + if (!Version.TryParse(manifest.LauncherVersion, out var advertised)) return; + if (current >= advertised) return; + + UpdateBannerText.Text = $"A newer launcher (v{advertised}) is available -- you're on v{current.Major}.{current.Minor}.{current.Build}."; + UpdateBannerDownloadButton.Tag = manifest.LauncherUrl ?? "https://sijbers.uk/pack/BrassAndSigil-Launcher.exe"; + UpdateBanner.IsVisible = true; + AppendLog($"[update] Newer launcher available: v{advertised} (running v{current})"); + } + + private void OnUpdateBannerDownloadClick(object? sender, RoutedEventArgs e) + { + var url = UpdateBannerDownloadButton.Tag as string + ?? "https://sijbers.uk/pack/BrassAndSigil-Launcher.exe"; + try + { + Process.Start(new ProcessStartInfo { FileName = url, UseShellExecute = true }); + } + catch (Exception ex) + { + AppendLog($"[update] Couldn't open browser: {ex.Message}"); + } + } + + private const double InfoPanelExtraWidth = 334; // 320 panel + 14 gap + + private void OnInfoClick(object? sender, RoutedEventArgs e) + { + _infoPanelOpen = !_infoPanelOpen; + ApplyInfoPanelState(); + } + + private void ApplyInfoPanelState() + { + var currentContainerWidth = InfoPanelContainer.Width; + var targetContainerWidth = _infoPanelOpen ? InfoPanelExtraWidth : 0; + var deltaWidth = targetContainerWidth - currentContainerWidth; + + AnimateSlideOut(currentContainerWidth, targetContainerWidth, Width, Width + deltaWidth); + } + + private DispatcherTimer? _widthAnimTimer; + + private void AnimateSlideOut(double containerStart, double containerEnd, + double windowStart, double windowEnd, + Action? onComplete = null) + { + _widthAnimTimer?.Stop(); + + var startTime = DateTime.UtcNow; + const double durationMs = 220; + + _widthAnimTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(15) }; + _widthAnimTimer.Tick += (_, _) => + { + var elapsed = (DateTime.UtcNow - startTime).TotalMilliseconds; + var t = Math.Min(1.0, elapsed / durationMs); + var eased = 1 - Math.Pow(1 - t, 3); // ease-out cubic + // Animate both in lockstep so the Star column (RootBorder) keeps its width. + InfoPanelContainer.Width = containerStart + (containerEnd - containerStart) * eased; + Width = windowStart + (windowEnd - windowStart) * eased; + if (t >= 1.0) + { + InfoPanelContainer.Width = containerEnd; + Width = windowEnd; + _widthAnimTimer?.Stop(); + _widthAnimTimer = null; + onComplete?.Invoke(); + } + }; + _widthAnimTimer.Start(); + } + + private void PopulateInfoPanel() + { + InfoPanelContent.Children.Clear(); + if (_remoteManifest is null) + { + InfoPanelContent.Children.Add(new TextBlock + { + Text = "Pack info will appear once the manifest has been fetched.", + Foreground = new SolidColorBrush(Color.Parse("#9F8E72")), + TextWrapping = TextWrapping.Wrap, + FontSize = 12 + }); + return; + } + + AddInfoSection("Pack", + ("Name", _remoteManifest.Name ?? "(unnamed)"), + ("Version", _remoteManifest.Version ?? "?")); + + AddInfoSection("Minecraft", + ("Version", _remoteManifest.Minecraft.Version), + ("Loader", _remoteManifest.Loader is null + ? "vanilla" + : $"{_remoteManifest.Loader.Type} {_remoteManifest.Loader.Version}")); + + var modFiles = _remoteManifest.Files + .Where(f => f.Path.StartsWith("mods/", StringComparison.OrdinalIgnoreCase)) + .ToList(); + AddModListSection($"Mods ({modFiles.Count})", modFiles); + + var others = _remoteManifest.Files + .Where(f => !f.Path.StartsWith("mods/", StringComparison.OrdinalIgnoreCase)) + .ToList(); + if (others.Count > 0) + { + AddOtherFilesSection($"Other files ({others.Count})", others); + } + } + + private void AddInfoSection(string title, params (string Label, string Value)[] rows) + { + var stack = new StackPanel { Spacing = 4 }; + stack.Children.Add(new TextBlock + { + Text = title.ToUpper(), + FontSize = 10, + FontWeight = FontWeight.Bold, + Foreground = new SolidColorBrush(Color.Parse("#E8B95C")), + Margin = new Thickness(0, 0, 0, 4) + }); + foreach (var (label, value) in rows) + { + var row = new Grid { ColumnDefinitions = new ColumnDefinitions("Auto,*") }; + row.Children.Add(new TextBlock + { + Text = label, Margin = new Thickness(0, 0, 8, 0), + Foreground = new SolidColorBrush(Color.Parse("#7A8497")), + FontSize = 12, + MinWidth = 60 + }); + var valueBlock = new TextBlock + { + Text = value, + Foreground = new SolidColorBrush(Color.Parse("#E8DFC8")), + FontSize = 12, + TextWrapping = TextWrapping.Wrap + }; + Grid.SetColumn(valueBlock, 1); + row.Children.Add(valueBlock); + stack.Children.Add(row); + } + InfoPanelContent.Children.Add(stack); + } + + private void AddModListSection(string title, System.Collections.Generic.List mods) + { + var stack = new StackPanel { Spacing = 6 }; + stack.Children.Add(new TextBlock + { + Text = title.ToUpper(), + FontSize = 10, + FontWeight = FontWeight.Bold, + Foreground = new SolidColorBrush(Color.Parse("#E8B95C")), + Margin = new Thickness(0, 0, 0, 4) + }); + foreach (var mod in mods) + { + var (name, version) = ParseModFilename(System.IO.Path.GetFileName(mod.Path)); + var row = new StackPanel { Spacing = 1 }; + row.Children.Add(new TextBlock + { + Text = name, + Foreground = new SolidColorBrush(Color.Parse("#E8DFC8")), + FontSize = 12, + FontWeight = FontWeight.Medium + }); + row.Children.Add(new TextBlock + { + Text = version, + Foreground = new SolidColorBrush(Color.Parse("#7A8497")), + FontSize = 11 + }); + stack.Children.Add(row); + } + InfoPanelContent.Children.Add(stack); + } + + private void AddOtherFilesSection(string title, System.Collections.Generic.List files) + { + var stack = new StackPanel { Spacing = 4 }; + stack.Children.Add(new TextBlock + { + Text = title.ToUpper(), + FontSize = 10, + FontWeight = FontWeight.Bold, + Foreground = new SolidColorBrush(Color.Parse("#E8B95C")), + Margin = new Thickness(0, 0, 0, 4) + }); + foreach (var f in files) + { + stack.Children.Add(new TextBlock + { + Text = f.Path, + Foreground = new SolidColorBrush(Color.Parse("#B7C0D6")), + FontSize = 11, + TextWrapping = TextWrapping.Wrap + }); + } + InfoPanelContent.Children.Add(stack); + } + + private static (string Name, string Version) ParseModFilename(string filename) + { + var stem = System.IO.Path.GetFileNameWithoutExtension(filename); + // Split on both '-' and '_' -- Modrinth filenames mix both conventions + // (e.g. Terralith_1.21.x_v2.5.8.jar uses underscores). + var parts = stem.Split(new[] { '-', '_' }); + + // Recognise version segments that start with a digit OR with 'v' followed + // by a digit (e.g. "v2.5.8"). Find the smallest index that matches so the + // entire trailing version chain is captured. + int versionIdx = -1; + for (int i = parts.Length - 1; i >= 0; i--) + { + var p = parts[i]; + if (p.Length == 0) continue; + var c0 = p[0]; + var startsWithDigit = char.IsDigit(c0); + var startsWithVDigit = (c0 == 'v' || c0 == 'V') && p.Length >= 2 && char.IsDigit(p[1]); + if (startsWithDigit || startsWithVDigit) versionIdx = i; + } + if (versionIdx <= 0) return (stem, ""); + + var skipWords = new System.Collections.Generic.HashSet(StringComparer.OrdinalIgnoreCase) + { "neoforge", "forge", "fabric", "bundled" }; + var acronyms = new System.Collections.Generic.HashSet(StringComparer.OrdinalIgnoreCase) + { "ftb", "tfmg", "jei", "rei", "emi", "ae2", "ic2", "kubejs", "rpl", "c2me", "yungs" }; + + var nameParts = parts.Take(versionIdx) + .Where(s => !skipWords.Contains(s)) + .Select(s => acronyms.Contains(s) ? s.ToUpper() : (s.Length > 0 ? char.ToUpper(s[0]) + s.Substring(1) : s)); + var name = string.Join(" ", nameParts); + if (string.IsNullOrWhiteSpace(name)) name = stem; + var version = string.Join("-", parts.Skip(versionIdx)); + return (name, version); + } + + private void OnTitleBarPressed(object? sender, PointerPressedEventArgs e) + { + if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) + { + BeginMoveDrag(e); + } + } + + private void OnMinimizeClick(object? sender, RoutedEventArgs e) + { + WindowState = WindowState.Minimized; + } + + private void OnCloseClick(object? sender, RoutedEventArgs e) + { + Close(); + } + + private void CheckSystemRequirements() + { + // WebView2 Runtime is required for the default sign-in flow. Preinstalled on + // most modern Windows but not guaranteed -- surface a helpful message at startup. + if (!_auth.HasCustomClientId && !WebView2Check.IsInstalled()) + { + AppendLog("[system] Microsoft Edge WebView2 Runtime not detected."); + AppendLog($"[system] Sign-in won't work until it's installed: {WebView2Check.DownloadUrl}"); + UpdateStatus("WebView2 Runtime missing", + $"Sign-in needs Microsoft Edge WebView2 Runtime -- install from {WebView2Check.DownloadUrl}"); + } + } + + private async Task TrySilentSignInAsync() + { + var session = await _auth.TryAuthenticateSilentlyAsync(); + if (session != null) + { + _session = session; + ApplySession(session); + } + } + + private void ApplySession(MSession session) + { + _session = session; + UserText.Text = $"Signed in as {session.Username}"; + LoginButton.IsVisible = false; + LogoutButton.IsVisible = true; + _ = RefreshStateAsync(); + _ = RefreshWhitelistStatusAsync(); + } + + private void ClearSession() + { + _session = null; + UserText.Text = "Not signed in"; + LoginButton.IsVisible = true; + LogoutButton.IsVisible = false; + WhitelistStatusText.IsVisible = false; + RequestAccessButton.IsVisible = false; + _ = RefreshStateAsync(); + } + + private async Task RefreshWhitelistStatusAsync() + { + if (_session is null || _remoteManifest is null) return; + var panelUrl = _remoteManifest.PanelUrl; + if (string.IsNullOrWhiteSpace(panelUrl)) + { + // No panel configured in the manifest -- feature disabled. + WhitelistStatusText.IsVisible = false; + RequestAccessButton.IsVisible = false; + return; + } + var status = await new WhitelistRequestService().GetStatusAsync(panelUrl, _session.Username ?? ""); + ApplyWhitelistStatus(status); + } + + private void ApplyWhitelistStatus(string status) + { + // Status values: "pending", "approved", "denied", "unknown" (no record), "" (network error). + switch (status) + { + case "pending": + WhitelistStatusText.Text = "Whitelist request pending"; + WhitelistStatusText.IsVisible = true; + RequestAccessButton.IsVisible = false; + break; + case "approved": + // Once approved, the server removes the record; this branch is rare + // (status returns "unknown" almost immediately after approve fires). + WhitelistStatusText.Text = "Whitelisted ✓"; + WhitelistStatusText.IsVisible = true; + RequestAccessButton.IsVisible = false; + break; + case "denied": + WhitelistStatusText.Text = "Request denied"; + WhitelistStatusText.IsVisible = true; + RequestAccessButton.IsVisible = true; // allow retry + RequestAccessButton.Content = "Request again"; + break; + case "": + // Network error -- hide both, don't claim anything. + WhitelistStatusText.IsVisible = false; + RequestAccessButton.IsVisible = false; + break; + default: // "unknown" -- never requested + WhitelistStatusText.IsVisible = false; + RequestAccessButton.IsVisible = true; + RequestAccessButton.Content = "Request access"; + break; + } + } + + private async void OnRequestAccessClick(object? sender, RoutedEventArgs e) + { + if (_session is null || _remoteManifest?.PanelUrl is not { } panelUrl) return; + RequestAccessButton.IsEnabled = false; + try + { + var resp = await new WhitelistRequestService().SubmitAsync(panelUrl, _session.Username ?? "", null); + if (resp.Ok) + { + AppendLog($"[whitelist] Request sent for {_session.Username}."); + ApplyWhitelistStatus("pending"); + } + else + { + AppendLog($"[whitelist] Request failed: {resp.Error ?? "unknown"}"); + UpdateStatus("Request failed", resp.Error ?? "Couldn't reach server."); + } + } + finally { RequestAccessButton.IsEnabled = true; } + } + + private async Task RefreshStateAsync(bool refetchManifest = false) + { + if (_busy) return; + + if (string.IsNullOrWhiteSpace(_config.ManifestUrl) || + _config.ManifestUrl.Contains("example.com")) + { + ApplyState(LauncherState.ConfigError, "Setup needed", + "Set 'manifestUrl' in launcher-config.json and rebuild."); + return; + } + + if (refetchManifest || _remoteManifest == null) + { + ApplyState(LauncherState.Checking, "Checking...", "Looking for updates"); + try + { + _remoteManifest = await _sync.FetchManifestOnlyAsync(_config.ManifestUrl); + PopulateInfoPanel(); + CheckLauncherVersion(_remoteManifest); + _ = RefreshWhitelistStatusAsync(); + } + catch (Exception ex) + { + AppendLog($"[manifest fetch] {ex.GetType().Name}: {ex.Message}"); + // Offline fallback -- allow play if we have a local pack + var fallback = _sync.GetLocalPackVersion(GetInstallDir()); + if (fallback?.Version != null) + { + if (_session != null) + { + ApplyState(LauncherState.Ready, "Play", + $"Offline: pack server unreachable, using local v{fallback.Version}"); + } + else + { + ApplyState(LauncherState.ReadyNotSignedIn, "Play", + "Offline mode -- sign in to play"); + } + } + else + { + ApplyState(LauncherState.ConfigError, "Connection error", + $"Couldn't reach pack server: {ex.Message}"); + } + return; + } + } + + var local = _sync.GetLocalPackVersion(GetInstallDir()); + var remote = _remoteManifest!; + + if (local == null) + { + ApplyState(LauncherState.NeedsDownload, "Download", + $"{remote.Name ?? "Pack"} v{remote.Version ?? "?"} ready to download"); + return; + } + + if (!string.Equals(local.Version, remote.Version, StringComparison.Ordinal)) + { + ApplyState(LauncherState.NeedsUpdate, "Update", + $"Update available: v{local.Version} → v{remote.Version}"); + return; + } + + // Version matches -- but also verify the actual files are on disk. Catches AV + // quarantines, manual deletions, and interrupted downloads. + var missing = _sync.FindMissingFiles(remote, GetInstallDir()); + if (missing.Count > 0) + { + ApplyState(LauncherState.NeedsUpdate, "Repair", + $"Pack files missing ({missing.Count}). Click to redownload."); + return; + } + + if (_session == null) + { + ApplyState(LauncherState.ReadyNotSignedIn, "Play", + $"Up to date (v{local.Version}). Sign in to play."); + } + else + { + ApplyState(LauncherState.Ready, "Play", + $"Up to date (v{local.Version}). Ready to launch."); + } + } + + private void ApplyState(LauncherState state, string buttonLabel, string subtext) + { + _state = state; + _playButtonLabel = buttonLabel; + _playButtonEnabled = state is LauncherState.NeedsDownload + or LauncherState.NeedsUpdate + or LauncherState.Ready; + if (!_busy) + { + PlayButton.Content = _playButtonLabel; + PlayButton.IsEnabled = _playButtonEnabled; + } + StatusText.Text = state switch + { + LauncherState.Ready or LauncherState.ReadyNotSignedIn => "Ready", + LauncherState.NeedsDownload => "Download required", + LauncherState.NeedsUpdate => "Update available", + LauncherState.Checking => "Checking...", + LauncherState.ConfigError => "Setup needed", + _ => "..." + }; + StatusSubtext.Text = subtext; + } + + private async void OnLoginClick(object? sender, RoutedEventArgs e) + { + if (_busy) return; + try + { + SetBusy(true); + UpdateStatus("Signing in...", "A browser window should appear."); + var session = await _auth.SignInInteractivelyAsync(); + ApplySession(session); + UpdateStatus("Signed in", $"Welcome, {session.Username}."); + } + catch (Exception ex) + { + LogException("auth error", ex); + UpdateStatus("Sign-in failed", ex.Message); + } + finally + { + SetBusy(false); + // ApplySession's fire-and-forget RefreshStateAsync was a no-op because + // _busy was still true. Re-run state now that we're idle so the Play + // button enables based on the new session + current pack state. + await RefreshStateAsync(); + } + } + + private void LogException(string label, Exception ex) + { + AppendLog($"[{label}] {ex.GetType().Name}: {ex.Message}"); + var inner = ex.InnerException; + var depth = 0; + while (inner != null && depth < 5) + { + AppendLog($" ↳ {inner.GetType().Name}: {inner.Message}"); + inner = inner.InnerException; + depth++; + } + // Reflectively surface any Code / XErr / Redirect / StatusCode properties (XboxAuthException, etc.) + foreach (var prop in ex.GetType().GetProperties()) + { + if (prop.Name is "Code" or "XErr" or "ErrorCode" or "StatusCode" or "Redirect" or "Identity" or "Message" or "Source" or "InnerException" or "TargetSite" or "StackTrace" or "Data" or "HelpLink" or "HResult") + { + if (prop.Name is "Message" or "Source" or "InnerException" or "TargetSite" or "StackTrace" or "Data" or "HelpLink" or "HResult") continue; + try + { + var val = prop.GetValue(ex); + if (val != null) AppendLog($" • {prop.Name}: {val}"); + } + catch { } + } + } + } + + private async void OnLogoutClick(object? sender, RoutedEventArgs e) + { + await _auth.SignOutAsync(); + ClearSession(); + UpdateStatus("Signed out", "Click Sign in to authenticate again."); + } + + private async void OnPlayClick(object? sender, RoutedEventArgs e) + { + if (_busy) return; + + switch (_state) + { + case LauncherState.NeedsDownload: + case LauncherState.NeedsUpdate: + await DoSyncAndInstallAsync(); + break; + case LauncherState.Ready: + await DoLaunchAsync(); + break; + // Other states leave the button disabled -- shouldn't reach here. + } + } + + private async Task DoSyncAndInstallAsync() + { + try + { + SetBusy(true); + var installDir = GetInstallDir(); + Directory.CreateDirectory(installDir); + var progress = new Progress(OnProgress); + + UpdateStatus("Syncing pack...", "Fetching manifest and downloading mods."); + var syncResult = await _sync.SyncAsync(_config.ManifestUrl, installDir, progress); + _remoteManifest = syncResult.Manifest; + AppendLog($"Sync: {syncResult.Downloaded} downloaded, {syncResult.Removed} removed."); + + PackVersionText.Text = syncResult.Manifest.Version is { } v + ? $"Installed: v{v}" + : "Installed"; + + // Pre-populate the multiplayer server list so friends don't have to + // hand-type the address. Idempotent -- match-by-IP, won't duplicate. + if (syncResult.Manifest.DefaultServer is { } ds && !string.IsNullOrEmpty(ds.Ip)) + { + try + { + new ServerListService().EnsureServer(installDir, ds.Name, ds.Ip); + AppendLog($"Multiplayer list seeded: {ds.Name} ({ds.Ip})."); + } + catch (Exception ex) + { + AppendLog($"[server-list] Couldn't update servers.dat: {ex.Message}"); + } + } + + // Pre-enable a default shader pack on fresh installs (Iris reads + // config/iris.properties at startup). Does nothing if the user has + // already chosen a different shader. + if (!string.IsNullOrEmpty(syncResult.Manifest.DefaultShader)) + { + try + { + new IrisConfigService().SetDefaultShader(installDir, syncResult.Manifest.DefaultShader); + AppendLog($"Default shader: {syncResult.Manifest.DefaultShader} (only set if no shader was previously chosen)."); + } + catch (Exception ex) + { + AppendLog($"[iris] Couldn't set default shader: {ex.Message}"); + } + } + + _launch ??= new LaunchService(installDir); + UpdateStatus("Installing Minecraft...", + "Downloading client, libraries, assets, and mod loader. First run may take a few minutes."); + var versionId = await _launch.InstallVersionAsync( + syncResult.Manifest, progress, CancellationToken.None); + AppendLog($"Version ready: {versionId}"); + ResetProgress(); + } + catch (Exception ex) + { + AppendLog($"[error] {ex.GetType().Name}: {ex.Message}"); + UpdateStatus("Install failed", ex.Message); + } + finally + { + SetBusy(false); + await RefreshStateAsync(); + } + } + + private async Task DoLaunchAsync() + { + if (_session == null || _remoteManifest == null) return; + + try + { + SetBusy(true); + var progress = new Progress(OnProgress); + var installDir = GetInstallDir(); + _launch ??= new LaunchService(installDir); + + // Pre-launch sanity: any manifest files missing? If so, re-sync. + var missing = _sync.FindMissingFiles(_remoteManifest, installDir); + if (missing.Count > 0) + { + UpdateStatus("Repairing pack...", + $"{missing.Count} file(s) missing -- redownloading before launch."); + AppendLog($"Pre-launch check: {missing.Count} files missing, re-syncing."); + var syncResult = await _sync.SyncAsync(_config.ManifestUrl, installDir, progress); + _remoteManifest = syncResult.Manifest; + AppendLog($"Re-sync: {syncResult.Downloaded} downloaded, {syncResult.Removed} removed."); + } + + UpdateStatus("Verifying installation...", + "Checking Minecraft, mod loader, and libraries."); + // InstallVersionAsync is idempotent + always runs the library verifier afterwards, + // so this catches any post-install gaps (e.g. CmlLib's bootstraplauncher quirk). + var versionId = await _launch.InstallVersionAsync( + _remoteManifest, progress, CancellationToken.None); + + var ram = (int)(RamBox.Value ?? _config.MemoryMB); + var minRam = ram; + var maxRam = ram; + + UpdateStatus("Launching Minecraft...", ""); + ResetProgress(); + + _ = Task.Run(async () => + { + try + { + await _launch.LaunchAsync(versionId, _session!, minRam, maxRam, progress, CancellationToken.None); + } + catch (Exception ex) + { + await Dispatcher.UIThread.InvokeAsync(() => + { + AppendLog($"[launch error] {ex.GetType().Name}: {ex.Message}"); + UpdateStatus("Launch failed", ex.Message); + }); + } + finally + { + await Dispatcher.UIThread.InvokeAsync(async () => + { + SetBusy(false); + await RefreshStateAsync(); + }); + } + }); + } + catch (Exception ex) + { + AppendLog($"[error] {ex.GetType().Name}: {ex.Message}"); + UpdateStatus("Launch failed", ex.Message); + SetBusy(false); + await RefreshStateAsync(); + } + } + + private string GetInstallDir() => _config.GetInstallDir(_settings.InstallDirOverride); + + private void UpdateInstallDirDisplay() + { + InstallDirText.Text = GetInstallDir(); + } + + private void UpdateRamWarning(int ramMb) + { + var totalMb = SystemInfo.TotalPhysicalMemoryMB; + var safeMax = SystemInfo.SafeMaxAllocationMB; + + if (totalMb < 12 * 1024) + { + RamWarningText.Text = $"Only {totalMb / 1024} GB system RAM detected -- pack may not run smoothly (12+ GB recommended)"; + RamWarningText.Foreground = new SolidColorBrush(Color.Parse("#E8B95C")); + } + else if (ramMb > safeMax) + { + RamWarningText.Text = $"Above safe limit for {totalMb / 1024} GB system (max {safeMax} MB recommended)"; + RamWarningText.Foreground = new SolidColorBrush(Color.Parse("#DC6E28")); + } + else if (ramMb < 6144) + { + RamWarningText.Text = "Below recommended (6 GB+ for Distant Horizons)"; + RamWarningText.Foreground = new SolidColorBrush(Color.Parse("#9F8E72")); + } + else + { + RamWarningText.Text = $"OK ({totalMb / 1024} GB system)"; + RamWarningText.Foreground = new SolidColorBrush(Color.Parse("#7A8497")); + } + } + + private void OnRamValueChanged(object? sender, NumericUpDownValueChangedEventArgs e) + { + if (_suppressAutoSave) return; + var ram = (int)(RamBox.Value ?? _config.MemoryMB); + _settings.MemoryMB = ram; + _settings.Save(); + UpdateRamWarning(ram); + } + + private async void OnChangeInstallDirClick(object? sender, RoutedEventArgs e) + { + var folders = await StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions + { + Title = "Choose install location", + AllowMultiple = false + }); + if (folders.Count == 0) return; + + var picked = folders[0].TryGetLocalPath(); + if (string.IsNullOrEmpty(picked)) return; + + _settings.InstallDirOverride = picked; + _settings.Save(); + UpdateInstallDirDisplay(); + AppendLog($"Install location changed to: {picked}"); + AppendLog("Pack will need to be re-downloaded at the new location on next Play."); + + _launch = null; // force re-create with new path next time + _remoteManifest = null; + await RefreshStateAsync(refetchManifest: true); + } + + private void OnOpenFolderClick(object? sender, RoutedEventArgs e) + { + var dir = GetInstallDir(); + Directory.CreateDirectory(dir); + try + { + Process.Start(new ProcessStartInfo + { + FileName = dir, + UseShellExecute = true + }); + } + catch (Exception ex) + { + AppendLog($"[open folder] {ex.Message}"); + } + } + + private void OnProgress(ProgressReport report) + { + if (Dispatcher.UIThread.CheckAccess()) + { + ApplyProgress(report); + } + else + { + Dispatcher.UIThread.Post(() => ApplyProgress(report)); + } + } + + private void ApplyProgress(ProgressReport report) + { + switch (report.Kind) + { + case ProgressKind.Status: + StatusSubtext.Text = report.Message; + break; + case ProgressKind.Progress: + if (report.Percent >= 0) ProgressBar.Value = Math.Clamp(report.Percent, 0, 100); + StatusSubtext.Text = report.Message; + break; + case ProgressKind.Log: + AppendLog(report.Message); + break; + case ProgressKind.Error: + AppendLog($"[error] {report.Message}"); + break; + } + } + + private void UpdateStatus(string title, string subtitle) + { + StatusText.Text = title; + StatusSubtext.Text = subtitle; + } + + private void ResetProgress() + { + ProgressBar.Value = 0; + } + + private void AppendLog(string message) + { + if (string.IsNullOrEmpty(message)) return; + LogText.Text += (LogText.Text?.Length > 0 ? "\n" : "") + message; + LogScroll.ScrollToEnd(); + FileLog.Write(message); + } + + private void SetBusy(bool busy) + { + _busy = busy; + if (busy) + { + PlayButton.IsEnabled = false; + PlayButton.Content = "Working..."; + } + else + { + // Restore from the cached state-derived label (avoids races with concurrent state refreshes). + PlayButton.Content = _playButtonLabel; + PlayButton.IsEnabled = _playButtonEnabled; + } + LoginButton.IsEnabled = !busy; + LogoutButton.IsEnabled = !busy; + } +} diff --git a/launcher/Models/LauncherConfig.cs b/launcher/Models/LauncherConfig.cs new file mode 100644 index 0000000..ffea97f --- /dev/null +++ b/launcher/Models/LauncherConfig.cs @@ -0,0 +1,106 @@ +using System; +using System.IO; +using System.Reflection; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace ModpackLauncher.Models; + +public sealed class LauncherConfig +{ + [JsonPropertyName("packName")] + public string PackName { get; set; } = "Modpack"; + + [JsonPropertyName("manifestUrl")] + public string ManifestUrl { get; set; } = ""; + + /// + /// Subfolder name appended under the install location (sidecar exe folder + /// by default, or the folder the user picked via "Change..."). Acts as + /// a safety net so picking a generic location like "D:\" doesn't dump + /// thousands of files at the drive root, and signals at a glance that + /// this is the launcher's data, not the launcher itself. + /// + [JsonPropertyName("installDirName")] + public string InstallDirName { get; set; } = "BrassAndSigilData"; + + [JsonPropertyName("memoryMB")] + public int MemoryMB { get; set; } = 8192; + + [JsonPropertyName("msalClientId")] + public string MsalClientId { get; set; } = ""; + + /// Optional HTTP Basic auth username for the manifest URL and mod file URLs. + [JsonPropertyName("httpUsername")] + public string? HttpUsername { get; set; } + + /// Optional HTTP Basic auth password (paired with HttpUsername). + [JsonPropertyName("httpPassword")] + public string? HttpPassword { get; set; } + + public static LauncherConfig Load() + { + // 1. External override beside the exe (dev convenience / per-deploy override) + var sidecar = Path.Combine(AppContext.BaseDirectory, "launcher-config.json"); + if (File.Exists(sidecar)) + { + return ParseSafe(File.ReadAllText(sidecar)); + } + + // 2. Embedded launcher-config.json (set at build time from local copy) + var asm = typeof(LauncherConfig).Assembly; + using (var stream = asm.GetManifestResourceStream("launcher-config.json")) + { + if (stream != null) + { + using var reader = new StreamReader(stream); + return ParseSafe(reader.ReadToEnd()); + } + } + + // 3. Fall back to embedded template (so fresh clones still run, with placeholders) + using (var stream = asm.GetManifestResourceStream("launcher-config.template.json")) + { + if (stream != null) + { + using var reader = new StreamReader(stream); + return ParseSafe(reader.ReadToEnd()); + } + } + + return new LauncherConfig(); + } + + private static LauncherConfig ParseSafe(string json) + { + var opts = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + return JsonSerializer.Deserialize(json, opts) ?? new LauncherConfig(); + } + + /// + /// Resolve the absolute install directory. The launcher behaves as a + /// portable app: by default it installs alongside the exe in + /// <exe-folder>/<InstallDirName>/. The user can override + /// via the "Change..." picker, which stores the chosen *parent* folder + /// in InstallDirOverride; we then append + /// to it (same safety reasoning as the default). + /// + /// Smart-skip: if the parent path already ends in InstallDirName, we + /// don't double up. Lets users re-pick their existing install folder + /// (e.g. "D:\Games\BrassAndSigilData") without ending up at + /// "D:\Games\BrassAndSigilData\BrassAndSigilData". + /// + public string GetInstallDir(string? overrideDir = null) + { + var parent = !string.IsNullOrWhiteSpace(overrideDir) + ? overrideDir! + : AppContext.BaseDirectory; + + var trimmed = parent.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); + if (string.Equals(Path.GetFileName(trimmed), InstallDirName, StringComparison.OrdinalIgnoreCase)) + { + return trimmed; + } + return Path.Combine(parent, InstallDirName); + } +} diff --git a/launcher/Models/LauncherSettings.cs b/launcher/Models/LauncherSettings.cs new file mode 100644 index 0000000..17420b7 --- /dev/null +++ b/launcher/Models/LauncherSettings.cs @@ -0,0 +1,54 @@ +using System; +using System.IO; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace ModpackLauncher.Models; + +public sealed class LauncherSettings +{ + [JsonPropertyName("memoryMB")] + public int? MemoryMB { get; set; } + + [JsonPropertyName("installDirOverride")] + public string? InstallDirOverride { get; set; } + + /// + /// Settings live next to the launcher exe ("sidecar"), so each copy of + /// the launcher has its own independent state. Drop the launcher in a + /// new folder on a different machine, or alongside the existing one in + /// a separate directory, and they remember their own install paths, + /// memory choices, etc. Matches the portable-app convention. + /// + private static string FilePath + => Path.Combine(AppContext.BaseDirectory, "launcher-settings.json"); + + public static LauncherSettings Load() + { + try + { + if (!File.Exists(FilePath)) return new LauncherSettings(); + return JsonSerializer.Deserialize(File.ReadAllText(FilePath)) + ?? new LauncherSettings(); + } + catch + { + return new LauncherSettings(); + } + } + + public void Save() + { + try + { + File.WriteAllText( + FilePath, + JsonSerializer.Serialize(this, new JsonSerializerOptions { WriteIndented = true }) + ); + } + catch + { + // best-effort + } + } +} diff --git a/launcher/Models/Manifest.cs b/launcher/Models/Manifest.cs new file mode 100644 index 0000000..d1cc985 --- /dev/null +++ b/launcher/Models/Manifest.cs @@ -0,0 +1,110 @@ +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace ModpackLauncher.Models; + +public sealed class Manifest +{ + [JsonPropertyName("name")] + public string? Name { get; set; } + + [JsonPropertyName("version")] + public string? Version { get; set; } + + [JsonPropertyName("minecraft")] + public MinecraftSpec Minecraft { get; set; } = new(); + + [JsonPropertyName("loader")] + public LoaderSpec? Loader { get; set; } + + [JsonPropertyName("files")] + public List Files { get; set; } = new(); + + /// + /// Optional. The launcher version that the modpack publisher expects clients + /// to be running. If a client's assembly version is lower than this, the launcher + /// surfaces a "newer version available" banner pointing at . + /// + [JsonPropertyName("launcherVersion")] + public string? LauncherVersion { get; set; } + + /// Public download URL for the latest launcher (shown in the banner). + [JsonPropertyName("launcherUrl")] + public string? LauncherUrl { get; set; } + + /// + /// Optional. If present, the launcher writes this entry into the player's + /// servers.dat on first install so the modpack's server appears in + /// the multiplayer list automatically -- no copy-paste needed. + /// + [JsonPropertyName("defaultServer")] + public DefaultServer? DefaultServer { get; set; } + + /// + /// Optional. Filename (in shaderpacks/) of a shader pack to enable by default + /// for fresh installs. Existing installs with a different shader chosen are + /// left alone -- this is a default, not a forced override. + /// + [JsonPropertyName("defaultShader")] + public string? DefaultShader { get; set; } + + /// + /// Optional. Public base URL of the brass-sigil-server admin panel (e.g. + /// https://bns-admin.sijbers.uk). The launcher uses this to send whitelist + /// requests on the player's behalf -- nothing else. + /// + [JsonPropertyName("panelUrl")] + public string? PanelUrl { get; set; } +} + +public sealed class DefaultServer +{ + [JsonPropertyName("name")] + public string Name { get; set; } = ""; + + [JsonPropertyName("ip")] + public string Ip { get; set; } = ""; +} + +public sealed class MinecraftSpec +{ + [JsonPropertyName("version")] + public string Version { get; set; } = ""; +} + +public sealed class LoaderSpec +{ + /// "forge" | "fabric" | "neoforge" | "vanilla" (or null) + [JsonPropertyName("type")] + public string Type { get; set; } = "vanilla"; + + [JsonPropertyName("version")] + public string Version { get; set; } = ""; +} + +public sealed class ManifestFile +{ + [JsonPropertyName("path")] + public string Path { get; set; } = ""; + + [JsonPropertyName("url")] + public string Url { get; set; } = ""; + + [JsonPropertyName("sha1")] + public string? Sha1 { get; set; } + + [JsonPropertyName("size")] + public long? Size { get; set; } +} + +public sealed class PackVersionRecord +{ + [JsonPropertyName("name")] + public string? Name { get; set; } + + [JsonPropertyName("version")] + public string? Version { get; set; } + + [JsonPropertyName("syncedAt")] + public string? SyncedAt { get; set; } +} diff --git a/launcher/ModpackLauncher.csproj b/launcher/ModpackLauncher.csproj new file mode 100644 index 0000000..250f67d --- /dev/null +++ b/launcher/ModpackLauncher.csproj @@ -0,0 +1,65 @@ + + + WinExe + + net8.0-windows + true + enable + app.manifest + true + ModpackLauncher + ModpackLauncher + 0.4.5 + Assets\icon.ico + + + win-x64 + win-x64 + true + true + true + true + embedded + false + false + + + + + + + + + None + All + + + + + + + + + + + + launcher-config.json + + + launcher-config.template.json + + + + + + + + + + + <_StripPdb Include="$(PublishDir)*.pdb" Exclude="$(PublishDir)$(AssemblyName).pdb" /> + + + + diff --git a/launcher/Program.cs b/launcher/Program.cs new file mode 100644 index 0000000..cc0346e --- /dev/null +++ b/launcher/Program.cs @@ -0,0 +1,24 @@ +using Avalonia; +using System; + +namespace ModpackLauncher; + +class Program +{ + // Initialization code. Don't use any Avalonia, third-party APIs or any + // SynchronizationContext-reliant code before AppMain is called: things aren't initialized + // yet and stuff might break. + [STAThread] + public static void Main(string[] args) => BuildAvaloniaApp() + .StartWithClassicDesktopLifetime(args); + + // Avalonia configuration, don't remove; also used by visual designer. + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure() + .UsePlatformDetect() +#if DEBUG + .WithDeveloperTools() +#endif + .WithInterFont() + .LogToTrace(); +} diff --git a/launcher/README.md b/launcher/README.md new file mode 100644 index 0000000..ddd7163 --- /dev/null +++ b/launcher/README.md @@ -0,0 +1,112 @@ +# Brass & Sigil Launcher + +A custom Minecraft Java Edition launcher built for distributing the private +"Brass & Sigil" modpack (Create + aeronautics + tech + magic + Distant +Horizons) to a small friend group. + +> **NOT AN OFFICIAL MINECRAFT PRODUCT. NOT APPROVED BY OR ASSOCIATED WITH +> MOJANG OR MICROSOFT.** + +## What it does + +1. Fetches a JSON manifest from a self-hosted server and syncs the modpack + files (mods, configs, resourcepacks) to the player's local install + directory. SHA-1 hashing ensures only changed files are downloaded. +2. Authenticates each player with their own personal Microsoft account via + the standard MSAL OAuth + Xbox Live + Minecraft Services chain, using the + open-source `CmlLib.Core.Auth.Microsoft` library without modification. +3. Installs the appropriate Minecraft Java Edition version and Forge mod + loader, then launches the game with the player's authenticated session. + +## Stack + +- **C# / .NET 8** +- **Avalonia 12** -- desktop UI +- **CmlLib.Core 4.x** -- Minecraft install + launch +- **CmlLib.Core.Auth.Microsoft 3.x + XboxAuthNet.Game.Msal** -- Microsoft auth +- **CmlLib.Core.Installer.Forge** -- Forge support + +## Build + +Requires the .NET 8 SDK. + +```powershell +dotnet build +``` + +To produce the shippable single-file executable (~46 MB): + +```powershell +dotnet publish -c Release -r win-x64 --self-contained true +``` + +Output: `bin/Release/net8.0/win-x64/publish/ModpackLauncher.exe` -- a single +file with no other dependencies, ready to send to a friend. + +## Configuration + +The repo ships with a `launcher-config.template.json`. Copy it to +`launcher-config.json` and fill in real values before building: + +```powershell +Copy-Item launcher-config.template.json launcher-config.json +``` + +`launcher-config.json` is gitignored so local values (manifest URL, Azure +client ID) never get committed. + +### Fields + +| Field | Purpose | +| --- | --- | +| `packName` | Display name shown in the launcher | +| `manifestUrl` | URL of the hosted manifest JSON | +| `installDirName` | Folder name under `%APPDATA%` for game files | +| `memoryMinMB` / `memoryMaxMB` | JVM memory defaults | +| `msalClientId` | Azure App Registration client ID for Microsoft auth | + +The config is **embedded into the exe** at build time, so the launcher ships +as a single self-contained file. A sidecar `launcher-config.json` placed +beside the exe will override the embedded copy at runtime (handy for testing). + +## Manifest format + +See `manifest.example.json` for the schema. Minimum: + +```json +{ + "name": "Brass & Sigil", + "version": "1.0.0", + "minecraft": { "version": "1.20.1" }, + "loader": { "type": "forge", "version": "47.2.0" }, + "files": [ + { "path": "mods/example.jar", "url": "https://...", "sha1": "..." } + ] +} +``` + +The launcher diffs the manifest against the local install dir using SHA-1 +hashes and downloads only what has changed. Files removed from the manifest +are pruned from managed folders (`mods/`, `config/`, `resourcepacks/`, +`shaderpacks/`, `kubejs/`, `defaultconfigs/`). + +## Privacy + +The launcher does not collect, store, or transmit any user data beyond what +the standard Microsoft and Minecraft authentication APIs require. Auth tokens +are cached locally via the MSAL token cache. No telemetry, no analytics, no +third-party services beyond Microsoft and Mojang. + +Local data is written to: + +- `%APPDATA%\BrassAndSigil\` -- launcher settings + log file +- `%APPDATA%\\` -- modpack and Minecraft installation + +## License + +MIT -- see [LICENSE](LICENSE). + +## Author + +Matt Sijbers -- [https://sijbers.uk/matt](https://sijbers.uk/matt) / +[project page](https://sijbers.uk/brass-and-sigil) diff --git a/launcher/Services/AuthService.cs b/launcher/Services/AuthService.cs new file mode 100644 index 0000000..f2f0ba0 --- /dev/null +++ b/launcher/Services/AuthService.cs @@ -0,0 +1,95 @@ +using System; +using System.Threading.Tasks; +using CmlLib.Core.Auth; +using CmlLib.Core.Auth.Microsoft; +using XboxAuthNet.Game.Msal; +using XboxAuthNet.Game.Msal.OAuth; + +namespace ModpackLauncher.Services; + +/// +/// Microsoft auth wrapper. Two modes: +/// 1. Custom Azure AD client ID (msalClientId set) -> MSAL flow. Requires Microsoft +/// to have approved the app for Minecraft API access. +/// 2. No custom client ID (default) -> CmlLib's BuildDefault() which uses the +/// WebView2-driven Microsoft Live OAuth flow with the Xbox Live SDK client ID. +/// Doesn't require an Azure registration; works out of the box on any Win10/11 +/// machine that has the WebView2 Runtime installed (preinstalled since 2021). +/// +public sealed class AuthService +{ + private readonly string _clientId; + + public AuthService(string clientId) + { + _clientId = clientId; + } + + /// True when the user has provided their own Azure App Registration ID. + public bool HasCustomClientId => !string.IsNullOrWhiteSpace(_clientId) + && _clientId != "00000000-0000-0000-0000-000000000000"; + + /// Auth is always available now (BuildDefault provides a fallback). + public bool IsConfigured => true; + + public async Task AuthenticateAsync() + { + var loginHandler = await BuildLoginHandlerAsync(); + try + { + return await loginHandler.AuthenticateSilently(); + } + catch + { + return await loginHandler.AuthenticateInteractively(); + } + } + + public async Task SignInInteractivelyAsync() + { + var loginHandler = await BuildLoginHandlerAsync(); + return await loginHandler.AuthenticateInteractively(); + } + + public async Task TryAuthenticateSilentlyAsync() + { + try + { + var loginHandler = await BuildLoginHandlerAsync(); + return await loginHandler.AuthenticateSilently(); + } + catch + { + return null; + } + } + + public async Task SignOutAsync() + { + try + { + var loginHandler = await BuildLoginHandlerAsync(); + await loginHandler.Signout(); + } + catch + { + // best-effort + } + } + + private async Task BuildLoginHandlerAsync() + { + if (HasCustomClientId) + { + // Custom Azure AD MSAL flow -- requires the app to be approved by Microsoft. + var app = await MsalClientHelper.BuildApplicationWithCache(_clientId); + return new JELoginHandlerBuilder() + .WithOAuthProvider(new MsalCodeFlowProvider(app)) + .Build(); + } + + // Default path: WebView2 + Xbox Live SDK community client ID. No Azure registration. + // Note: requires WebView2 Runtime on Windows (preinstalled on Win10/11 since 2021). + return JELoginHandlerBuilder.BuildDefault(); + } +} diff --git a/launcher/Services/FileLog.cs b/launcher/Services/FileLog.cs new file mode 100644 index 0000000..f7aa813 --- /dev/null +++ b/launcher/Services/FileLog.cs @@ -0,0 +1,45 @@ +using System; +using System.IO; + +namespace ModpackLauncher.Services; + +public static class FileLog +{ + private static readonly object _lock = new(); + + public static string LogPath { get; } = BuildPath(); + + private static string BuildPath() + { + var dir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "BrassAndSigil" + ); + Directory.CreateDirectory(dir); + return Path.Combine(dir, "launcher.log"); + } + + public static void Init() + { + try + { + // Truncate per launch so we always have the most recent run. + File.WriteAllText(LogPath, + $"=== ModpackLauncher launched {DateTime.Now:yyyy-MM-dd HH:mm:ss} ==={Environment.NewLine}"); + } + catch { } + } + + public static void Write(string message) + { + try + { + lock (_lock) + { + File.AppendAllText(LogPath, + $"[{DateTime.Now:HH:mm:ss}] {message}{Environment.NewLine}"); + } + } + catch { } + } +} diff --git a/launcher/Services/IrisConfigService.cs b/launcher/Services/IrisConfigService.cs new file mode 100644 index 0000000..e75aca4 --- /dev/null +++ b/launcher/Services/IrisConfigService.cs @@ -0,0 +1,65 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace ModpackLauncher.Services; + +/// +/// Pre-seeds Iris's config/iris.properties with a default shader pack +/// for fresh installs, so friends launch the game and the recommended shader +/// is already on rather than them having to dig through Video Settings. +/// +/// Respects user choice: if the file already exists with a non-empty +/// shaderPack=... entry, we leave it alone -- only fresh installs (or +/// installs where Iris has never been opened) get the default. +/// +public sealed class IrisConfigService +{ + public void SetDefaultShader(string gameDir, string shaderPackFilename) + { + if (string.IsNullOrWhiteSpace(shaderPackFilename)) return; + var configDir = Path.Combine(gameDir, "config"); + Directory.CreateDirectory(configDir); + var path = Path.Combine(configDir, "iris.properties"); + + var lines = File.Exists(path) ? File.ReadAllLines(path).ToList() : new List(); + + // If a shaderPack is already chosen and non-empty (the user picked + // something), respect it and bail. + var existingShader = lines + .Select(l => l.TrimStart()) + .Where(l => l.Length > 0 && l[0] != '#') + .Select(l => { var i = l.IndexOf('='); return i < 0 ? null : new { Key = l.Substring(0, i).Trim(), Value = l.Substring(i + 1).Trim() }; }) + .Where(p => p != null && p.Key.Equals("shaderPack", System.StringComparison.OrdinalIgnoreCase)) + .Select(p => p!.Value) + .FirstOrDefault(); + if (!string.IsNullOrEmpty(existingShader)) return; + + // No shader set -- write our defaults. Update existing keys in-place if + // they exist (e.g. shaderPack="" placeholder), append otherwise. + var defaults = new Dictionary(System.StringComparer.OrdinalIgnoreCase) + { + { "shaderPack", shaderPackFilename }, + { "enableShaders", "true" }, + }; + var seen = new HashSet(System.StringComparer.OrdinalIgnoreCase); + for (int i = 0; i < lines.Count; i++) + { + var trimmed = lines[i].TrimStart(); + if (trimmed.Length == 0 || trimmed[0] == '#') continue; + var idx = trimmed.IndexOf('='); + if (idx < 0) continue; + var key = trimmed.Substring(0, idx).Trim(); + if (defaults.TryGetValue(key, out var val)) + { + lines[i] = $"{key}={val}"; + seen.Add(key); + } + } + foreach (var (k, v) in defaults) + { + if (!seen.Contains(k)) lines.Add($"{k}={v}"); + } + File.WriteAllLines(path, lines); + } +} diff --git a/launcher/Services/LaunchService.cs b/launcher/Services/LaunchService.cs new file mode 100644 index 0000000..48d2fed --- /dev/null +++ b/launcher/Services/LaunchService.cs @@ -0,0 +1,227 @@ +using System; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using CmlLib.Core; +using CmlLib.Core.Auth; +using CmlLib.Core.Installers; +using CmlLib.Core.ProcessBuilder; +using CmlLib.Core.Installer.Forge; +using CmlLib.Core.Installer.NeoForge; +using ModpackLauncher.Models; + +namespace ModpackLauncher.Services; + +public sealed class LaunchService +{ + private readonly MinecraftLauncher _launcher; + private readonly ForgeInstaller _forgeInstaller; + private readonly NeoForgeInstaller _neoForgeInstaller; + + private readonly string _installDir; + + public LaunchService(string installDir) + { + _installDir = installDir; + var path = new MinecraftPath(installDir); + _launcher = new MinecraftLauncher(path); + _forgeInstaller = new ForgeInstaller(_launcher); + _neoForgeInstaller = new NeoForgeInstaller(_launcher); + } + + public MinecraftLauncher Launcher => _launcher; + + /// + /// Belt-and-braces check after the loader installer runs: parse the version JSON + /// and download any libraries that are listed but missing on disk. Works around + /// a known CmlLib quirk where libraries with @jar suffix in the Maven coordinate + /// (e.g. "cpw.mods:bootstraplauncher:2.0.2@jar" used by NeoForge 21.1.x) get + /// skipped by the installer's library downloader. + /// + private async Task VerifyVersionLibrariesAsync(string versionId, + IProgress progress, + CancellationToken ct) + { + var versionJsonPath = Path.Combine(_installDir, "versions", versionId, $"{versionId}.json"); + if (!File.Exists(versionJsonPath)) return; + + using var doc = JsonDocument.Parse(await File.ReadAllTextAsync(versionJsonPath, ct).ConfigureAwait(false)); + if (!doc.RootElement.TryGetProperty("libraries", out var libsArr)) return; + + var libsDir = Path.Combine(_installDir, "libraries"); + var missing = new System.Collections.Generic.List<(string Path, string Url, string? Sha1)>(); + + foreach (var lib in libsArr.EnumerateArray()) + { + if (!lib.TryGetProperty("downloads", out var dls)) continue; + if (!dls.TryGetProperty("artifact", out var art)) continue; + if (!art.TryGetProperty("path", out var pPath) || !art.TryGetProperty("url", out var pUrl)) continue; + + var relPath = pPath.GetString(); + var url = pUrl.GetString(); + var sha1 = art.TryGetProperty("sha1", out var pSha1) ? pSha1.GetString() : null; + if (string.IsNullOrEmpty(relPath) || string.IsNullOrEmpty(url)) continue; + + var fullPath = Path.Combine(libsDir, relPath.Replace('/', Path.DirectorySeparatorChar)); + if (!File.Exists(fullPath)) + { + missing.Add((fullPath, url, sha1)); + } + } + + if (missing.Count == 0) return; + + progress.Report(new ProgressReport( + ProgressKind.Status, + $"Verifying loader libraries: {missing.Count} missing, fetching...")); + + using var http = new HttpClient(); + http.Timeout = TimeSpan.FromMinutes(5); + for (int i = 0; i < missing.Count; i++) + { + ct.ThrowIfCancellationRequested(); + var (path, url, _) = missing[i]; + progress.Report(new ProgressReport( + ProgressKind.Log, + $" Library {i + 1}/{missing.Count}: {Path.GetFileName(path)}")); + Directory.CreateDirectory(Path.GetDirectoryName(path)!); + var bytes = await http.GetByteArrayAsync(url, ct).ConfigureAwait(false); + await File.WriteAllBytesAsync(path, bytes, ct).ConfigureAwait(false); + } + + progress.Report(new ProgressReport( + ProgressKind.Status, + "Loader libraries verified.")); + } + + public async Task InstallVersionAsync( + Manifest manifest, + IProgress progress, + CancellationToken ct) + { + EventHandler fileProgressHandler = (_, args) => + { + var pct = args.TotalTasks > 0 + ? (args.ProgressedTasks * 100.0 / args.TotalTasks) + : -1; + progress.Report(new ProgressReport( + ProgressKind.Progress, + $"{args.EventType}: {args.Name ?? ""}", + Current: args.ProgressedTasks, + Total: args.TotalTasks, + Percent: pct + )); + }; + + EventHandler byteProgressHandler = (_, args) => + { + if (args.TotalBytes <= 0) return; + var pct = args.ToRatio() * 100.0; + progress.Report(new ProgressReport( + ProgressKind.Progress, + $"{args.ProgressedBytes:N0} / {args.TotalBytes:N0} bytes", + Current: (int)Math.Min(args.ProgressedBytes, int.MaxValue), + Total: (int)Math.Min(args.TotalBytes, int.MaxValue), + Percent: pct + )); + }; + + _launcher.FileProgressChanged += fileProgressHandler; + _launcher.ByteProgressChanged += byteProgressHandler; + + try + { + var mcVersion = manifest.Minecraft.Version; + var loader = manifest.Loader; + + progress.Report(new ProgressReport(ProgressKind.Status, $"Installing Minecraft {mcVersion}...")); + await _launcher.InstallAsync(mcVersion, ct).AsTask().ConfigureAwait(false); + + if (loader == null || string.IsNullOrEmpty(loader.Type) || + loader.Type.Equals("vanilla", StringComparison.OrdinalIgnoreCase)) + { + return mcVersion; + } + + if (loader.Type.Equals("forge", StringComparison.OrdinalIgnoreCase)) + { + progress.Report(new ProgressReport( + ProgressKind.Status, + $"Installing Forge {loader.Version} for {mcVersion}..." + )); + var fid = await _forgeInstaller.Install(mcVersion, loader.Version).ConfigureAwait(false); + await VerifyVersionLibrariesAsync(fid, progress, ct).ConfigureAwait(false); + return fid; + } + + if (loader.Type.Equals("neoforge", StringComparison.OrdinalIgnoreCase)) + { + progress.Report(new ProgressReport( + ProgressKind.Status, + $"Installing NeoForge {loader.Version} for {mcVersion}..." + )); + var nid = await _neoForgeInstaller.Install(mcVersion, loader.Version).ConfigureAwait(false); + await VerifyVersionLibrariesAsync(nid, progress, ct).ConfigureAwait(false); + return nid; + } + + throw new NotSupportedException( + $"Loader '{loader.Type}' is not yet supported. Use 'forge', 'neoforge', or 'vanilla'." + ); + } + finally + { + _launcher.FileProgressChanged -= fileProgressHandler; + _launcher.ByteProgressChanged -= byteProgressHandler; + } + } + + public async Task LaunchAsync( + string versionId, + MSession session, + int minMemoryMB, + int maxMemoryMB, + IProgress progress, + CancellationToken ct) + { + var option = new MLaunchOption + { + Session = session, + MaximumRamMb = maxMemoryMB, + MinimumRamMb = minMemoryMB, + // Generational ZGC: low-pause concurrent collector -- recommended by + // Distant Horizons (and broadly better than the default G1 for modded MC). + // Requires Java 21+ which CmlLib auto-installs for MC 1.21.1. + ExtraJvmArguments = new[] + { + new MArgument("-XX:+UseZGC"), + new MArgument("-XX:+ZGenerational"), + } + }; + + progress.Report(new ProgressReport(ProgressKind.Status, "Building launch process...")); + var process = await _launcher.BuildProcessAsync(versionId, option).ConfigureAwait(false); + + var wrapper = new ProcessWrapper(process); + wrapper.OutputReceived += (_, log) => + { + progress.Report(new ProgressReport(ProgressKind.Log, log)); + }; + + wrapper.StartWithEvents(); + progress.Report(new ProgressReport( + ProgressKind.Status, + $"Minecraft launched (PID {process.Id})" + )); + + var exitCode = await wrapper.WaitForExitTaskAsync().ConfigureAwait(false); + progress.Report(new ProgressReport( + ProgressKind.Status, + $"Game exited (code {exitCode})" + )); + return exitCode; + } +} diff --git a/launcher/Services/ManifestSyncService.cs b/launcher/Services/ManifestSyncService.cs new file mode 100644 index 0000000..dd5c5b0 --- /dev/null +++ b/launcher/Services/ManifestSyncService.cs @@ -0,0 +1,252 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Security.Cryptography; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using ModpackLauncher.Models; + +namespace ModpackLauncher.Services; + +public sealed class ManifestSyncService +{ + private const string PackVersionFile = "pack-version.json"; + + private static readonly string[] ManagedRoots = + { + "mods", "config", "resourcepacks", "shaderpacks", "kubejs", "defaultconfigs" + }; + + private readonly HttpClient _http; + + public ManifestSyncService(HttpClient? http = null) + { + _http = http ?? new HttpClient(); + _http.Timeout = TimeSpan.FromMinutes(5); + } + + /// Configure HTTP Basic auth for all subsequent requests. Pass null to clear. + public void SetBasicAuth(string? username, string? password) + { + if (string.IsNullOrEmpty(username)) + { + _http.DefaultRequestHeaders.Authorization = null; + return; + } + var raw = $"{username}:{password ?? ""}"; + var b64 = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(raw)); + _http.DefaultRequestHeaders.Authorization = + new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", b64); + } + + public sealed record SyncResult(Manifest Manifest, int Downloaded, int Removed); + + /// Just fetch the manifest JSON without doing the full file sync. Used for "is an update available?" checks on startup. + public async Task FetchManifestOnlyAsync(string manifestUrl, CancellationToken ct = default) + { + var json = await _http.GetStringAsync(manifestUrl, ct).ConfigureAwait(false); + var manifest = JsonSerializer.Deserialize(json, new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }); + if (manifest == null) throw new InvalidOperationException("Manifest is empty or invalid."); + manifest.Files ??= new System.Collections.Generic.List(); + return manifest; + } + + /// + /// Fast check (no hashing): which files listed in the manifest are missing on disk. + /// Used as a pre-launch sanity pass to catch AV quarantines / interrupted installs. + /// + public System.Collections.Generic.List FindMissingFiles(Manifest manifest, string installDir) + { + var missing = new System.Collections.Generic.List(); + foreach (var file in manifest.Files) + { + var dest = Path.Combine(installDir, file.Path); + if (!File.Exists(dest)) missing.Add(file); + } + return missing; + } + + public PackVersionRecord? GetLocalPackVersion(string installDir) + { + var path = Path.Combine(installDir, PackVersionFile); + if (!File.Exists(path)) return null; + try + { + return JsonSerializer.Deserialize(File.ReadAllText(path)); + } + catch + { + return null; + } + } + + public async Task SyncAsync( + string manifestUrl, + string installDir, + IProgress progress, + CancellationToken ct = default) + { + progress.Report(new ProgressReport(ProgressKind.Status, "Fetching manifest...")); + + var manifestJson = await _http.GetStringAsync(manifestUrl, ct).ConfigureAwait(false); + var manifest = JsonSerializer.Deserialize(manifestJson, new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }) ?? throw new InvalidOperationException("Manifest is empty or invalid."); + + if (string.IsNullOrWhiteSpace(manifest.Minecraft.Version)) + { + throw new InvalidOperationException("Manifest is missing minecraft.version."); + } + + Directory.CreateDirectory(installDir); + + var local = GetLocalPackVersion(installDir); + progress.Report(new ProgressReport( + ProgressKind.Status, + $"Pack: {manifest.Name ?? "modpack"} v{manifest.Version ?? "?"} (local: {local?.Version ?? "none"})" + )); + + var wantedPaths = new HashSet( + manifest.Files.Select(f => NormalizePath(f.Path)), + StringComparer.OrdinalIgnoreCase + ); + + // Remove managed files no longer in manifest + var toRemove = new List(); + foreach (var root in ManagedRoots) + { + var rootDir = Path.Combine(installDir, root); + if (!Directory.Exists(rootDir)) continue; + foreach (var file in Directory.EnumerateFiles(rootDir, "*", SearchOption.AllDirectories)) + { + var rel = NormalizePath(Path.GetRelativePath(installDir, file)); + if (!wantedPaths.Contains(rel)) + { + toRemove.Add(file); + } + } + } + + foreach (var file in toRemove) + { + try + { + File.Delete(file); + progress.Report(new ProgressReport( + ProgressKind.Log, + $"Removed: {Path.GetRelativePath(installDir, file)}" + )); + } + catch (Exception ex) + { + progress.Report(new ProgressReport( + ProgressKind.Log, + $"Could not remove {file}: {ex.Message}" + )); + } + } + + // Determine what to download + var toDownload = new List(); + foreach (var file in manifest.Files) + { + ct.ThrowIfCancellationRequested(); + var dest = Path.Combine(installDir, file.Path); + if (!File.Exists(dest)) + { + toDownload.Add(file); + continue; + } + if (!string.IsNullOrEmpty(file.Sha1)) + { + var actual = await ComputeSha1Async(dest, ct).ConfigureAwait(false); + if (!string.Equals(actual, file.Sha1, StringComparison.OrdinalIgnoreCase)) + { + toDownload.Add(file); + } + } + } + + progress.Report(new ProgressReport( + ProgressKind.Status, + toDownload.Count == 0 ? "Already up-to-date." : $"Downloading {toDownload.Count} file(s)..." + )); + + for (int i = 0; i < toDownload.Count; i++) + { + ct.ThrowIfCancellationRequested(); + var file = toDownload[i]; + var pct = toDownload.Count == 0 ? 100 : (i * 100.0 / toDownload.Count); + progress.Report(new ProgressReport( + ProgressKind.Progress, + $"Downloading {file.Path}", + Current: i + 1, + Total: toDownload.Count, + Percent: pct + )); + var dest = Path.Combine(installDir, file.Path); + await DownloadFileAsync(file.Url, dest, file.Sha1, ct).ConfigureAwait(false); + } + + var record = new PackVersionRecord + { + Name = manifest.Name, + Version = manifest.Version, + SyncedAt = DateTime.UtcNow.ToString("o") + }; + await File.WriteAllTextAsync( + Path.Combine(installDir, PackVersionFile), + JsonSerializer.Serialize(record, new JsonSerializerOptions { WriteIndented = true }), + ct + ).ConfigureAwait(false); + + progress.Report(new ProgressReport(ProgressKind.Status, "Sync complete.")); + return new SyncResult(manifest, toDownload.Count, toRemove.Count); + } + + private async Task DownloadFileAsync(string url, string destPath, string? expectedSha1, CancellationToken ct) + { + Directory.CreateDirectory(Path.GetDirectoryName(destPath)!); + var tmp = destPath + ".part"; + + using (var response = await _http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, ct).ConfigureAwait(false)) + { + response.EnsureSuccessStatusCode(); + await using var src = await response.Content.ReadAsStreamAsync(ct).ConfigureAwait(false); + await using var dst = File.Create(tmp); + await src.CopyToAsync(dst, ct).ConfigureAwait(false); + } + + if (!string.IsNullOrEmpty(expectedSha1)) + { + var actual = await ComputeSha1Async(tmp, ct).ConfigureAwait(false); + if (!string.Equals(actual, expectedSha1, StringComparison.OrdinalIgnoreCase)) + { + File.Delete(tmp); + throw new InvalidOperationException( + $"Hash mismatch for {Path.GetFileName(destPath)} (expected {expectedSha1}, got {actual})" + ); + } + } + + if (File.Exists(destPath)) File.Delete(destPath); + File.Move(tmp, destPath); + } + + private static async Task ComputeSha1Async(string path, CancellationToken ct) + { + using var sha = SHA1.Create(); + await using var stream = File.OpenRead(path); + var bytes = await sha.ComputeHashAsync(stream, ct).ConfigureAwait(false); + return Convert.ToHexString(bytes).ToLowerInvariant(); + } + + private static string NormalizePath(string p) => p.Replace('\\', '/').TrimStart('/'); +} diff --git a/launcher/Services/ProgressReport.cs b/launcher/Services/ProgressReport.cs new file mode 100644 index 0000000..b8e8893 --- /dev/null +++ b/launcher/Services/ProgressReport.cs @@ -0,0 +1,17 @@ +namespace ModpackLauncher.Services; + +public enum ProgressKind +{ + Status, + Progress, + Log, + Error +} + +public sealed record ProgressReport( + ProgressKind Kind, + string Message, + int Current = 0, + int Total = 0, + double Percent = -1 +); diff --git a/launcher/Services/ServerListService.cs b/launcher/Services/ServerListService.cs new file mode 100644 index 0000000..ede465c --- /dev/null +++ b/launcher/Services/ServerListService.cs @@ -0,0 +1,101 @@ +using System; +using System.IO; +using System.Linq; +using fNbt; + +namespace ModpackLauncher.Services; + +/// +/// Pre-populates Minecraft's multiplayer server list (`servers.dat`) so the +/// modpack's server is one click away on first launch. +/// +/// servers.dat is uncompressed NBT (unlike level.dat which is gzipped). Schema: +/// compound { +/// servers : list[compound] { +/// name : string +/// ip : string +/// acceptTextures : byte (optional, 1 = enabled) +/// hidden : byte (optional, 0 = visible) +/// icon : string (optional, base64 PNG) +/// } +/// } +/// +public sealed class ServerListService +{ + /// + /// Add or update an entry. Match-by-IP: if an entry with the same IP exists, + /// update its name; otherwise prepend a new entry so the friend's first + /// glance at multiplayer shows our server at the top. + /// + public void EnsureServer(string gameDir, string name, string ip) + { + if (string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(ip)) return; + Directory.CreateDirectory(gameDir); + var path = Path.Combine(gameDir, "servers.dat"); + + NbtCompound root; + NbtList servers; + + if (File.Exists(path)) + { + try + { + var nbt = new NbtFile(); + nbt.LoadFromFile(path, NbtCompression.None, _ => true); + root = nbt.RootTag; + if (root.TryGet("servers", out NbtList? existingList) && existingList is not null) + { + servers = existingList; + } + else + { + servers = new NbtList("servers", NbtTagType.Compound); + root.Add(servers); + } + } + catch + { + // Existing file unreadable -- start fresh rather than crashing the install. + root = new NbtCompound(""); + servers = new NbtList("servers", NbtTagType.Compound); + root.Add(servers); + } + } + else + { + root = new NbtCompound(""); + servers = new NbtList("servers", NbtTagType.Compound); + root.Add(servers); + } + + // Match-by-IP. If found, update the display name; otherwise prepend. + for (int i = 0; i < servers.Count; i++) + { + if (servers[i] is not NbtCompound entry) continue; + if (entry.TryGet("ip", out NbtString? ipTag) && ipTag?.Value == ip) + { + entry["name"] = new NbtString("name", name); + Save(root, path); + return; + } + } + + var newEntry = new NbtCompound + { + new NbtString("name", name), + new NbtString("ip", ip), + // acceptTextures = 1 lets the server send its resource pack without prompting + // (the player still gets the prompt; this just allows the option). Default + // value matches what vanilla MC writes when you click "Done" in the UI. + new NbtByte("acceptTextures", 1), + }; + servers.Insert(0, newEntry); + Save(root, path); + } + + private static void Save(NbtCompound root, string path) + { + var file = new NbtFile(root); + file.SaveToFile(path, NbtCompression.None); + } +} diff --git a/launcher/Services/SystemInfo.cs b/launcher/Services/SystemInfo.cs new file mode 100644 index 0000000..7fc7e98 --- /dev/null +++ b/launcher/Services/SystemInfo.cs @@ -0,0 +1,67 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; + +namespace ModpackLauncher.Services; + +public static class SystemInfo +{ + private const long DefaultFallbackKB = 8L * 1024 * 1024; // assume 8 GB if detection fails + + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool GetPhysicallyInstalledSystemMemory(out long memoryInKilobytes); + + /// Total physically installed system RAM in megabytes. + public static int TotalPhysicalMemoryMB + { + get + { + try + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + if (GetPhysicallyInstalledSystemMemory(out var kb)) + return (int)(kb / 1024); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + // Read MemTotal from /proc/meminfo + foreach (var line in File.ReadAllLines("/proc/meminfo")) + { + if (line.StartsWith("MemTotal:", StringComparison.Ordinal)) + { + var parts = line.Split(' ', StringSplitOptions.RemoveEmptyEntries); + if (parts.Length >= 2 && long.TryParse(parts[1], out var memKb)) + return (int)(memKb / 1024); + } + } + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + // GC heap-size hint; not perfect but a reasonable fallback for macOS. + var gcInfo = GC.GetGCMemoryInfo(); + if (gcInfo.TotalAvailableMemoryBytes > 0) + return (int)(gcInfo.TotalAvailableMemoryBytes / (1024 * 1024)); + } + } + catch + { + // Fall through to default + } + return (int)(DefaultFallbackKB / 1024); + } + } + + /// Recommended max user-allocatable RAM (leaves headroom for OS + other apps). + public static int SafeMaxAllocationMB + { + get + { + var total = TotalPhysicalMemoryMB; + // Leave at least 4 GB for OS + browser + Discord + everything else. + var headroom = total >= 32 * 1024 ? 6 * 1024 : 4 * 1024; + return Math.Max(2048, total - headroom); + } + } +} diff --git a/launcher/Services/WebView2Check.cs b/launcher/Services/WebView2Check.cs new file mode 100644 index 0000000..67902e2 --- /dev/null +++ b/launcher/Services/WebView2Check.cs @@ -0,0 +1,39 @@ +using System; +using Microsoft.Win32; + +namespace ModpackLauncher.Services; + +/// +/// Detects whether Microsoft Edge WebView2 Runtime is installed. +/// Required by the Xbox Live SDK + WebView2 sign-in flow used by the launcher when +/// no custom Azure client ID is configured. Preinstalled on Windows 10/11 since +/// 2021 (came with Edge), but not guaranteed on older / cleaned Windows installs. +/// +public static class WebView2Check +{ + private const string ClientGuid = "{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}"; // Microsoft Edge WebView2 Runtime + + public const string DownloadUrl = "https://developer.microsoft.com/microsoft-edge/webview2/"; + + public static bool IsInstalled() + { + // The runtime registers in one of three places depending on machine vs. per-user install. + return GetVersion(RegistryHive.LocalMachine, $@"SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{ClientGuid}") is { } v1 && v1 != "0.0.0.0" + || GetVersion(RegistryHive.LocalMachine, $@"SOFTWARE\Microsoft\EdgeUpdate\Clients\{ClientGuid}") is { } v2 && v2 != "0.0.0.0" + || GetVersion(RegistryHive.CurrentUser, $@"Software\Microsoft\EdgeUpdate\Clients\{ClientGuid}") is { } v3 && v3 != "0.0.0.0"; + } + + private static string? GetVersion(RegistryHive hive, string keyPath) + { + try + { + using var baseKey = RegistryKey.OpenBaseKey(hive, RegistryView.Default); + using var key = baseKey.OpenSubKey(keyPath); + return key?.GetValue("pv") as string; + } + catch + { + return null; + } + } +} diff --git a/launcher/Services/WhitelistRequestService.cs b/launcher/Services/WhitelistRequestService.cs new file mode 100644 index 0000000..02666ae --- /dev/null +++ b/launcher/Services/WhitelistRequestService.cs @@ -0,0 +1,67 @@ +using System; +using System.Net.Http; +using System.Net.Http.Json; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +namespace ModpackLauncher.Services; + +/// +/// Friend-side wrapper for the brass-sigil-server's public whitelist endpoints. +/// Exists so the launcher can: +/// - Send a "please add me" request without the friend needing to share their +/// MC username with the admin out-of-band. +/// - Poll status afterwards so the launcher UI reflects pending/approved/denied. +/// +public sealed class WhitelistRequestService +{ + private static readonly HttpClient _http = new() { Timeout = TimeSpan.FromSeconds(10) }; + + public sealed class StatusResponse + { + [JsonPropertyName("ok")] public bool Ok { get; set; } + [JsonPropertyName("status")] public string? Status { get; set; } + } + + public sealed class RequestResponse + { + [JsonPropertyName("ok")] public bool Ok { get; set; } + [JsonPropertyName("status")] public string? Status { get; set; } + [JsonPropertyName("error")] public string? Error { get; set; } + } + + /// + /// Returns "pending" / "approved" / "denied" / "unknown" / "" (network error). + /// + public async Task GetStatusAsync(string panelUrl, string username) + { + try + { + var url = $"{panelUrl.TrimEnd('/')}/api/whitelist/status?username={Uri.EscapeDataString(username)}"; + var resp = await _http.GetFromJsonAsync(url); + return resp?.Status ?? ""; + } + catch + { + return ""; + } + } + + public async Task SubmitAsync(string panelUrl, string username, string? message = null) + { + try + { + var url = $"{panelUrl.TrimEnd('/')}/api/whitelist/request"; + var resp = await _http.PostAsJsonAsync(url, new { username, message }); + var body = await resp.Content.ReadFromJsonAsync(); + if (body is null) return new RequestResponse { Ok = false, Error = "Empty response." }; + if (!resp.IsSuccessStatusCode && string.IsNullOrEmpty(body.Error)) + body.Error = $"HTTP {(int)resp.StatusCode}"; + return body; + } + catch (Exception ex) + { + return new RequestResponse { Ok = false, Error = ex.Message }; + } + } +} diff --git a/launcher/app.manifest b/launcher/app.manifest new file mode 100644 index 0000000..7efa5b9 --- /dev/null +++ b/launcher/app.manifest @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + diff --git a/launcher/launcher-config.template.json b/launcher/launcher-config.template.json new file mode 100644 index 0000000..f1bd5fd --- /dev/null +++ b/launcher/launcher-config.template.json @@ -0,0 +1,10 @@ +{ + "_comment": "Copy this file to launcher-config.json and fill in real values before building. The launcher-config.json file is gitignored so local values never get committed. httpUsername/httpPassword are optional and only needed if your manifest/file host uses HTTP Basic auth.", + "packName": "Brass & Sigil", + "manifestUrl": "https://your-server.example/pack/manifest.json", + "installDirName": "BrassAndSigilData", + "memoryMB": 8192, + "msalClientId": "00000000-0000-0000-0000-000000000000", + "httpUsername": null, + "httpPassword": null +} diff --git a/launcher/manifest.example.json b/launcher/manifest.example.json new file mode 100644 index 0000000..595778d --- /dev/null +++ b/launcher/manifest.example.json @@ -0,0 +1,33 @@ +{ + "name": "Brass & Sigil", + "version": "0.1.0", + "minecraft": { + "version": "1.21.1" + }, + "loader": { + "type": "neoforge", + "version": "21.1.95" + }, + "files": [ + { + "path": "mods/create-1.21.1-6.0.10.jar", + "url": "https://sijbers.uk/pack/files/mods/create-1.21.1-6.0.10.jar", + "sha1": "0e97e49837bed766e6f28a4c95b04885d6acc353" + }, + { + "path": "mods/create-aeronautics-bundled-1.21.1-1.2.1.jar", + "url": "https://sijbers.uk/pack/files/mods/create-aeronautics-bundled-1.21.1-1.2.1.jar", + "sha1": "fdf1ae69e8b6437e0196b3a35dd2325aa904aba9" + }, + { + "path": "mods/distant-horizons-3.0.2-b-1.21.1.jar", + "url": "https://sijbers.uk/pack/files/mods/distant-horizons-3.0.2-b-1.21.1.jar", + "sha1": "0000000000000000000000000000000000000000" + }, + { + "path": "config/example.cfg", + "url": "https://sijbers.uk/pack/files/config/example.cfg", + "sha1": "0000000000000000000000000000000000000000" + } + ] +} diff --git a/pack/pack.lock.json b/pack/pack.lock.json new file mode 100644 index 0000000..c8b03bf --- /dev/null +++ b/pack/pack.lock.json @@ -0,0 +1,349 @@ +{ + "$schema": "Brass-and-Sigil pack.lock.json - generated, do not edit by hand unless you know what you are doing", + "name": "Brass and Sigil", + "version": "0.9.2", + "minecraft": "1.21.1", + "loader": { + "type": "neoforge", + "version": "21.1.228" + }, + "lockedAt": "2026-05-04T14:22:58.7131203+01:00", + "mods": [ + { + "source": "modrinth", + "slug": "create", + "versionId": "UjX6dr61", + "version": "6.0.10+mc1.21.1", + "path": "mods/create-1.21.1-6.0.10.jar", + "url": "https://cdn.modrinth.com/data/LNytGWDc/versions/UjX6dr61/create-1.21.1-6.0.10.jar", + "sha1": "0e97e49837bed766e6f28a4c95b04885d6acc353", + "size": 19123767 + }, + { + "source": "modrinth", + "slug": "create-aeronautics", + "versionId": "YhZLrAFC", + "version": "1.2.1+mc1.21.1", + "path": "mods/create-aeronautics-bundled-1.21.1-1.2.1.jar", + "url": "https://cdn.modrinth.com/data/oWaK0Q19/versions/YhZLrAFC/create-aeronautics-bundled-1.21.1-1.2.1.jar", + "sha1": "fdf1ae69e8b6437e0196b3a35dd2325aa904aba9", + "size": 33030286 + }, + { + "source": "modrinth", + "slug": "sable", + "versionId": "3FMsUjO4", + "version": "1.2.2+mc1.21.1", + "path": "mods/sable-neoforge-1.21.1-1.2.2.jar", + "url": "https://cdn.modrinth.com/data/T9PomCSv/versions/3FMsUjO4/sable-neoforge-1.21.1-1.2.2.jar", + "sha1": "c5ecd3fcf60a31d84112c708abe29e341b2d1b73", + "size": 12719293 + }, + { + "source": "modrinth", + "slug": "create-big-cannons", + "versionId": "bsGaXKEd", + "version": "5.11.3", + "path": "mods/createbigcannons-5.11.3+mc.1.21.1.jar", + "url": "https://cdn.modrinth.com/data/GWp4jCJj/versions/bsGaXKEd/createbigcannons-5.11.3%2Bmc.1.21.1.jar", + "sha1": "8b61fa850e260bdeb5d360576123f98c260afa50", + "size": 3715787 + }, + { + "source": "modrinth", + "slug": "create-tfmg", + "versionId": "uDi14nbt", + "version": "1.2.0", + "path": "mods/tfmg-1.2.0.jar", + "url": "https://cdn.modrinth.com/data/USgVjXsk/versions/uDi14nbt/tfmg-1.2.0.jar", + "sha1": "b520f3687f60a69eb265ff5b9a16759b9e124103", + "size": 4924243 + }, + { + "source": "modrinth", + "slug": "distanthorizons", + "versionId": "KkaaQtTD", + "version": "3.0.2-b-1.21.1", + "path": "mods/DistantHorizons-3.0.2-b-1.21.1-fabric-neoforge.jar", + "url": "https://cdn.modrinth.com/data/uCdwusMi/versions/KkaaQtTD/DistantHorizons-3.0.2-b-1.21.1-fabric-neoforge.jar", + "sha1": "1ff0a8920e52add541471f7b32d0d389997145ba", + "size": 30019727 + }, + { + "source": "modrinth", + "slug": "sodium", + "versionId": "Pb3OXVqC", + "version": "mc1.21.1-0.6.13-neoforge", + "path": "mods/sodium-neoforge-0.6.13+mc1.21.1.jar", + "url": "https://cdn.modrinth.com/data/AANobbMI/versions/Pb3OXVqC/sodium-neoforge-0.6.13%2Bmc1.21.1.jar", + "sha1": "38af70fa4dc4b2aaac636e92fdba3bedd5a025e1", + "size": 1162994 + }, + { + "source": "modrinth", + "slug": "iris", + "versionId": "t3ruzodq", + "version": "1.8.12+1.21.1-neoforge", + "path": "mods/iris-neoforge-1.8.12+mc1.21.1.jar", + "url": "https://cdn.modrinth.com/data/YL57xq9U/versions/t3ruzodq/iris-neoforge-1.8.12%2Bmc1.21.1.jar", + "sha1": "a3e6355915c7d3b2bc392724795113e51d289378", + "size": 2438548 + }, + { + "source": "modrinth", + "slug": "modernfix", + "versionId": "6U8JVjdw", + "version": "5.27.4+mc1.21.1", + "path": "mods/modernfix-neoforge-5.27.4+mc1.21.1.jar", + "url": "https://cdn.modrinth.com/data/nmDcB62a/versions/6U8JVjdw/modernfix-neoforge-5.27.4%2Bmc1.21.1.jar", + "sha1": "2f39363f0d6d5a5ccc2a9e0f50ad3385611c3cb7", + "size": 562051 + }, + { + "source": "modrinth", + "slug": "ferrite-core", + "versionId": "x7kQWVju", + "version": "7.0.3-neoforge", + "path": "mods/ferritecore-7.0.3-neoforge.jar", + "url": "https://cdn.modrinth.com/data/uXXizFIs/versions/x7kQWVju/ferritecore-7.0.3-neoforge.jar", + "sha1": "9563692efb708b6b568df27a01ec52f6311928ef", + "size": 121559 + }, + { + "source": "modrinth", + "slug": "architectury-api", + "versionId": "ZxYGwlk0", + "version": "13.0.8+neoforge", + "path": "mods/architectury-13.0.8-neoforge.jar", + "url": "https://cdn.modrinth.com/data/lhGA9TYQ/versions/ZxYGwlk0/architectury-13.0.8-neoforge.jar", + "sha1": "6ca11d3cc136bf69bb8f4d56982481eb85b5100b", + "size": 584004 + }, + { + "source": "modrinth", + "slug": "rhino", + "versionId": "ZdLtebKH", + "version": "2101.2.7-build.81+Rhino-1.21", + "path": "mods/rhino-2101.2.7-build.81.jar", + "url": "https://cdn.modrinth.com/data/sk9knFPE/versions/ZdLtebKH/rhino-2101.2.7-build.81.jar", + "sha1": "480235a9f7749f68ce6fec3b9c3cac3428b92a4a", + "size": 882033 + }, + { + "source": "modrinth", + "slug": "rpl", + "versionId": "hZ6B2Z0x", + "version": "2.1.2", + "path": "mods/ritchiesprojectilelib-2.1.2+mc.1.21.1-neoforge.jar", + "url": "https://cdn.modrinth.com/data/B3pb093D/versions/hZ6B2Z0x/ritchiesprojectilelib-2.1.2%2Bmc.1.21.1-neoforge.jar", + "sha1": "ec2e4996f8bee8714173e603e379fef8a6901765", + "size": 76369 + }, + { + "source": "modrinth", + "slug": "kubejs", + "versionId": "Fe9CjPws", + "version": "2101.7.2-build.363", + "path": "mods/kubejs-neoforge-2101.7.2-build.363.jar", + "url": "https://cdn.modrinth.com/data/umyGl7zF/versions/Fe9CjPws/kubejs-neoforge-2101.7.2-build.363.jar", + "sha1": "d4e88254e8c26687d4c6aeb4dfa9c2ad70f260a2", + "size": 2270442 + }, + { + "source": "modrinth", + "slug": "jei", + "versionId": "YAcQ6elZ", + "version": "19.27.0.340", + "path": "mods/jei-1.21.1-neoforge-19.27.0.340.jar", + "url": "https://cdn.modrinth.com/data/u6dRKJwZ/versions/YAcQ6elZ/jei-1.21.1-neoforge-19.27.0.340.jar", + "sha1": "27d0d85e7e32e926fc3664ab6815df5cdabb7941", + "size": 1529391 + }, + { + "source": "modrinth", + "slug": "jade", + "versionId": "yd8FKCmx", + "version": "15.10.5+neoforge", + "path": "mods/Jade-1.21.1-NeoForge-15.10.5.jar", + "url": "https://cdn.modrinth.com/data/nvQzSEkH/versions/yd8FKCmx/Jade-1.21.1-NeoForge-15.10.5.jar", + "sha1": "d5bf134b3dbde9f5258666823900e21341dc0a50", + "size": 725742 + }, + { + "source": "modrinth", + "slug": "chunky", + "versionId": "LuFhm4eU", + "version": "1.4.23", + "path": "mods/Chunky-NeoForge-1.4.23.jar", + "url": "https://cdn.modrinth.com/data/fALzjamp/versions/LuFhm4eU/Chunky-NeoForge-1.4.23.jar", + "sha1": "ab0c74743a653020fe2dfc4986b43e893947f3e9", + "size": 340572 + }, + { + "source": "curseforge", + "slug": "ftb-library", + "fileId": "7746959", + "version": "2101.1.31", + "path": "mods/ftb-library-neoforge-2101.1.31.jar", + "url": "https://mediafilez.forgecdn.net/files/7746/959/ftb-library-neoforge-2101.1.31.jar", + "sha1": "686d4e784c28c14f7760cc22b2de6a8573b56b74", + "size": 1411181 + }, + { + "source": "curseforge", + "slug": "ftb-teams", + "fileId": "7369021", + "version": "2101.1.9", + "path": "mods/ftb-teams-neoforge-2101.1.9.jar", + "url": "https://mediafilez.forgecdn.net/files/7369/21/ftb-teams-neoforge-2101.1.9.jar", + "sha1": "328e04bf1a445870aacea8fe7637670f84272a8f", + "size": 291847 + }, + { + "source": "curseforge", + "slug": "ftb-chunks", + "fileId": "7608681", + "version": "2101.1.14", + "path": "mods/ftb-chunks-neoforge-2101.1.14.jar", + "url": "https://mediafilez.forgecdn.net/files/7608/681/ftb-chunks-neoforge-2101.1.14.jar", + "sha1": "908b63b11d0e00ae6c9557d3fe6440bdbcf21bb7", + "size": 642340 + }, + { + "source": "modrinth", + "slug": "ars-nouveau", + "versionId": "BmGGrC9A", + "version": "5.11.3+mc1.21.1", + "path": "mods/ars_nouveau-1.21.1-5.11.3.jar", + "url": "https://cdn.modrinth.com/data/TKB6INcv/versions/BmGGrC9A/ars_nouveau-1.21.1-5.11.3.jar", + "sha1": "0af12dd7fda63a4261ceb302c9bb57fc235641c6", + "size": 20689115 + }, + { + "source": "modrinth", + "slug": "terralith", + "versionId": "MuJMtPGQ", + "version": "2.5.8", + "path": "mods/Terralith_1.21.x_v2.5.8.jar", + "url": "https://cdn.modrinth.com/data/8oi3bsk5/versions/MuJMtPGQ/Terralith_1.21.x_v2.5.8.jar", + "sha1": "bee0cfb1a8cd4bf3d96bccea224fb45d74de9085", + "size": 3115385 + }, + { + "source": "modrinth", + "slug": "yungs-better-strongholds", + "versionId": "8U0dIfSM", + "version": "1.21.1-NeoForge-5.1.3", + "path": "mods/YungsBetterStrongholds-1.21.1-NeoForge-5.1.3.jar", + "url": "https://cdn.modrinth.com/data/kidLKymU/versions/8U0dIfSM/YungsBetterStrongholds-1.21.1-NeoForge-5.1.3.jar", + "sha1": "5d06a5850af7c577612d4592706a8e156bbe1cbf", + "size": 461244 + }, + { + "source": "modrinth", + "slug": "lithostitched", + "versionId": "IONexlgI", + "version": "1.7.2-neoforge-21.1", + "path": "mods/lithostitched-1.7.2-neoforge-21.1.jar", + "url": "https://cdn.modrinth.com/data/XaDC71GB/versions/IONexlgI/lithostitched-1.7.2-neoforge-21.1.jar", + "sha1": "ce35206214647131ebdf14212d1986349aeba79a", + "size": 810015 + }, + { + "source": "modrinth", + "slug": "c2me-neoforge", + "versionId": "9iPiN34N", + "version": "0.3.0+alpha.0.91+1.21.1", + "path": "mods/c2me-neoforge-mc1.21.1-0.3.0+alpha.0.91.jar", + "url": "https://cdn.modrinth.com/data/COlSi5iR/versions/9iPiN34N/c2me-neoforge-mc1.21.1-0.3.0%2Balpha.0.91.jar", + "sha1": "c858c8becfb5205eb12aaf0420eb82c307c2e6a7", + "size": 4508649 + }, + { + "source": "modrinth", + "slug": "noisium", + "versionId": "nJBE6tif", + "version": "2.3.0+mc1.21-1.21.1", + "path": "mods/noisium-neoforge-2.3.0+mc1.21-1.21.1.jar", + "url": "https://cdn.modrinth.com/data/KuNKN7d2/versions/nJBE6tif/noisium-neoforge-2.3.0%2Bmc1.21-1.21.1.jar", + "sha1": "1bea6b61378ba80f038256c4345d9ff3b67928c4", + "size": 60296 + }, + { + "source": "modrinth", + "slug": "async-locator-refined", + "versionId": "3BdGHbV2", + "version": "1.21.1-1.5.3", + "path": "mods/async-locator-refined-neoforge-1.21.1-1.5.3.jar", + "url": "https://cdn.modrinth.com/data/LUIHK4LD/versions/3BdGHbV2/async-locator-refined-neoforge-1.21.1-1.5.3.jar", + "sha1": "2993e3efc6d211ad8d4db179851dea6fdfff4e07", + "size": 273320 + }, + { + "source": "modrinth", + "slug": "servercore", + "versionId": "77MAnmOn", + "version": "1.5.10+1.21.1", + "path": "mods/servercore-neoforge-1.5.10+1.21.1.jar", + "url": "https://cdn.modrinth.com/data/4WWQxlQP/versions/77MAnmOn/servercore-neoforge-1.5.10%2B1.21.1.jar", + "sha1": "4524cd40cfa5019d8b5fbcb628b1616031838a0c", + "size": 1429522 + }, + { + "source": "modrinth", + "slug": "lithium", + "versionId": "RXHf27Wv", + "version": "mc1.21.1-0.15.3-neoforge", + "path": "mods/lithium-neoforge-0.15.3+mc1.21.1.jar", + "url": "https://cdn.modrinth.com/data/gvQqBUqZ/versions/RXHf27Wv/lithium-neoforge-0.15.3%2Bmc1.21.1.jar", + "sha1": "9fd5fa9076044180ae7f51672de74669196ec72e", + "size": 774148 + }, + { + "source": "modrinth", + "slug": "geckolib", + "versionId": "gFmrC8Ru", + "version": "4.8.4", + "path": "mods/geckolib-neoforge-1.21.1-4.8.4.jar", + "url": "https://cdn.modrinth.com/data/8BmcQJ2H/versions/gFmrC8Ru/geckolib-neoforge-1.21.1-4.8.4.jar", + "sha1": "eb854c8ec53ef922a5f3877a1aa4c1ce1352e0ce", + "size": 622582 + }, + { + "source": "modrinth", + "slug": "curios", + "versionId": "yohfFbgD", + "version": "9.5.1+1.21.1", + "path": "mods/curios-neoforge-9.5.1+1.21.1.jar", + "url": "https://cdn.modrinth.com/data/vvuO3ImH/versions/yohfFbgD/curios-neoforge-9.5.1%2B1.21.1.jar", + "sha1": "418fcd42e3a7844c9bdc71c9b6401fdb3894e0c4", + "size": 410690 + }, + { + "source": "modrinth", + "slug": "yungs-api", + "versionId": "ZB22DE9q", + "version": "1.21.1-NeoForge-5.1.6", + "path": "mods/YungsApi-1.21.1-NeoForge-5.1.6.jar", + "url": "https://cdn.modrinth.com/data/Ua7DFN59/versions/ZB22DE9q/YungsApi-1.21.1-NeoForge-5.1.6.jar", + "sha1": "e1c394779fb9e038e4f7a1b4558d0432607d263b", + "size": 388678 + }, + { + "source": "modrinth", + "slug": "complementary-reimagined", + "versionId": "836bPNGo", + "version": "r5.7.1", + "path": "shaderpacks/ComplementaryReimagined_r5.7.1.zip", + "url": "https://cdn.modrinth.com/data/HVnmMxH1/versions/836bPNGo/ComplementaryReimagined_r5.7.1.zip", + "sha1": "b560f646a124d5204b1fb7321fec373b9c346fa5", + "size": 522970 + } + ], + "defaultServer": { + "name": "Brass and Sigil", + "ip": "bns.sijbers.uk" + }, + "defaultShader": "ComplementaryReimagined_r5.7.1.zip", + "panelUrl": "https://bns-admin.sijbers.uk" +} \ No newline at end of file diff --git a/pack/tweaks/README.md b/pack/tweaks/README.md new file mode 100644 index 0000000..6bd2425 --- /dev/null +++ b/pack/tweaks/README.md @@ -0,0 +1,91 @@ +# Pack tweaks + +This folder is the source for any data-only NeoForge mods we ship with the +modpack. Each subfolder becomes one jar at build time. + +The build pipeline: + +``` +pack/tweaks// --(Build-Tweaks.ps1)--> pack/overrides/mods/-.jar + | + v + (Build-Pack.ps1 picks it up) + | + v + manifest.json -> launcher install +``` + +Because the output is a real mod jar (with `META-INF/neoforge.mods.toml`), +the data inside auto-loads in **single-player and on the server** -- no +`/datapack enable` needed, no per-world setup. + +--- + +## Adding a new tweak (one big jar, recommended) + +The simplest workflow is to keep extending `brassandsigil-tweaks` with more +worldgen / loot / recipe overrides. Just drop more JSON under +`brassandsigil-tweaks/data/brassandsigil_tweaks/...`. + +Common targets: + +| What | Path | +| --------------------------------- | ----------------------------------------------------------------------- | +| Custom configured feature (ore) | `data/brassandsigil_tweaks/worldgen/configured_feature/.json` | +| Custom placed feature | `data/brassandsigil_tweaks/worldgen/placed_feature/.json` | +| Lithostitched modifier | `data/brassandsigil_tweaks/lithostitched/worldgen_modifier/.json` | +| Override another mod's loot table | `data//loot_table/blocks/.json` | +| Override another mod's recipe | `data//recipe/.json` | +| Override / extend a vanilla tag | `data/minecraft/tags//.json` | + +After editing, bump the `version` in +`brassandsigil-tweaks/META-INF/neoforge.mods.toml` so launcher clients see +it as a new file and re-download. + +## Adding a separate tweak mod + +Make a sibling folder. The structure must be: + +``` +tweaks/ + / + META-INF/ + neoforge.mods.toml # modId + version are required + pack.mcmeta # pack_format: 48 for 1.21.1 + data/ + / + ... +``` + +`Build-Tweaks.ps1` reads `modId` and `version` from the toml and produces +`pack/overrides/mods/-.jar`. Old jars for the same `modId` +are auto-cleaned, so version bumps don't leave stale files behind. + +--- + +## What's in `brassandsigil-tweaks` today + +- **`skylands_end_stone_ore`** -- adds small End Stone veins to Terralith's + Skylands biomes (`#terralith:skylands`). Targets `stone_ore_replaceables` + so it only replaces the stone interior of the floating islands. Powers the + Aeronautics Levitite-blend recipe without forcing players to visit The + End. Tuning lives in + `data/brassandsigil_tweaks/worldgen/placed_feature/skylands_end_stone_ore.json` + (`count` = veins per chunk; `size` in the configured_feature controls vein size). + +--- + +## Building + +From the repo root: + +```powershell +# Builds tweak jars + manifest in one shot: +.\scripts\Build-Pack.ps1 -OutputPath .\scripts\manifest.json + +# Just rebuild tweak jars: +.\scripts\Build-Tweaks.ps1 +``` + +Then deploy: `.\scripts\Deploy-Brass.ps1` mirrors `pack/overrides/` to the +public share's `files/` subdir and pushes the regenerated manifest alongside. diff --git a/pack/tweaks/brassandsigil-tweaks/META-INF/neoforge.mods.toml b/pack/tweaks/brassandsigil-tweaks/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..67f35b0 --- /dev/null +++ b/pack/tweaks/brassandsigil-tweaks/META-INF/neoforge.mods.toml @@ -0,0 +1,42 @@ +modLoader = "lowcodefml" +loaderVersion = "[1,)" +license = "All Rights Reserved" +issueTrackerURL = "https://sijbers.uk/pack/" + +[[mods]] +modId = "brassandsigil_tweaks" +version = "1.0.0" +displayName = "Brass & Sigil Tweaks" +description = ''' +Server-and-client worldgen and balance tweaks for the Brass & Sigil modpack. +Ships custom configured features, placed features, and Lithostitched worldgen +modifiers that retune third-party content for this pack. +''' + +[[dependencies.brassandsigil_tweaks]] + modId = "neoforge" + type = "required" + versionRange = "[21.1,)" + ordering = "NONE" + side = "BOTH" + +[[dependencies.brassandsigil_tweaks]] + modId = "minecraft" + type = "required" + versionRange = "[1.21.1,1.22)" + ordering = "NONE" + side = "BOTH" + +[[dependencies.brassandsigil_tweaks]] + modId = "lithostitched" + type = "required" + versionRange = "[1.7,)" + ordering = "NONE" + side = "BOTH" + +[[dependencies.brassandsigil_tweaks]] + modId = "terralith" + type = "required" + versionRange = "[2.5,)" + ordering = "AFTER" + side = "BOTH" diff --git a/pack/tweaks/brassandsigil-tweaks/data/brassandsigil_tweaks/lithostitched/worldgen_modifier/skylands_end_stone.json b/pack/tweaks/brassandsigil-tweaks/data/brassandsigil_tweaks/lithostitched/worldgen_modifier/skylands_end_stone.json new file mode 100644 index 0000000..4031c25 --- /dev/null +++ b/pack/tweaks/brassandsigil-tweaks/data/brassandsigil_tweaks/lithostitched/worldgen_modifier/skylands_end_stone.json @@ -0,0 +1,6 @@ +{ + "type": "lithostitched:add_features", + "biomes": "#terralith:skylands", + "features": "brassandsigil_tweaks:skylands_end_stone_ore", + "step": "underground_ores" +} diff --git a/pack/tweaks/brassandsigil-tweaks/data/brassandsigil_tweaks/worldgen/configured_feature/skylands_end_stone_ore.json b/pack/tweaks/brassandsigil-tweaks/data/brassandsigil_tweaks/worldgen/configured_feature/skylands_end_stone_ore.json new file mode 100644 index 0000000..077bfc6 --- /dev/null +++ b/pack/tweaks/brassandsigil-tweaks/data/brassandsigil_tweaks/worldgen/configured_feature/skylands_end_stone_ore.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:ore", + "config": { + "discard_chance_on_air_exposure": 0.0, + "size": 6, + "targets": [ + { + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:stone_ore_replaceables" + }, + "state": { + "Name": "minecraft:end_stone" + } + } + ] + } +} diff --git a/pack/tweaks/brassandsigil-tweaks/data/brassandsigil_tweaks/worldgen/placed_feature/skylands_end_stone_ore.json b/pack/tweaks/brassandsigil-tweaks/data/brassandsigil_tweaks/worldgen/placed_feature/skylands_end_stone_ore.json new file mode 100644 index 0000000..5f15446 --- /dev/null +++ b/pack/tweaks/brassandsigil-tweaks/data/brassandsigil_tweaks/worldgen/placed_feature/skylands_end_stone_ore.json @@ -0,0 +1,16 @@ +{ + "feature": "brassandsigil_tweaks:skylands_end_stone_ore", + "placement": [ + { "type": "minecraft:count", "count": 3 }, + { "type": "minecraft:in_square" }, + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "min_inclusive": { "absolute": 200 }, + "max_inclusive": { "absolute": 250 } + } + }, + { "type": "minecraft:biome" } + ] +} diff --git a/pack/tweaks/brassandsigil-tweaks/pack.mcmeta b/pack/tweaks/brassandsigil-tweaks/pack.mcmeta new file mode 100644 index 0000000..a56801b --- /dev/null +++ b/pack/tweaks/brassandsigil-tweaks/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "pack_format": 48, + "description": "Brass & Sigil pack tweaks" + } +} diff --git a/scripts/Build-Pack.ps1 b/scripts/Build-Pack.ps1 new file mode 100644 index 0000000..a373626 --- /dev/null +++ b/scripts/Build-Pack.ps1 @@ -0,0 +1,183 @@ +#requires -Version 5 +<# +.SYNOPSIS + Generates manifest.json deterministically from pack.lock.json. + +.DESCRIPTION + The lockfile (pack.lock.json) is the source of truth for every mod's exact + version, URL, SHA-1, and size. Running this script does not change versions. + + To intentionally bump versions, use Update-Pack.ps1 with the -Refresh flag. + To see what new versions are available, use Check-Updates.ps1. + + Workflow: + 1. Edit pack.lock.json (manually or via Update-Pack.ps1 -Refresh) + 2. Run Build-Pack.ps1 -OutputPath ...\manifest.json + 3. Update the server to match + 4. Deploy manifest to your hosted URL + +.PARAMETER OutputPath + Where to write manifest.json. + +.PARAMETER LocalPackSource + Optional folder containing local override files (configs, resourcepacks, etc.). + +.PARAMETER SelfHostBaseUrl + Public URL prefix for self-hosted files (only used when LocalPackSource is set). +#> + +[CmdletBinding()] +param( + [string]$OutputPath = ".\manifest.json", + [string]$LocalPackSource = "", + [string]$SelfHostBaseUrl = "https://sijbers.uk/pack/files", + # Optional -- point at a published launcher .exe to embed launcherVersion + launcherUrl + # in the manifest. The launcher displays a "newer version available" banner when + # its embedded version is lower than this. Skip entirely to leave both fields out. + [string]$LauncherExePath = "", + [string]$LauncherPublicUrl = "https://sijbers.uk/pack/BrassAndSigil-Launcher.exe", + # Skip the auto-invoke of Build-Tweaks.ps1 (only touch this if you're debugging). + [switch]$SkipTweaks +) + +$ErrorActionPreference = 'Stop' +$ProgressPreference = 'SilentlyContinue' + +$here = Split-Path -Parent $MyInvocation.MyCommand.Path +$lockPath = Join-Path $here '..\pack\pack.lock.json' + +# Build any data-only tweak jars first, then fold the resulting overrides +# folder into the manifest. Set -SkipTweaks to bypass. The "overrides" name +# matches CurseForge/Modrinth modpack conventions: files that override or +# augment the standard mod set, hosted by us. +$tweaksRoot = Join-Path $here '..\pack\tweaks' +$overridesRoot = Join-Path $here '..\pack\overrides' +if (-not $SkipTweaks -and (Test-Path $tweaksRoot)) { + & (Join-Path $here 'Build-Tweaks.ps1') -TweaksRoot $tweaksRoot -OutputRoot (Join-Path $overridesRoot 'mods') +} +if (-not $LocalPackSource -and (Test-Path $overridesRoot)) { + $LocalPackSource = $overridesRoot +} + +if (-not (Test-Path $lockPath)) { + throw "pack.lock.json not found at $lockPath. Run Update-Pack.ps1 -Refresh first to bootstrap it." +} + +$lock = Get-Content $lockPath -Raw | ConvertFrom-Json + +Write-Host "" +Write-Host "Building manifest from pack.lock.json:" +Write-Host (" Pack: {0} v{1}" -f $lock.name, $lock.version) +Write-Host (" MC: {0} ({1} {2})" -f $lock.minecraft, $lock.loader.type, $lock.loader.version) +Write-Host (" Locked: {0}" -f $lock.lockedAt) +Write-Host (" Mods: {0}" -f $lock.mods.Count) +Write-Host "" + +$files = @() +$totalBytes = 0L + +foreach ($mod in $lock.mods) { + $files += [pscustomobject]@{ + path = $mod.path + url = $mod.url + sha1 = $mod.sha1 + size = $mod.size + } + $totalBytes += $mod.size + Write-Host (" [{0}] {1,-26} {2,-22} {3,8:N0} KB" -f $mod.source.PadRight(7).Substring(0,7), $mod.slug, $mod.version, ($mod.size/1KB)) +} + +# Local overrides (configs, custom files not on Modrinth/CurseForge) +if ($LocalPackSource -and (Test-Path $LocalPackSource)) { + Write-Host "" + Write-Host "Adding local overrides from $LocalPackSource..." + $managedRoots = @('mods', 'config', 'resourcepacks', 'shaderpacks', 'kubejs', 'defaultconfigs') + $base = $SelfHostBaseUrl.TrimEnd('/') + $sourceFull = (Resolve-Path $LocalPackSource).Path.TrimEnd('\','/') + foreach ($root in $managedRoots) { + $rootDir = Join-Path $LocalPackSource $root + if (-not (Test-Path $rootDir)) { continue } + Get-ChildItem -Path $rootDir -Recurse -File | ForEach-Object { + $rel = $_.FullName.Substring($sourceFull.Length).TrimStart('\','/') -replace '\\','/' + $sha1 = (Get-FileHash -Algorithm SHA1 -Path $_.FullName).Hash.ToLowerInvariant() + $files += [pscustomobject]@{ + path = $rel + url = "$base/$rel" + sha1 = $sha1 + size = $_.Length + } + $totalBytes += $_.Length + Write-Host (" [local] {0}" -f $rel) + } + } +} + +$manifest = [ordered]@{ + name = $lock.name + version = $lock.version + minecraft = [ordered]@{ version = $lock.minecraft } + loader = [ordered]@{ type = $lock.loader.type; version = $lock.loader.version } + files = $files +} + +# Optional: copy a defaultServer block through from the lockfile so the launcher +# can pre-populate friends' multiplayer list. Lockfile schema: +# "defaultServer": { "name": "Brass & Sigil", "ip": "bns.sijbers.uk" } +if ($lock.PSObject.Properties.Name -contains "defaultServer" -and $lock.defaultServer) { + $manifest.defaultServer = [ordered]@{ + name = $lock.defaultServer.name + ip = $lock.defaultServer.ip + } + Write-Host (" Default server: {0} ({1})" -f $lock.defaultServer.name, $lock.defaultServer.ip) +} + +# Optional: shader pack to enable by default on fresh installs. Lockfile schema: +# "defaultShader": "ComplementaryReimagined_r5.7.1.zip" +if ($lock.PSObject.Properties.Name -contains "defaultShader" -and $lock.defaultShader) { + $manifest.defaultShader = $lock.defaultShader + Write-Host (" Default shader: {0}" -f $lock.defaultShader) +} + +# Optional: public URL of the brass-sigil-server panel. Used by the launcher +# to send friend-side whitelist requests. Lockfile schema: +# "panelUrl": "https://bns-admin.sijbers.uk" +if ($lock.PSObject.Properties.Name -contains "panelUrl" -and $lock.panelUrl) { + $manifest.panelUrl = $lock.panelUrl + Write-Host (" Panel URL: {0}" -f $lock.panelUrl) +} + +# Optional launcher metadata: when -LauncherExePath is supplied, read the exe's +# FileVersion (set via in ModpackLauncher.csproj) and embed it. The +# launcher compares its assembly version to this value and shows an upgrade +# banner pointing at LauncherPublicUrl when older. +if ($LauncherExePath) { + if (-not (Test-Path $LauncherExePath)) { + throw "LauncherExePath '$LauncherExePath' does not exist." + } + $launcherFile = Get-Item $LauncherExePath + $launcherVersion = $launcherFile.VersionInfo.FileVersion + if ([string]::IsNullOrWhiteSpace($launcherVersion)) { + throw "Launcher exe has no FileVersion -- set in ModpackLauncher.csproj and republish." + } + # FileVersion is the four-component form (e.g. "0.1.0.0" for csproj 0.1.0). + # Embed as-is -- the launcher's Version.Parse handles it directly and avoids ambiguous + # comparisons between trimmed and untrimmed forms. + $manifest.launcherVersion = $launcherVersion + $manifest.launcherUrl = $LauncherPublicUrl + + Write-Host "" + Write-Host ("Launcher metadata embedded:") + Write-Host (" Version: {0}" -f $launcherVersion) + Write-Host (" Url: {0}" -f $LauncherPublicUrl) + Write-Host (" Source: {0}" -f $launcherFile.FullName) +} + +$json = $manifest | ConvertTo-Json -Depth 10 +$outDir = Split-Path -Parent $OutputPath +if ($outDir -and -not (Test-Path $outDir)) { New-Item -ItemType Directory -Path $outDir | Out-Null } +[System.IO.File]::WriteAllText($OutputPath, $json, [System.Text.UTF8Encoding]::new($false)) + +Write-Host "" +Write-Host "Manifest written: $OutputPath" +Write-Host (" Files: {0}" -f $files.Count) +Write-Host (" Total: {0:N1} MB (download size)" -f ($totalBytes / 1MB)) diff --git a/scripts/Build-Tweaks.ps1 b/scripts/Build-Tweaks.ps1 new file mode 100644 index 0000000..4e8d819 --- /dev/null +++ b/scripts/Build-Tweaks.ps1 @@ -0,0 +1,115 @@ +#requires -Version 5 +<# +.SYNOPSIS + Builds every tweak source folder under ..\pack\tweaks\ into a data-only + mod jar and drops it into ..\pack\overrides\mods\. + +.DESCRIPTION + Each subfolder of ..\pack\tweaks\ is treated as one self-contained + "data-only" NeoForge mod. Its modId, version, and display name come from + the folder's META-INF\neoforge.mods.toml. The script: + + 1. Reads modId + version from neoforge.mods.toml. + 2. Zips the folder contents (data\, META-INF\, pack.mcmeta) into a jar + named "-.jar". + 3. Removes any older jars for the same modId from the output folder so + stale versions don't get bundled into the manifest. + + Run this before Build-Pack.ps1, or let Build-Pack.ps1 invoke it for you. + +.PARAMETER TweaksRoot + Folder containing tweak source subfolders. Defaults to ..\pack\tweaks\. + +.PARAMETER OutputRoot + Where built jars go. Defaults to ..\pack\overrides\mods\. This path + becomes Build-Pack.ps1's -LocalPackSource (one level up). +#> + +[CmdletBinding()] +param( + [string]$TweaksRoot = "", + [string]$OutputRoot = "" +) + +$ErrorActionPreference = 'Stop' +$ProgressPreference = 'SilentlyContinue' + +$here = Split-Path -Parent $MyInvocation.MyCommand.Path +if (-not $TweaksRoot) { $TweaksRoot = Join-Path $here '..\pack\tweaks' } +if (-not $OutputRoot) { $OutputRoot = Join-Path $here '..\pack\overrides\mods' } + +if (-not (Test-Path $TweaksRoot)) { + Write-Host "No tweaks folder at $TweaksRoot -- nothing to build." + return +} + +if (-not (Test-Path $OutputRoot)) { + New-Item -ItemType Directory -Path $OutputRoot -Force | Out-Null +} + +# Read modId + version out of a neoforge.mods.toml. We do this with a tiny regex +# parser instead of a full TOML library because we only need two scalars and we +# control the file format. Lines like: modId = "foo" version = "1.2.3" +function Get-ModMeta { + param([string]$TomlPath) + if (-not (Test-Path $TomlPath)) { + throw "Missing $TomlPath -- every tweak folder needs META-INF\neoforge.mods.toml." + } + $content = Get-Content $TomlPath -Raw + + $modIdMatch = [regex]::Match($content, '(?m)^\s*modId\s*=\s*"([^"]+)"') + $versionMatch = [regex]::Match($content, '(?m)^\s*version\s*=\s*"([^"]+)"') + + if (-not $modIdMatch.Success) { throw "Could not parse modId from $TomlPath" } + if (-not $versionMatch.Success) { throw "Could not parse version from $TomlPath" } + + return [pscustomobject]@{ + ModId = $modIdMatch.Groups[1].Value + Version = $versionMatch.Groups[1].Value + } +} + +Add-Type -AssemblyName System.IO.Compression.FileSystem + +$tweakDirs = Get-ChildItem -Path $TweaksRoot -Directory + +if ($tweakDirs.Count -eq 0) { + Write-Host "No tweak folders found under $TweaksRoot." + return +} + +Write-Host "" +Write-Host "Building tweak jars from $TweaksRoot" +Write-Host "" + +foreach ($dir in $tweakDirs) { + $tomlPath = Join-Path $dir.FullName 'META-INF\neoforge.mods.toml' + $meta = Get-ModMeta -TomlPath $tomlPath + + $jarName = "$($meta.ModId)-$($meta.Version).jar" + $jarPath = Join-Path $OutputRoot $jarName + + # Wipe stale jars for this modId so old versions don't get bundled into + # the manifest alongside the new one. + Get-ChildItem -Path $OutputRoot -Filter "$($meta.ModId)-*.jar" -ErrorAction SilentlyContinue | + Where-Object { $_.Name -ne $jarName } | + ForEach-Object { + Write-Host (" removing stale: {0}" -f $_.Name) + Remove-Item $_.FullName -Force + } + + if (Test-Path $jarPath) { Remove-Item $jarPath -Force } + + [System.IO.Compression.ZipFile]::CreateFromDirectory( + $dir.FullName, + $jarPath, + [System.IO.Compression.CompressionLevel]::Optimal, + $false + ) + + $size = (Get-Item $jarPath).Length + Write-Host (" built {0,-40} {1,8:N0} bytes" -f $jarName, $size) +} + +Write-Host "" +Write-Host "Tweak jars are in: $OutputRoot" diff --git a/scripts/Check-Updates.ps1 b/scripts/Check-Updates.ps1 new file mode 100644 index 0000000..7f793c7 --- /dev/null +++ b/scripts/Check-Updates.ps1 @@ -0,0 +1,101 @@ +#requires -Version 5 +<# +.SYNOPSIS + Read-only update checker. Diffs the locked Modrinth versions against the + latest available on Modrinth. Prints a report. Does not change anything. + +.DESCRIPTION + Run this periodically to see what mod updates are available without + committing to anything. Decide which to bump, then either edit pack.lock.json + by hand or re-run Update-Pack.ps1 to refresh everything. + + CurseForge mods (FTB family) aren't auto-checked here -- CF requires an API + key for proper version listing. Manually monitor those at: + https://www.curseforge.com/minecraft/mc-mods/ftb-chunks-forge + https://www.curseforge.com/minecraft/mc-mods/ftb-library-forge + https://www.curseforge.com/minecraft/mc-mods/ftb-teams-forge +#> + +[CmdletBinding()] +param() + +$ErrorActionPreference = 'Stop' +$ProgressPreference = 'SilentlyContinue' + +$here = Split-Path -Parent $MyInvocation.MyCommand.Path +$lockPath = Join-Path $here '..\pack\pack.lock.json' + +if (-not (Test-Path $lockPath)) { + throw "pack.lock.json not found. Run Update-Pack.ps1 first to bootstrap it." +} + +$lock = Get-Content $lockPath -Raw | ConvertFrom-Json +$mc = $lock.minecraft +$lt = $lock.loader.type + +Write-Host "" +Write-Host "Checking Modrinth for newer versions..." +Write-Host (" Pack: $($lock.name) v$($lock.version)") +Write-Host (" MC: $mc ($lt $($lock.loader.version))") +Write-Host (" Locked: $($lock.lockedAt)") +Write-Host "" + +Add-Type -AssemblyName System.Web + +function Invoke-Modrinth { + param([string]$Path) + Invoke-RestMethod -Uri "https://api.modrinth.com/v2$Path" -Headers @{ 'User-Agent' = 'BrassAndSigil-Launcher/0.1 (matt@sijbers.uk)' } +} + +$updatesAvailable = 0 +$upToDate = 0 +$skipped = 0 + +foreach ($mod in $lock.mods) { + if ($mod.source -ne "modrinth") { + Write-Host (" [cforge] $($mod.slug.PadRight(22)) $($mod.version.PadRight(34)) (manual check)") + $skipped++ + continue + } + + try { + $encGv = [System.Web.HttpUtility]::UrlEncode('["' + $mc + '"]') + $encL = [System.Web.HttpUtility]::UrlEncode('["' + $lt + '"]') + $versions = Invoke-Modrinth ("/project/$($mod.slug)/version?game_versions=$encGv" + "&" + "loaders=$encL") + } catch { + Write-Warning " [error] $($mod.slug) - $($_.Exception.Message)" + continue + } + if (-not $versions -or $versions.Count -eq 0) { + Write-Warning " [gone] $($mod.slug) - no versions found on Modrinth" + continue + } + + $latest = $versions[0] + $latestVer = $latest.version_number + $latestType = $latest.version_type + + if ($latest.id -eq $mod.versionId) { + Write-Host (" [ok] $($mod.slug.PadRight(22)) $($mod.version.PadRight(34)) (current)") + $upToDate++ + } + else { + $tag = if ($latestType -eq 'beta') { '[update*]' } else { '[update] ' } + Write-Host (" $tag $($mod.slug.PadRight(22)) $($mod.version.PadRight(34)) -> $latestVer") -ForegroundColor Yellow + $updatesAvailable++ + } +} + +Write-Host "" +Write-Host "Summary:" +Write-Host (" Up to date: $upToDate") +$updateColor = if ($updatesAvailable -gt 0) { 'Yellow' } else { 'White' } +Write-Host (" Updates: $updatesAvailable") -ForegroundColor $updateColor +Write-Host (" Manual check: $skipped (CurseForge)") +Write-Host "" +if ($updatesAvailable -gt 0) { + Write-Host "[update*] = beta release. Bump only if you specifically want it." + Write-Host "" + Write-Host "To take all updates: run Update-Pack.ps1 (then Build-Pack.ps1 + deploy server)." + Write-Host "To pick selectively: edit pack.lock.json by hand, then run Build-Pack.ps1." +} diff --git a/scripts/Deploy-Brass.ps1 b/scripts/Deploy-Brass.ps1 new file mode 100644 index 0000000..b3508ea --- /dev/null +++ b/scripts/Deploy-Brass.ps1 @@ -0,0 +1,231 @@ +#requires -Version 5 +<# +.SYNOPSIS + One-shot deploy: build launcher + server, regenerate manifest, mirror the + deploy share, scp the server binary. + +.DESCRIPTION + Reads `deploy.config.ps1` (sibling file, gitignored) for local paths + + SSH details. Stages run in order; -Stage limits which stages run. + + The script does NOT auto-restart the production daemon. After a server + binary deploy it prompts you to do that yourself. + +.PARAMETER Stage + All | Launcher | Server | Pack. Defaults to All. + + Launcher = build launcher + regenerate manifest + push to deploy share + Server = build server + scp binary (atomic swap) + Pack = regenerate manifest + mirror pack/overrides/* to share + All = everything, in order + +.PARAMETER SkipBuild + Skip dotnet publish steps. Use when you've already built and just want + to push artifacts. + +.PARAMETER DryRun + Print each action without executing. No files copied, no SSH, no build. +#> + +[CmdletBinding()] +param( + [ValidateSet('All','Launcher','Server','Pack')] + [string]$Stage = 'All', + [switch]$SkipBuild, + [switch]$DryRun, + # Skip the version-bump check. Use only for cosmetic/internal-only changes + # where you're SURE clients don't need to re-sync. The default is to refuse + # if the local pack/launcher version matches what's already deployed. + [switch]$Force +) + +$ErrorActionPreference = 'Stop' +$ProgressPreference = 'SilentlyContinue' + +# ─── Resolve repo + load config ──────────────────────────────────────────── +$here = Split-Path -Parent $MyInvocation.MyCommand.Path +$repoRoot = Resolve-Path (Join-Path $here '..') +$cfgPath = Join-Path $here 'deploy.config.ps1' +if (-not (Test-Path $cfgPath)) { + throw "Missing $cfgPath. Copy deploy.config.template.ps1 -> deploy.config.ps1 and fill in real values." +} +. $cfgPath + +# Sanity-check required vars actually got set (template ships with CHANGE_ME). +foreach ($v in 'DeployShare','ServerSshHost','ServerSshKey','ServerBinaryRemote') { + $val = Get-Variable -Name $v -ValueOnly -ErrorAction Stop + if ($val -match 'CHANGE_ME' -or [string]::IsNullOrWhiteSpace($val)) { + throw "deploy.config.ps1 has placeholder/empty `$$v. Fill it in." + } +} + +$shouldRunLauncher = $Stage -in @('All','Launcher') +$shouldRunServer = $Stage -in @('All','Server') +$shouldRunPack = $Stage -in @('All','Launcher','Pack') # manifest needs launcher exe meta + +# ─── Pre-flight: version-bump check ──────────────────────────────────────── +# The launcher caches the pack by version: a client that already synced +# pack v0.9.2 will short-circuit at "already on 0.9.2" if you re-deploy +# under the same version, even if the file list / SHAs changed. Same idea +# applies to launcherVersion (drives the in-launcher upgrade banner). +# We fetch the currently-deployed manifest and refuse to deploy if the +# matching version field hasn't been bumped. Use -Force to override (e.g. +# for cosmetic-only changes where re-sync isn't needed). +if (($shouldRunPack -or $shouldRunLauncher) -and -not $DryRun -and -not $Force) { + if (-not $ManifestPublicUrl -or $ManifestPublicUrl -match 'CHANGE_ME') { + throw "deploy.config.ps1 is missing `$ManifestPublicUrl. Set it to the deployed manifest URL (e.g. https://example.com/pack/manifest.json)." + } + $deployed = $null + try { + $deployed = Invoke-RestMethod -Uri $ManifestPublicUrl -TimeoutSec 8 + } catch { + Write-Host "Pre-flight: couldn't fetch deployed manifest at $ManifestPublicUrl -- version check skipped (probably first deploy)." -ForegroundColor DarkGray + } + if ($deployed) { + $errs = @() + # Pack version check applies only when the user is explicitly deploying + # pack content (Stage = All or Pack). A launcher-only deploy intentionally + # leaves pack content alone, so the pack version SHOULD stay constant. + $strictPackCheck = $Stage -in @('All','Pack') + if ($strictPackCheck) { + $lock = Get-Content (Join-Path $repoRoot 'pack\pack.lock.json') -Raw | ConvertFrom-Json + if ($deployed.version -eq $lock.version) { + $errs += "Pack version is unchanged ($($lock.version)). Clients cached at that version will SKIP the sync -- they won't pick up your pack changes. Bump 'version' in pack/pack.lock.json before deploying." + } + } + if ($shouldRunLauncher) { + $csprojPath = Join-Path $repoRoot 'launcher\ModpackLauncher.csproj' + [xml]$csproj = Get-Content $csprojPath + $localLauncherVersion = ($csproj.Project.PropertyGroup.Version | Where-Object { $_ }) | Select-Object -First 1 + # Manifest stores 4-part FileVersion (e.g. "0.4.4.0"); csproj is 3-part ("0.4.4"). Compare normalised. + $deployedNorm = ($deployed.launcherVersion -replace '\.0+$','') + $localNorm = ($localLauncherVersion -replace '\.0+$','') + if ($deployedNorm -eq $localNorm -and $localNorm) { + $errs += "Launcher version is unchanged ($localLauncherVersion). Existing 0.4.x installs won't see an upgrade prompt -- bump in launcher/ModpackLauncher.csproj before deploying." + } + } + if ($errs.Count -gt 0) { + Write-Host "" + Write-Host "VERSION-BUMP CHECK FAILED:" -ForegroundColor Red + foreach ($e in $errs) { Write-Host " - $e" -ForegroundColor Red } + Write-Host "" + Write-Host "If you're re-deploying without any user-visible changes, pass -Force to skip this check." -ForegroundColor DarkGray + exit 1 + } + } +} + +# ─── Pre-flight: was the daemon already running? ─────────────────────────── +# We don't auto-stop it (kicks active players to fix a problem that isn't +# actually broken -- the atomic swap is safe with the daemon running). But +# knowing the state up front lets us tailor the final "next steps" message +# so a deploy success doesn't silently leave you on the old code. +$daemonWasRunning = $false +if ($shouldRunServer) { + Write-Host "Pre-flight: checking daemon state on $ServerSshHost..." -ForegroundColor DarkGray + # Single-quoted PS string so PowerShell doesn't try to interpret the + # bash-side metacharacters. The remote shell sees the literal pgrep + # command; the trailing $ anchors so we don't match run.sh wrappers. + $remoteCmd = 'pgrep -f /brass-sigil-server$ 2>/dev/null' + $pgrepOut = & ssh -i $ServerSshKey -o ConnectTimeout=5 -o BatchMode=yes $ServerSshHost $remoteCmd 2>$null + $daemonWasRunning = -not [string]::IsNullOrWhiteSpace($pgrepOut) + if ($daemonWasRunning) { + Write-Host " Daemon is RUNNING. Atomic swap is safe -- but you'll need to" -ForegroundColor Yellow + Write-Host " stop+start it after deploy for the new code to take effect." -ForegroundColor Yellow + } else { + Write-Host " Daemon is stopped. New binary will run as soon as you start it." -ForegroundColor DarkGray + } +} + +# ─── Helpers ─────────────────────────────────────────────────────────────── +$stepNum = 0 +function Step($desc, [scriptblock]$body) { + $script:stepNum++ + $start = Get-Date + Write-Host "" + Write-Host ("[{0}] {1}" -f $script:stepNum, $desc) -ForegroundColor Cyan + if ($DryRun) { + Write-Host " (dry-run, skipping)" -ForegroundColor DarkGray + return + } + & $body + $elapsed = (Get-Date) - $start + Write-Host (" done in {0:N1}s" -f $elapsed.TotalSeconds) -ForegroundColor DarkGray +} + +# ─── Stage 1: build launcher ─────────────────────────────────────────────── +$launcherExe = Join-Path $repoRoot (Join-Path $LauncherPublishDir $LauncherExeName) +if ($shouldRunLauncher -and -not $SkipBuild) { + Step "Build launcher (dotnet publish launcher\)" { + Push-Location (Join-Path $repoRoot 'launcher') + try { dotnet publish -c Release -nologo | Out-Host } + finally { Pop-Location } + if (-not (Test-Path $launcherExe)) { throw "Launcher publish didn't produce $launcherExe" } + } +} + +# ─── Stage 2: build server ───────────────────────────────────────────────── +$serverExe = Join-Path $repoRoot (Join-Path $ServerPublishDir $ServerExeName) +if ($shouldRunServer -and -not $SkipBuild) { + Step "Build server (dotnet publish server\ -r linux-x64)" { + Push-Location (Join-Path $repoRoot 'server') + try { dotnet publish -c Release -r linux-x64 --self-contained true -nologo | Out-Host } + finally { Pop-Location } + if (-not (Test-Path $serverExe)) { throw "Server publish didn't produce $serverExe" } + } +} + +# ─── Stage 3: regenerate manifest ────────────────────────────────────────── +$manifestPath = Join-Path $here 'manifest.json' +if ($shouldRunPack) { + Step "Regenerate manifest (Build-Pack.ps1)" { + $args = @{ OutputPath = $manifestPath } + if ($shouldRunLauncher -and (Test-Path $launcherExe)) { $args.LauncherExePath = $launcherExe } + & (Join-Path $here 'Build-Pack.ps1') @args | Out-Host + } +} + +# ─── Stage 4: mirror pack overrides to share ────────────────────────────── +$overridesLocal = Join-Path $repoRoot 'pack\overrides' +$shareFiles = Join-Path $DeployShare 'files' +if ($shouldRunPack -and (Test-Path $overridesLocal)) { + Step "Mirror pack/overrides/ -> $shareFiles" { + # /MIR makes destination match source (deletes orphan files in $shareFiles). + # /XJ skips junctions, /R:1 /W:1 keeps retry behaviour sane on flaky shares. + robocopy $overridesLocal $shareFiles /MIR /XJ /R:1 /W:1 /NFL /NDL /NJH /NJS /NP | Out-Host + # Robocopy returns 0-7 for success-with-info; 8+ is real failure. + if ($LASTEXITCODE -ge 8) { throw "robocopy failed with exit $LASTEXITCODE" } + } +} + +# ─── Stage 5: deploy launcher exe + manifest to share ────────────────────── +if ($shouldRunLauncher) { + Step "Copy launcher.exe + manifest to $DeployShare" { + Copy-Item $launcherExe (Join-Path $DeployShare $LauncherDeployedAs) -Force + Copy-Item $manifestPath (Join-Path $DeployShare 'manifest.json') -Force + } +} + +# ─── Stage 6: scp + atomic swap server binary ────────────────────────────── +if ($shouldRunServer) { + Step "scp server binary -> $ServerSshHost`:$ServerBinaryRemote (atomic swap)" { + $remoteNew = "$ServerBinaryRemote.new" + & scp -i $ServerSshKey -o ConnectTimeout=15 $serverExe "$ServerSshHost`:$remoteNew" + if ($LASTEXITCODE -ne 0) { throw "scp failed with exit $LASTEXITCODE" } + $cmd = "chmod +x '$remoteNew' && mv '$remoteNew' '$ServerBinaryRemote' && md5sum '$ServerBinaryRemote'" + & ssh -i $ServerSshKey -o ConnectTimeout=10 $ServerSshHost $cmd + if ($LASTEXITCODE -ne 0) { throw "ssh swap failed with exit $LASTEXITCODE" } + } + Write-Host "" + if ($daemonWasRunning) { + Write-Host "Server binary swapped on disk, but the daemon was running before this" -ForegroundColor Yellow + Write-Host "deploy and is still on the OLD code in memory (Linux preserves the running" -ForegroundColor Yellow + Write-Host "inode through rename). Stop + start the daemon to pick up the new build." -ForegroundColor Yellow + } else { + Write-Host "Server binary swapped on disk. Daemon was stopped -- start it whenever" -ForegroundColor Green + Write-Host "you're ready and it'll run the new build." -ForegroundColor Green + } +} + +Write-Host "" +Write-Host "Deploy finished." -ForegroundColor Green diff --git a/scripts/Update-Pack.ps1 b/scripts/Update-Pack.ps1 new file mode 100644 index 0000000..7b78b2b --- /dev/null +++ b/scripts/Update-Pack.ps1 @@ -0,0 +1,207 @@ +#requires -Version 5 +<# +.SYNOPSIS + Refreshes pack.lock.json by querying Modrinth + CurseForge for the latest + compatible version of each mod listed below. + +.DESCRIPTION + THIS SCRIPT MUTATES pack.lock.json. Run only when you intentionally want to + bump versions (and remember to update the server to match). + + For non-mutating "what's available?" reports, run Check-Updates.ps1. + +.PARAMETER PackName +.PARAMETER PackVersion +.PARAMETER MinecraftVersion +.PARAMETER LoaderType +.PARAMETER LoaderVersion + Override pack metadata. Defaults read from existing lockfile if present. +#> + +[CmdletBinding()] +param( + [string]$PackName = "", + [string]$PackVersion = "", + [string]$MinecraftVersion = "1.21.1", + [string]$LoaderType = "neoforge", + [string]$LoaderVersion = "" +) + +$ErrorActionPreference = 'Stop' +$ProgressPreference = 'SilentlyContinue' + +$here = Split-Path -Parent $MyInvocation.MyCommand.Path +$lockPath = Join-Path $here '..\pack\pack.lock.json' + +# Read existing lock for defaults +$existing = if (Test-Path $lockPath) { Get-Content $lockPath -Raw | ConvertFrom-Json } else { $null } +if (-not $PackName -and $existing) { $PackName = $existing.name } +if (-not $PackVersion -and $existing) { $PackVersion = $existing.version } +if (-not $LoaderVersion -and $existing) { $LoaderVersion = $existing.loader.version } +if (-not $PackName) { $PackName = "Brass and Sigil" } +if (-not $PackVersion) { $PackVersion = "0.6.0" } +if (-not $LoaderVersion) { $LoaderVersion = "21.1.228" } + +# --------------------------------------------------------------------------- +# Mod definitions: edit here when adding/removing mods. allowBeta=true allows +# fallback to beta if no release exists. +# --------------------------------------------------------------------------- +$modrinthMods = @( + @{ slug = "create"; allowBeta = $false } + @{ slug = "create-aeronautics"; allowBeta = $false } + @{ slug = "sable"; allowBeta = $false } + @{ slug = "create-big-cannons"; allowBeta = $false } + @{ slug = "create-tfmg"; allowBeta = $false } + @{ slug = "distanthorizons"; allowBeta = $true } + @{ slug = "sodium"; allowBeta = $false } + @{ slug = "iris"; allowBeta = $false } + @{ slug = "modernfix"; allowBeta = $false } + @{ slug = "ferrite-core"; allowBeta = $false } + @{ slug = "architectury-api"; allowBeta = $false } + @{ slug = "rhino"; allowBeta = $true } + @{ slug = "rpl"; allowBeta = $false } + @{ slug = "kubejs"; allowBeta = $false } + @{ slug = "jei"; allowBeta = $true } + @{ slug = "jade"; allowBeta = $false } + @{ slug = "chunky"; allowBeta = $false } +) + +# CurseForge mods aren't auto-resolved (no public API without a key). +# Update fileId/version/filename here when bumping. +$curseforgeMods = @( + @{ + slug = "ftb-library" + version = "2101.1.31" + fileId = "7746959" + path = "mods/ftb-library-neoforge-2101.1.31.jar" + url = "https://mediafilez.forgecdn.net/files/7746/959/ftb-library-neoforge-2101.1.31.jar" + } + @{ + slug = "ftb-teams" + version = "2101.1.9" + fileId = "7369021" + path = "mods/ftb-teams-neoforge-2101.1.9.jar" + url = "https://mediafilez.forgecdn.net/files/7369/21/ftb-teams-neoforge-2101.1.9.jar" + } + @{ + slug = "ftb-chunks" + version = "2101.1.14" + fileId = "7608681" + path = "mods/ftb-chunks-neoforge-2101.1.14.jar" + url = "https://mediafilez.forgecdn.net/files/7608/681/ftb-chunks-neoforge-2101.1.14.jar" + } +) + +Add-Type -AssemblyName System.Web + +function Invoke-Modrinth { + param([string]$Path) + Invoke-RestMethod -Uri "https://api.modrinth.com/v2$Path" -Headers @{ 'User-Agent' = 'BrassAndSigil-Launcher/0.1 (matt@sijbers.uk)' } +} + +function Get-LatestModrinthVersion { + param([string]$Slug, [bool]$AllowBeta) + $encGv = [System.Web.HttpUtility]::UrlEncode('["' + $MinecraftVersion + '"]') + $encL = [System.Web.HttpUtility]::UrlEncode('["' + $LoaderType + '"]') + $versions = Invoke-Modrinth ("/project/$Slug/version?game_versions=$encGv" + "&" + "loaders=$encL") + if (-not $versions -or $versions.Count -eq 0) { return $null } + if ($AllowBeta) { + # Take the newest version regardless of stability (Modrinth orders newest first). + return $versions[0] + } + # Stable-only: latest release version, or null if there's no release at all. + return $versions | Where-Object { $_.version_type -eq 'release' } | Select-Object -First 1 +} + +$lockedMods = @() +$missing = @() + +Write-Host "" +Write-Host "Querying Modrinth for $($modrinthMods.Count) mods (MC $MinecraftVersion / $LoaderType)..." +Write-Host "" + +foreach ($mod in $modrinthMods) { + try { + $version = Get-LatestModrinthVersion -Slug $mod.slug -AllowBeta $mod.allowBeta + } catch { + Write-Warning " [error] $($mod.slug) - $($_.Exception.Message)" + $missing += $mod.slug + continue + } + if (-not $version) { + Write-Warning " [missing] $($mod.slug) - no compatible version" + $missing += $mod.slug + continue + } + $primary = $version.files | Where-Object { $_.primary -eq $true } | Select-Object -First 1 + if (-not $primary) { $primary = $version.files[0] } + + $lockedMods += [ordered]@{ + source = "modrinth" + slug = $mod.slug + versionId = $version.id + version = $version.version_number + path = "mods/$($primary.filename)" + url = $primary.url + sha1 = $primary.hashes.sha1 + size = $primary.size + } + + $tag = if ($version.version_type -eq 'beta') { '[beta] ' } else { '[release]' } + Write-Host (" $tag $($mod.slug.PadRight(22)) $($version.version_number.PadRight(28))") +} + +Write-Host "" +Write-Host "Hashing $($curseforgeMods.Count) CurseForge mods (manual entries)..." +$tmpDir = Join-Path $env:TEMP "brassandsigil-cf-cache" +if (-not (Test-Path $tmpDir)) { New-Item -ItemType Directory -Path $tmpDir | Out-Null } + +foreach ($cf in $curseforgeMods) { + $fname = Split-Path -Leaf $cf.path + $tmpFile = Join-Path $tmpDir $fname + try { + if (-not (Test-Path $tmpFile)) { + Invoke-WebRequest -Uri $cf.url -OutFile $tmpFile -UseBasicParsing -Headers @{ 'User-Agent' = 'BrassAndSigil-Launcher/0.1 (matt@sijbers.uk)' } + } + $sha1 = (Get-FileHash -Algorithm SHA1 -Path $tmpFile).Hash.ToLowerInvariant() + $size = (Get-Item $tmpFile).Length + + $lockedMods += [ordered]@{ + source = "curseforge" + slug = $cf.slug + fileId = $cf.fileId + version = $cf.version + path = $cf.path + url = $cf.url + sha1 = $sha1 + size = $size + } + Write-Host (" [cforge] $($cf.slug.PadRight(22)) $($cf.version)") + } + catch { + Write-Warning " [error] $fname - $($_.Exception.Message)" + $missing += $fname + } +} + +$lock = [ordered]@{ + '$schema' = "Brass-and-Sigil pack.lock.json - generated, do not edit by hand unless you know what you are doing" + name = $PackName + version = $PackVersion + minecraft = $MinecraftVersion + loader = [ordered]@{ type = $LoaderType; version = $LoaderVersion } + lockedAt = (Get-Date -Format 'o') + mods = $lockedMods +} + +$json = $lock | ConvertTo-Json -Depth 10 +[System.IO.File]::WriteAllText($lockPath, $json, [System.Text.UTF8Encoding]::new($false)) + +Write-Host "" +Write-Host "Lockfile written: $lockPath" +Write-Host (" Total mods: {0}" -f $lockedMods.Count) +if ($missing.Count -gt 0) { + Write-Warning "Missing: $($missing -join ', ')" +} +Write-Host "" +Write-Host "Run Build-Pack.ps1 next to generate the manifest." diff --git a/scripts/deploy.config.template.ps1 b/scripts/deploy.config.template.ps1 new file mode 100644 index 0000000..205922c --- /dev/null +++ b/scripts/deploy.config.template.ps1 @@ -0,0 +1,37 @@ +# Local deploy configuration. Copy this file to `deploy.config.ps1` and fill in +# real values. `deploy.config.ps1` is gitignored so your local paths and the +# server hostname never end up in version control. +# +# Deploy-Brass.ps1 dot-sources this file. Every variable below is required. + +# ─── Public file hosting ─────────────────────────────────────────────────── +# Local path that maps (via SMB or similar) to the public docroot that hosts +# `manifest.json` and the launcher .exe. Files copied here become reachable at +# the public URLs embedded in the manifest (`launcherUrl`, file URLs, etc.). +# Example: 'Z:\www\html\example.com\public\pack' +$DeployShare = 'CHANGE_ME' + +# Public URL of the deployed manifest. Used for the version-bump pre-flight: +# Deploy-Brass.ps1 fetches this before deploying so it can refuse if you +# changed pack content but forgot to bump pack/pack.lock.json's version +# (clients with a cached pack at that version would skip the sync). +$ManifestPublicUrl = 'https://CHANGE_ME/pack/manifest.json' + +# ─── Server (brass-sigil-server daemon host) ─────────────────────────────── +# user@host for the Linux box running the daemon. +$ServerSshHost = 'user@CHANGE_ME' + +# Path to the local SSH private key authorised on the server. +$ServerSshKey = "$env:USERPROFILE\.ssh\id_ed25519" + +# Absolute path on the Linux box where the brass-sigil-server binary lives. +# `Deploy-Brass.ps1` uploads to ".new" then `mv` over for atomic swap. +$ServerBinaryRemote = '/home/user/brass-sigil-server/brass-sigil-server' + +# ─── Build outputs (don't normally need to change) ───────────────────────── +$LauncherPublishDir = 'launcher\bin\Release\net8.0-windows\win-x64\publish' +$LauncherExeName = 'ModpackLauncher.exe' # what dotnet publish produces +$LauncherDeployedAs = 'BrassAndSigil-Launcher.exe' # filename on the public host + +$ServerPublishDir = 'server\bin\Release\net8.0\linux-x64\publish' +$ServerExeName = 'brass-sigil-server' diff --git a/server/Assets/icon.ico b/server/Assets/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ce26aa662bbca3dee1efcac623fc5883c2dadbb9 GIT binary patch literal 151634 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

    + /// Brings the install up to spec before launching: validates Java, accepts EULA, + /// syncs mods from the manifest, and runs the NeoForge server installer if needed. + /// Idempotent and quick when nothing needs doing. + /// + private static async Task EnsureInstalledAsync(ServerConfig config, string configPath) + { + var serverDir = Path.GetFullPath(config.ServerDir); + Directory.CreateDirectory(serverDir); + + // 0. Java version pre-flight -- MC 1.21.1 / NeoForge 21.1.x require Java 21+. + // We try in order: configured javaPath -> bundled at server/java/ -> system PATH. + // If none yield Java 21+, auto-download Adoptium Temurin JRE 21 to server/java/. + var javaInstaller = new JavaInstaller(); + var resolvedJava = await ResolveOrInstallJavaAsync(config, configPath, javaInstaller, serverDir); + if (resolvedJava is null) return false; + config.JavaPath = resolvedJava.Value.Path; + AnsiConsole.MarkupLine($"[green]✓[/] Java {resolvedJava.Value.Major} ({resolvedJava.Value.Vendor}) -- {config.JavaPath}"); + + // 1. EULA + var eulaPath = Path.Combine(serverDir, "eula.txt"); + var eulaAccepted = File.Exists(eulaPath) && File.ReadAllText(eulaPath).Contains("eula=true"); + if (!eulaAccepted && !config.AcceptEula) + { + AnsiConsole.MarkupLine("[bold]The Minecraft EULA has not been accepted yet.[/]"); + AnsiConsole.MarkupLine("Read it: [blue]https://aka.ms/MinecraftEULA[/]"); + if (Console.IsInputRedirected) + { + AnsiConsole.MarkupLine("[red]Re-run with --accept-eula or set acceptEula:true in server-config.json.[/]"); + return false; + } + if (!AnsiConsole.Confirm("Do you accept the Minecraft EULA?", false)) + { + AnsiConsole.MarkupLine("[red]EULA not accepted, exiting.[/]"); + return false; + } + config.AcceptEula = true; + config.Save(configPath); + } + if (!File.Exists(eulaPath)) + { + await File.WriteAllTextAsync(eulaPath, + "# Generated by brass-sigil-server\n" + + "# By setting eula=true you accept https://aka.ms/MinecraftEULA\n" + + "eula=true\n"); + } + + // 2. server.properties (only if missing) + var propsPath = Path.Combine(serverDir, "server.properties"); + if (!File.Exists(propsPath)) + { + if (string.IsNullOrEmpty(config.RconPassword)) + { + config.RconPassword = Convert.ToHexString(Guid.NewGuid().ToByteArray()).ToLowerInvariant(); + config.Save(configPath); + } + await File.WriteAllTextAsync(propsPath, + $"motd=Brass & Sigil\n" + + $"gamemode=survival\n" + + $"difficulty=normal\n" + + $"online-mode=true\n" + + $"white-list=true\n" + + $"enforce-whitelist=true\n" + + $"max-players=20\n" + + $"view-distance=12\n" + + $"simulation-distance=10\n" + + $"enable-rcon=true\n" + + $"rcon.port={config.RconPort}\n" + + $"rcon.password={config.RconPassword}\n" + + $"broadcast-rcon-to-ops=false\n"); + AnsiConsole.MarkupLine("[grey]Wrote default server.properties[/]"); + } + + // server-icon.png -- extract from embedded resource if missing. Survives wipes + // (lives at server root, not inside world/) and persists across pack updates. + var iconPath = Path.Combine(serverDir, "server-icon.png"); + if (!File.Exists(iconPath)) + { + try + { + using var stream = typeof(RunCommand).Assembly + .GetManifestResourceStream("BrassAndSigil.Server.Assets.server-icon.png"); + if (stream is not null) + { + await using var fs = File.Create(iconPath); + await stream.CopyToAsync(fs); + AnsiConsole.MarkupLine("[grey]Placed default server-icon.png[/]"); + } + } + catch (Exception ex) + { + AnsiConsole.MarkupLine($"[grey]Couldn't write server-icon.png: {ex.Message.EscapeMarkup()}[/]"); + } + } + + // 3. Fetch manifest + sync mods + AnsiConsole.MarkupLine("[bold]Checking modpack...[/]"); + var sync = new ManifestSync(); + Manifest manifest; + try + { + manifest = await sync.FetchManifestAsync(config.ManifestUrl); + } + catch (Exception ex) + { + AnsiConsole.MarkupLine($"[red]Could not fetch manifest:[/] {ex.Message.EscapeMarkup()}"); + return false; + } + + var localPackVer = ReadLocalPackVersion(serverDir); + var needsSync = !string.Equals(localPackVer, manifest.Version, StringComparison.Ordinal); + if (needsSync) + { + AnsiConsole.MarkupLine(localPackVer is null + ? $"[yellow]No pack installed yet. Syncing v{manifest.Version}...[/]" + : $"[yellow]Pack v{localPackVer} -> v{manifest.Version}, syncing...[/]"); + var progress = new Progress(msg => AnsiConsole.MarkupLine($" [grey]{msg.EscapeMarkup()}[/]")); + try + { + var result = await sync.SyncAsync(config.ManifestUrl, serverDir, progress); + AnsiConsole.MarkupLine($"[green]✓[/] Pack synced: {result.Downloaded} downloaded, {result.Removed} removed, {result.Skipped} client-only skipped"); + } + catch (Exception ex) + { + AnsiConsole.MarkupLine($"[red]Sync failed:[/] {ex.Message.EscapeMarkup()}"); + return false; + } + } + else + { + AnsiConsole.MarkupLine($"[green]✓[/] Pack already at v{localPackVer}"); + } + + // 4. Loader install (NeoForge only for now) + var loader = manifest.Loader; + if (loader is not null && loader.Type.Equals("neoforge", StringComparison.OrdinalIgnoreCase)) + { + var nfInstaller = new NeoForgeInstaller(); + if (!nfInstaller.IsAlreadyInstalled(serverDir)) + { + AnsiConsole.MarkupLine($"[yellow]Installing NeoForge {loader.Version}...[/]"); + var progress = new Progress(msg => AnsiConsole.MarkupLine($" [grey]{msg.EscapeMarkup()}[/]")); + var success = await nfInstaller.InstallAsync(loader.Version, serverDir, config.JavaPath, progress, default); + if (!success) + { + AnsiConsole.MarkupLine("[red]NeoForge install failed. Make sure 'java' is on PATH (or set javaPath in config).[/]"); + return false; + } + AnsiConsole.MarkupLine("[green]✓[/] NeoForge installed"); + } + else + { + AnsiConsole.MarkupLine("[green]✓[/] NeoForge already installed"); + } + } + + return true; + } + + private static async Task<(string Path, int Major, string Vendor)?> ResolveOrInstallJavaAsync( + ServerConfig config, string configPath, JavaInstaller installer, string serverDir) + { + // 1. Try the configured javaPath as-is. + var info = await GetJavaInfoAsync(config.JavaPath); + if (info is { Major: >= 21 }) return (config.JavaPath, info.Value.Major, info.Value.Vendor); + + // 2. Try a previously bundled Java at server/java/. + var bundled = installer.FindBundledJava(serverDir); + if (bundled is not null) + { + var bundledInfo = await GetJavaInfoAsync(bundled); + if (bundledInfo is { Major: >= 21 }) + { + config.JavaPath = bundled; + config.Save(configPath); + return (bundled, bundledInfo.Value.Major, bundledInfo.Value.Vendor); + } + } + + // 3. Last resort: download Adoptium Temurin JRE 21. + AnsiConsole.MarkupLine(info is null + ? $"[yellow]No Java found at '[bold]{config.JavaPath}[/]'. Auto-installing Java 21...[/]" + : $"[yellow]Found Java {info.Value.Major} ({info.Value.Vendor}) but need 21+. Auto-installing...[/]"); + + var progress = new Progress(msg => AnsiConsole.MarkupLine($" [grey]{msg.EscapeMarkup()}[/]")); + var installed = await installer.InstallJre21Async(serverDir, progress, default); + if (installed is null) + { + AnsiConsole.MarkupLine("[red]Java auto-install failed.[/] Install Java 21 manually from " + + "[blue]https://adoptium.net/temurin/releases/?version=21[/] and set " + + $"[yellow]javaPath[/] in {configPath}."); + return null; + } + + var newInfo = await GetJavaInfoAsync(installed); + if (newInfo is null || newInfo.Value.Major < 21) + { + AnsiConsole.MarkupLine("[red]Auto-installed Java didn't pass the version check.[/]"); + return null; + } + + config.JavaPath = installed; + config.Save(configPath); + return (installed, newInfo.Value.Major, newInfo.Value.Vendor); + } + + private static async Task<(int Major, string Vendor)?> GetJavaInfoAsync(string javaPath) + { + try + { + var psi = new ProcessStartInfo + { + FileName = javaPath, + Arguments = "-version", + RedirectStandardError = true, + RedirectStandardOutput = true, + UseShellExecute = false, + CreateNoWindow = true, + }; + var proc = Process.Start(psi); + if (proc is null) return null; + var stderr = await proc.StandardError.ReadToEndAsync(); + var stdout = await proc.StandardOutput.ReadToEndAsync(); + await proc.WaitForExitAsync(); + var output = stderr + "\n" + stdout; + + // First line is typically: openjdk version "21.0.7" 2025-... LTS + // or: java version "1.8.0_261" + var verMatch = System.Text.RegularExpressions.Regex.Match(output, @"version\s+""([0-9._]+)"); + if (!verMatch.Success) return null; + var verStr = verMatch.Groups[1].Value; + int major; + if (verStr.StartsWith("1.")) + { + // Old format e.g. 1.8.0 → Java 8 + var parts = verStr.Split('.'); + major = parts.Length > 1 && int.TryParse(parts[1], out var m) ? m : 0; + } + else + { + var parts = verStr.Split('.'); + major = int.TryParse(parts[0], out var m) ? m : 0; + } + + string vendor = "OpenJDK"; + if (output.Contains("Microsoft", StringComparison.OrdinalIgnoreCase)) vendor = "Microsoft"; + else if (output.Contains("Temurin", StringComparison.OrdinalIgnoreCase)) vendor = "Temurin"; + else if (output.Contains("Zulu", StringComparison.OrdinalIgnoreCase)) vendor = "Azul Zulu"; + else if (output.Contains("Oracle", StringComparison.OrdinalIgnoreCase)) vendor = "Oracle"; + else if (output.Contains("GraalVM", StringComparison.OrdinalIgnoreCase)) vendor = "GraalVM"; + + return (major, vendor); + } + catch + { + return null; + } + } + + private static string? TrySuggestJava21OnWindows() + { + if (!OperatingSystem.IsWindows()) return null; + var roots = new[] + { + @"C:\Program Files\Java", + @"C:\Program Files\Eclipse Adoptium", + @"C:\Program Files\Microsoft", + @"C:\Program Files\Zulu", + @"C:\Program Files\BellSoft", + }; + foreach (var root in roots) + { + if (!Directory.Exists(root)) continue; + try + { + foreach (var dir in Directory.EnumerateDirectories(root)) + { + var name = Path.GetFileName(dir); + if (name.Contains("21", StringComparison.Ordinal)) + { + var javaExe = Path.Combine(dir, "bin", "java.exe"); + if (File.Exists(javaExe)) return javaExe; + } + } + } + catch { } + } + return null; + } + + private static string? ReadLocalPackVersion(string serverDir) + { + var path = Path.Combine(serverDir, "pack-version.json"); + if (!File.Exists(path)) return null; + try + { + using var doc = JsonDocument.Parse(File.ReadAllText(path)); + return doc.RootElement.TryGetProperty("version", out var v) ? v.GetString() : null; + } + catch { return null; } + } + + private static bool IsLocalhostBind(ServerConfig cfg) => + cfg.WebHost is "localhost" or "127.0.0.1" or "::1"; + + private static (int Count, string[] Names) ParsePlayerList(string rconResp) + { + var colon = rconResp.IndexOf(':'); + if (colon < 0) return (0, Array.Empty()); + var head = rconResp.Substring(0, colon); + var tail = rconResp.Substring(colon + 1).Trim(); + int count = 0; + foreach (var p in head.Split(' ')) + if (int.TryParse(p, out var n)) { count = n; break; } + var names = string.IsNullOrWhiteSpace(tail) + ? Array.Empty() + : tail.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + return (count, names); + } + + private static object? ReadPackVersion(string serverDir) + { + var path = Path.Combine(serverDir, "pack-version.json"); + if (!File.Exists(path)) return null; + try { return JsonSerializer.Deserialize(File.ReadAllText(path)); } + catch { return null; } + } + + private sealed class CommandPayload { public string? Command { get; set; } } + private sealed class NamePayload { public string? Name { get; set; } } + private sealed class PasswordPayload { public string? Password { get; set; } } + private sealed class ChangePasswordPayload { public string? Current { get; set; } public string? Next { get; set; } } + private sealed class UpdateStartPayload { public int? DelaySeconds { get; set; } } + private sealed class WipePayload { + public string? Confirm { get; set; } + public bool? Backup { get; set; } + public string? SeedMode { get; set; } // "keep" | "random" | "custom" + public string? CustomSeed { get; set; } // only used when SeedMode == "custom" + } + private sealed class BackupCreatePayload { public string? Reason { get; set; } } + private sealed class BackupNamePayload { public string? Name { get; set; } } + private sealed class BackupSchedulePayload { public string? Schedule { get; set; } public int? Keep { get; set; } } + private sealed class WhitelistRequestPayload { public string? Username { get; set; } public string? Message { get; set; } } + + private static async Task WriteSseLogAsync(HttpResponse resp, ServerProcess.LogLine line, CancellationToken ct) + { + var json = JsonSerializer.Serialize(new { t = line.At, e = line.IsError, m = line.Text }); + await resp.WriteAsync($"event: log\ndata: {json}\n\n", ct); + await resp.Body.FlushAsync(ct); + } +} diff --git a/server/Commands/SetPasswordCommand.cs b/server/Commands/SetPasswordCommand.cs new file mode 100644 index 0000000..36377a3 --- /dev/null +++ b/server/Commands/SetPasswordCommand.cs @@ -0,0 +1,44 @@ +using BrassAndSigil.Server.Models; +using Spectre.Console; +using Spectre.Console.Cli; + +namespace BrassAndSigil.Server.Commands; + +/// +/// Set or rotate the web panel admin password from the CLI. +/// Useful when first-time-setting up before exposing the panel publicly, +/// or rotating after a suspected leak without going through the panel UI. +/// +public sealed class SetPasswordCommand : Command +{ + public override int Execute(CommandContext context, BaseCommandSettings settings) + { + var config = ServerConfig.Load(settings.ConfigPath); + + if (Console.IsInputRedirected) + { + AnsiConsole.MarkupLine("[red]set-password requires an interactive terminal.[/]"); + return 1; + } + + AnsiConsole.MarkupLine("[bold]Set admin password[/]"); + if (!string.IsNullOrEmpty(config.WebPassword)) + AnsiConsole.MarkupLine("[grey]An existing password is already set; this will overwrite it.[/]"); + + string pw1, pw2; + while (true) + { + pw1 = AnsiConsole.Prompt(new TextPrompt("New password (min 8 chars):").Secret()); + if (pw1.Length < 8) { AnsiConsole.MarkupLine("[red]Too short.[/]"); continue; } + pw2 = AnsiConsole.Prompt(new TextPrompt("Confirm:").Secret()); + if (pw1 != pw2) { AnsiConsole.MarkupLine("[red]Doesn't match.[/]"); continue; } + break; + } + + config.WebPassword = pw1; + config.Save(settings.ConfigPath); + AnsiConsole.MarkupLine($"[green]✓[/] Saved to {settings.ConfigPath}."); + AnsiConsole.MarkupLine("[grey]Restart the server for the new password to take effect.[/]"); + return 0; + } +} diff --git a/server/Commands/SyncCommand.cs b/server/Commands/SyncCommand.cs new file mode 100644 index 0000000..3c00b24 --- /dev/null +++ b/server/Commands/SyncCommand.cs @@ -0,0 +1,32 @@ +using BrassAndSigil.Server.Models; +using BrassAndSigil.Server.Services; +using Spectre.Console; +using Spectre.Console.Cli; + +namespace BrassAndSigil.Server.Commands; + +public sealed class SyncCommand : AsyncCommand +{ + public override async Task ExecuteAsync(CommandContext context, BaseCommandSettings settings) + { + var config = ServerConfig.Load(settings.ConfigPath); + AnsiConsole.MarkupLine($"[bold]Syncing[/] from [blue]{config.ManifestUrl}[/]"); + AnsiConsole.MarkupLine($"[grey]Target: {Path.GetFullPath(config.ServerDir)}[/]"); + AnsiConsole.MarkupLine(""); + + var sync = new ManifestSync(); + var progress = new Progress(msg => AnsiConsole.MarkupLine($" [grey]{msg.EscapeMarkup()}[/]")); + try + { + var result = await sync.SyncAsync(config.ManifestUrl, config.ServerDir, progress); + AnsiConsole.MarkupLine(""); + AnsiConsole.MarkupLine($"[green]✓[/] pack v{result.PackVersion} | downloaded={result.Downloaded} removed={result.Removed} client-only-skipped={result.Skipped}"); + return 0; + } + catch (Exception ex) + { + AnsiConsole.MarkupLine($"[red]✗[/] {ex.Message.EscapeMarkup()}"); + return 1; + } + } +} diff --git a/server/Models/Manifest.cs b/server/Models/Manifest.cs new file mode 100644 index 0000000..63d184f --- /dev/null +++ b/server/Models/Manifest.cs @@ -0,0 +1,62 @@ +using System.Text.Json.Serialization; + +namespace BrassAndSigil.Server.Models; + +public sealed class Manifest +{ + [JsonPropertyName("name")] + public string? Name { get; set; } + + [JsonPropertyName("version")] + public string? Version { get; set; } + + [JsonPropertyName("minecraft")] + public MinecraftSpec Minecraft { get; set; } = new(); + + [JsonPropertyName("loader")] + public LoaderSpec? Loader { get; set; } + + [JsonPropertyName("files")] + public List Files { get; set; } = new(); +} + +public sealed class MinecraftSpec +{ + [JsonPropertyName("version")] public string Version { get; set; } = ""; +} + +public sealed class LoaderSpec +{ + [JsonPropertyName("type")] public string Type { get; set; } = "vanilla"; + [JsonPropertyName("version")] public string Version { get; set; } = ""; +} + +public sealed class ManifestFile +{ + [JsonPropertyName("path")] public string Path { get; set; } = ""; + [JsonPropertyName("url")] public string Url { get; set; } = ""; + [JsonPropertyName("sha1")] public string? Sha1 { get; set; } + [JsonPropertyName("size")] public long? Size { get; set; } +} + +public sealed class PackLock +{ + [JsonPropertyName("name")] public string Name { get; set; } = ""; + [JsonPropertyName("version")] public string Version { get; set; } = ""; + [JsonPropertyName("minecraft")] public string Minecraft { get; set; } = ""; + [JsonPropertyName("loader")] public LoaderSpec Loader { get; set; } = new(); + [JsonPropertyName("mods")] public List Mods { get; set; } = new(); +} + +public sealed class LockedMod +{ + [JsonPropertyName("source")] public string Source { get; set; } = ""; + [JsonPropertyName("slug")] public string? Slug { get; set; } + [JsonPropertyName("versionId")] public string? VersionId { get; set; } + [JsonPropertyName("fileId")] public string? FileId { get; set; } + [JsonPropertyName("version")] public string Version { get; set; } = ""; + [JsonPropertyName("path")] public string Path { get; set; } = ""; + [JsonPropertyName("url")] public string Url { get; set; } = ""; + [JsonPropertyName("sha1")] public string Sha1 { get; set; } = ""; + [JsonPropertyName("size")] public long Size { get; set; } +} diff --git a/server/Models/ServerConfig.cs b/server/Models/ServerConfig.cs new file mode 100644 index 0000000..e0c39c7 --- /dev/null +++ b/server/Models/ServerConfig.cs @@ -0,0 +1,77 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using BrassAndSigil.Server.Services; + +namespace BrassAndSigil.Server.Models; + +public sealed class ServerConfig +{ + [JsonPropertyName("manifestUrl")] + public string ManifestUrl { get; set; } = "https://sijbers.uk/pack/manifest.json"; + + [JsonPropertyName("serverDir")] + public string ServerDir { get; set; } = "./server"; + + [JsonPropertyName("javaPath")] + public string JavaPath { get; set; } = "java"; + + [JsonPropertyName("memoryMB")] + public int MemoryMB { get; set; } = 8192; + + [JsonPropertyName("webPort")] + public int WebPort { get; set; } = 8080; + + /// "localhost" by default -- bind to 0.0.0.0 only behind a reverse proxy. + [JsonPropertyName("webHost")] + public string WebHost { get; set; } = "localhost"; + + /// Shared password for web UI. Required if WebHost is not localhost. + [JsonPropertyName("webPassword")] + public string? WebPassword { get; set; } + + /// Where world backups land. Empty -> <serverDir>/../backups. Set to a + /// large/slower drive on real deployments -- backups grow over time. + [JsonPropertyName("backupDir")] + public string? BackupDir { get; set; } + + /// Auto-rotation: keep this many most recent backups, delete older. + [JsonPropertyName("backupKeep")] + public int BackupKeep { get; set; } = 10; + + /// Daily auto-backup time as "HH:mm" (24-hour, server-local). Null/empty disables. + [JsonPropertyName("backupSchedule")] + public string? BackupSchedule { get; set; } + + /// + /// Where BlueMap CLI's working dir lives (cli.jar, configs, render output). + /// Empty -> alongside <serverDir>/.. (default ~/brass-sigil-server/bluemap). + /// Set to a big-disk path on real deployments -- rendered output for a 5000-block + /// world is several GB. + /// + [JsonPropertyName("bluemapDir")] + public string? BlueMapDir { get; set; } + + [JsonPropertyName("rconPort")] + public int RconPort { get; set; } = 25575; + + [JsonPropertyName("rconPassword")] + public string RconPassword { get; set; } = ""; + + [JsonPropertyName("acceptEula")] + public bool AcceptEula { get; set; } = false; + + public static ServerConfig Load(string path) + { + if (!File.Exists(path)) return new ServerConfig(); + var json = File.ReadAllText(path); + return JsonSerializer.Deserialize(json, JsonOpts.CaseInsensitive) ?? new ServerConfig(); + } + + public void Save(string path) + { + var dir = Path.GetDirectoryName(Path.GetFullPath(path)); + if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) Directory.CreateDirectory(dir); + var json = JsonSerializer.Serialize(this, JsonOpts.Pretty); + File.WriteAllText(path, json); + } +} diff --git a/server/Program.cs b/server/Program.cs new file mode 100644 index 0000000..420b58f --- /dev/null +++ b/server/Program.cs @@ -0,0 +1,52 @@ +using BrassAndSigil.Server.Commands; +using Spectre.Console; +using Spectre.Console.Cli; + +// Detect interactive double-click on Windows so we can hold the console open at exit +// (otherwise the window vanishes before the user can read errors). +var interactive = !Console.IsInputRedirected && OperatingSystem.IsWindows(); + +var app = new CommandApp(); +app.Configure(config => +{ + config.SetApplicationName("brass-sigil-server"); + config.SetApplicationVersion("0.1.0"); + + config.AddCommand("install") + .WithDescription("Force a fresh setup: download mods + run the NeoForge installer."); + + config.AddCommand("sync") + .WithDescription("Update mods to match the current manifest. Server should be stopped first."); + + config.AddCommand("run") + .WithDescription("Run the server daemon (auto-installs anything missing, then serves the web UI).") + .WithAlias("start"); + + config.AddCommand("check") + .WithDescription("Verify install: dependencies, EULA, manifest reachability."); + + config.AddCommand("set-password") + .WithDescription("Set or rotate the web panel admin password."); +}); + +int result; +try +{ + result = await app.RunAsync(args); +} +catch (Exception ex) +{ + AnsiConsole.WriteException(ex, ExceptionFormats.ShortenEverything); + result = 1; +} + +// Hold the console open at exit only when an error occurred during interactive use. +// Successful daemon termination (Ctrl+C, /api/server/stop) closes cleanly. +if (interactive && result != 0) +{ + AnsiConsole.MarkupLine(""); + AnsiConsole.MarkupLine("[grey]Press any key to close...[/]"); + Console.ReadKey(intercept: true); +} + +return result; diff --git a/server/Services/BackupScheduler.cs b/server/Services/BackupScheduler.cs new file mode 100644 index 0000000..45d240b --- /dev/null +++ b/server/Services/BackupScheduler.cs @@ -0,0 +1,202 @@ +using System.Text.RegularExpressions; +using BrassAndSigil.Server.Models; + +namespace BrassAndSigil.Server.Services; + +/// +/// Auto-backup driven by config.BackupSchedule. Accepted formats: +/// - "HH:mm" single daily slot (e.g. "04:00") +/// - "HH:mm,HH:mm,..." multiple daily slots +/// - "every Nh" every N hours (>= 15 minutes) +/// - "every Nm" every N minutes +/// Wakes once a minute and fires backups when the clock matches the spec. +/// Doesn't catch up if the server was off when a slot passed -- daily/interval +/// backups don't need replay logic. +/// +public sealed class BackupScheduler : IDisposable +{ + private readonly ServerConfig _config; + private readonly BackupService _backup; + private readonly Action _log; + private CancellationTokenSource? _cts; + private Task? _loop; + + // Tracking for "fired" state. For interval: just the last fire time. For + // daily-times: which times have fired today, reset at day rollover. + private DateTimeOffset? _lastIntervalFire; + private DateOnly _lastFireDay = DateOnly.MinValue; + private readonly HashSet _firedToday = new(); + + public BackupScheduler(ServerConfig config, BackupService backup, Action log) + { + _config = config; + _backup = backup; + _log = log; + } + + public void Start() + { + if (string.IsNullOrWhiteSpace(_config.BackupSchedule)) return; + if (Parse(_config.BackupSchedule) == default) + { + _log($"[backup-scheduler] Invalid backupSchedule '{_config.BackupSchedule}'. Expected 'HH:mm', 'HH:mm,HH:mm', or 'every Nh'/'every Nm'. Disabled."); + return; + } + _cts?.Cancel(); + _cts = new CancellationTokenSource(); + _loop = Task.Run(() => RunAsync(_cts.Token)); + _log($"[backup-scheduler] Schedule active: {Describe()}"); + } + + /// Stop the current loop and re-Start with the latest config values. + public void Reload() + { + try { _cts?.Cancel(); _loop?.Wait(TimeSpan.FromSeconds(2)); } catch { } + _cts?.Dispose(); + _cts = null; + _loop = null; + Start(); + } + + /// Compute the next future scheduled fire time. Null if no schedule. + public DateTimeOffset? NextRun() + { + var (interval, times) = Parse(_config.BackupSchedule); + if (interval.HasValue) + { + var baseTime = _lastIntervalFire ?? DateTimeOffset.UtcNow.AddSeconds(-1); + var next = baseTime + interval.Value; + // If we've never fired and we're past the implied first slot, "next" might be + // in the past -- clamp to "imminent" by using now + small buffer. + if (next <= DateTimeOffset.UtcNow) next = DateTimeOffset.UtcNow.AddMinutes(1); + return next.ToLocalTime(); + } + if (times is not null) + { + var now = DateTime.Now; + var nowTime = TimeOnly.FromDateTime(now); + // Use Cast().FirstOrDefault() so "no pending" is null rather than 00:00. + var pendingToday = times + .Where(t => t > nowTime && !_firedToday.Contains(t)) + .OrderBy(t => t) + .Cast() + .FirstOrDefault(); + if (pendingToday.HasValue) + return new DateTimeOffset(now.Date.Add(pendingToday.Value.ToTimeSpan())); + // None left today -- first slot tomorrow. + var firstTomorrow = times.Min(); + return new DateTimeOffset(now.Date.AddDays(1).Add(firstTomorrow.ToTimeSpan())); + } + return null; + } + + private async Task RunAsync(CancellationToken ct) + { + while (!ct.IsCancellationRequested) + { + try { await Task.Delay(TimeSpan.FromMinutes(1), ct); } + catch (OperationCanceledException) { break; } + + var (interval, times) = Parse(_config.BackupSchedule); + if (interval is null && times is null) continue; + + var nowUtc = DateTimeOffset.UtcNow; + var nowLocal = DateTime.Now; + var today = DateOnly.FromDateTime(nowLocal); + var nowTime = TimeOnly.FromDateTime(nowLocal); + + bool shouldFire = false; + if (interval.HasValue) + { + shouldFire = !_lastIntervalFire.HasValue + || (nowUtc - _lastIntervalFire.Value) >= interval.Value; + } + else if (times is not null) + { + if (today != _lastFireDay) + { + _firedToday.Clear(); + _lastFireDay = today; + } + foreach (var t in times) + { + if (t <= nowTime && !_firedToday.Contains(t)) + { + shouldFire = true; + _firedToday.Add(t); + break; + } + } + } + + if (!shouldFire) continue; + + _log("[backup-scheduler] Triggering scheduled backup."); + try + { + var result = await _backup.CreateAsync("scheduled", ct: ct); + if (result.Ok) _log($"[backup-scheduler] Done: {result.Name} ({result.SizeBytes / (1024 * 1024)} MB)."); + else _log($"[backup-scheduler] Failed: {result.Error}"); + if (interval.HasValue) _lastIntervalFire = nowUtc; + } + catch (OperationCanceledException) { break; } + catch (Exception ex) { _log($"[backup-scheduler] Exception: {ex.Message}"); } + } + } + + /// Returns (interval, times) -- exactly one will be non-null on success, or (null,null) for invalid/empty. + private static (TimeSpan? Interval, TimeOnly[]? Times) Parse(string? input) + { + if (string.IsNullOrWhiteSpace(input)) return (null, null); + var s = input.Trim().ToLowerInvariant(); + + // every Nh / every Nm + var m = Regex.Match(s, @"^every\s+(\d+)\s*(h|hr|hrs|hour|hours|m|min|mins|minute|minutes)$"); + if (m.Success) + { + var n = int.Parse(m.Groups[1].Value); + var unit = m.Groups[2].Value; + var span = unit.StartsWith("h") ? TimeSpan.FromHours(n) : TimeSpan.FromMinutes(n); + // Sanity floor -- anything below 15 min creates more save-lag than backups are worth. + if (span < TimeSpan.FromMinutes(15)) return (null, null); + if (span > TimeSpan.FromDays(7)) return (null, null); + return (span, null); + } + + // Comma-separated HH:mm + var list = new List(); + foreach (var tok in s.Split(',', StringSplitOptions.RemoveEmptyEntries)) + { + if (!TimeOnly.TryParse(tok.Trim(), out var t)) return (null, null); + list.Add(t); + } + return list.Count == 0 ? (null, null) : (null, list.OrderBy(t => t).ToArray()); + } + + public string Describe() + { + var (interval, times) = Parse(_config.BackupSchedule); + if (interval.HasValue) + { + var totalMin = (int)interval.Value.TotalMinutes; + if (totalMin >= 60 && totalMin % 60 == 0) + { + var h = totalMin / 60; + return h == 1 ? "Every hour" : $"Every {h} hours"; + } + return totalMin == 1 ? "Every minute" : $"Every {totalMin} minutes"; + } + if (times is not null) + { + if (times.Length == 1) return $"Daily at {times[0]:HH\\:mm}"; + return "Daily at " + string.Join(", ", times.Select(t => t.ToString("HH:mm"))); + } + return "Disabled"; + } + + public void Dispose() + { + try { _cts?.Cancel(); _loop?.Wait(TimeSpan.FromSeconds(2)); } catch { } + _cts?.Dispose(); + } +} diff --git a/server/Services/BackupService.cs b/server/Services/BackupService.cs new file mode 100644 index 0000000..4085b23 --- /dev/null +++ b/server/Services/BackupService.cs @@ -0,0 +1,257 @@ +using System.IO.Compression; +using BrassAndSigil.Server.Models; + +namespace BrassAndSigil.Server.Services; + +/// +/// World backups: ZIP the level-name dir into a separate (typically slower-but-bigger) +/// backup directory. Online backups via /save-all flush + /save-off while the server is +/// running mean players don't see downtime -- just a brief save lag. +/// +public sealed class BackupService +{ + private readonly ServerConfig _config; + private readonly ServerProcess _proc; + private readonly Broadcaster _broadcast; + private readonly Action _log; + private readonly SemaphoreSlim _gate = new(1, 1); + + public BackupService(ServerConfig config, ServerProcess proc, Broadcaster broadcast, Action log) + { + _config = config; + _proc = proc; + _broadcast = broadcast; + _log = log; + } + + public sealed record BackupInfo(string Name, long SizeBytes, DateTimeOffset CreatedAt); + public sealed record CreateResult(bool Ok, string? Name, long SizeBytes, string? Error); + + public string BackupDir => ResolveBackupDir(); + + public List List() + { + var dir = BackupDir; + if (!Directory.Exists(dir)) return new(); + return Directory.EnumerateFiles(dir, "*.zip") + .Select(p => + { + var fi = new FileInfo(p); + return new BackupInfo(fi.Name, fi.Length, new DateTimeOffset(fi.CreationTimeUtc, TimeSpan.Zero)); + }) + .OrderByDescending(b => b.CreatedAt) + .ToList(); + } + + /// + /// Create a ZIP backup of the world dir. Online (no shutdown) when the server is + /// running. + /// + /// = false (default): just save-off + brief drain + + /// ZIP + save-on. Near-zero player-visible lag. Backup captures state up to + /// MC's last autosave (within ~5 min) -- fine for hourly snapshots. + /// + /// + /// = true: also runs save-all flush first, which + /// synchronously serialises every loaded chunk before the ZIP. Captures state up + /// to NOW. Causes a tick spike of seconds-to-tens-of-seconds depending on world + /// size. Used only for irreversible operations (pre-wipe) where freshness matters. + /// + /// + public async Task CreateAsync(string? reason = null, bool flush = false, CancellationToken ct = default) + { + if (!await _gate.WaitAsync(0, ct)) + return new CreateResult(false, null, 0, "Another backup is already in progress."); + + var dir = ResolveBackupDir(); + try + { + Directory.CreateDirectory(dir); + } + catch (Exception ex) + { + _gate.Release(); + return new CreateResult(false, null, 0, $"Couldn't create backup dir '{dir}': {ex.Message}"); + } + + var levelName = ReadLevelName(_config.ServerDir) ?? "world"; + var worldDir = Path.Combine(_config.ServerDir, levelName); + if (!Directory.Exists(worldDir)) + { + _gate.Release(); + return new CreateResult(false, null, 0, $"World directory not found at '{worldDir}'."); + } + + var stamp = DateTime.UtcNow.ToString("yyyyMMdd-HHmmss"); + var slug = string.IsNullOrWhiteSpace(reason) ? "" : "-" + Slugify(reason); + var name = $"{levelName}-{stamp}{slug}.zip"; + var path = Path.Combine(dir, name); + + var serverRunning = _proc.IsRunning; + try + { + if (serverRunning) + { + if (flush) + { + // Loud path: fresh state, but pays the tick spike. Tell players. + try { await _broadcast.SayAsync("Saving world for backup (brief lag possible)...", ct); } catch { } + _log("[backup] save-all flush"); + await _proc.SendInputAsync("save-all flush", ct); + await Task.Delay(2500, ct); + } + _log("[backup] save-off"); + await _proc.SendInputAsync("save-off", ct); + // Brief drain so any save tasks already enqueued can finish before we + // start reading from disk for the ZIP. + await Task.Delay(500, ct); + } + + _log($"[backup] Archiving {worldDir} -> {name}"); + // Run on a worker thread so the request thread doesn't block on disk I/O. + await Task.Run(() => + ZipFile.CreateFromDirectory(worldDir, path, CompressionLevel.Fastest, includeBaseDirectory: false), ct); + + var size = new FileInfo(path).Length; + _log($"[backup] Created {name} ({size / (1024 * 1024)} MB)."); + // No completion broadcast for silent path -- backup was invisible to players, + // no need to tell them it finished. Loud path is wipe-only and the wipe + // sequence has its own messaging. + + RotateOldest(dir, _config.BackupKeep); + + return new CreateResult(true, name, size, null); + } + catch (Exception ex) + { + _log($"[backup] Failed: {ex.Message}"); + try { File.Delete(path); } catch { } // partial archive + return new CreateResult(false, null, 0, ex.Message); + } + finally + { + try + { + if (serverRunning && _proc.IsRunning) + { + _log("[backup] save-on"); + await _proc.SendInputAsync("save-on"); + } + } + catch { } + _gate.Release(); + } + } + + /// + /// Stop the server, move the current world out of the way as a "pre-restore" safety + /// copy, extract the chosen archive, restart. + /// + public async Task<(bool Ok, string? Error)> RestoreAsync(string backupName, CancellationToken ct = default) + { + if (!await _gate.WaitAsync(0, ct)) + return (false, "Another backup operation is already in progress."); + + try + { + var dir = ResolveBackupDir(); + var path = Path.Combine(dir, Path.GetFileName(backupName)); + if (!File.Exists(path)) return (false, $"Backup '{backupName}' not found."); + + var levelName = ReadLevelName(_config.ServerDir) ?? "world"; + var worldDir = Path.Combine(_config.ServerDir, levelName); + + if (_proc.IsRunning) + { + _log("[restore] Stopping server before restore..."); + await _proc.StopAsync(TimeSpan.FromSeconds(30), ct); + } + + // Always preserve the current world as a pre-restore snapshot in case the + // chosen archive is corrupt or wrong. + if (Directory.Exists(worldDir)) + { + var preRestore = $"{worldDir}-prerestore-{DateTime.UtcNow:yyyyMMddHHmmss}"; + _log($"[restore] Moving current world to {Path.GetFileName(preRestore)}"); + Directory.Move(worldDir, preRestore); + } + + _log($"[restore] Extracting {backupName}"); + Directory.CreateDirectory(worldDir); + await Task.Run(() => ZipFile.ExtractToDirectory(path, worldDir, overwriteFiles: true), ct); + + _log("[restore] Starting server."); + _proc.Start(); + return (true, null); + } + catch (Exception ex) + { + _log($"[restore] Failed: {ex.Message}"); + try { if (!_proc.IsRunning) _proc.Start(); } catch { } + return (false, ex.Message); + } + finally + { + _gate.Release(); + } + } + + public (bool Ok, string? Error) Delete(string backupName) + { + try + { + var path = Path.Combine(ResolveBackupDir(), Path.GetFileName(backupName)); + if (!File.Exists(path)) return (false, $"Backup '{backupName}' not found."); + File.Delete(path); + return (true, null); + } + catch (Exception ex) { return (false, ex.Message); } + } + + private string ResolveBackupDir() + { + if (!string.IsNullOrWhiteSpace(_config.BackupDir)) + return Path.GetFullPath(_config.BackupDir); + // Default: sibling of serverDir so it survives server-dir wipes. + var serverFull = Path.GetFullPath(_config.ServerDir); + var parent = Path.GetDirectoryName(serverFull) ?? serverFull; + return Path.Combine(parent, "backups"); + } + + private static void RotateOldest(string dir, int keep) + { + if (keep <= 0) return; + try + { + var zips = Directory.EnumerateFiles(dir, "*.zip") + .Select(p => new FileInfo(p)) + .OrderByDescending(fi => fi.CreationTimeUtc) + .ToList(); + foreach (var old in zips.Skip(keep)) + { + try { old.Delete(); } + catch { /* best-effort */ } + } + } + catch { } + } + + private static string? ReadLevelName(string serverDir) + { + var path = Path.Combine(serverDir, "server.properties"); + if (!File.Exists(path)) return null; + foreach (var line in File.ReadAllLines(path)) + { + if (line.StartsWith("level-name=", StringComparison.Ordinal)) + return line.Substring("level-name=".Length).Trim(); + } + return null; + } + + private static string Slugify(string s) + { + var chars = s.Where(c => char.IsLetterOrDigit(c) || c == '-' || c == '_').ToArray(); + var slug = new string(chars).ToLowerInvariant(); + return slug.Length > 32 ? slug.Substring(0, 32) : slug; + } +} diff --git a/server/Services/BlueMapPlayers.cs b/server/Services/BlueMapPlayers.cs new file mode 100644 index 0000000..3dce88f --- /dev/null +++ b/server/Services/BlueMapPlayers.cs @@ -0,0 +1,145 @@ +using System.Globalization; +using System.Security.Cryptography; +using System.Text; +using System.Text.Json; +using System.Text.RegularExpressions; + +namespace BrassAndSigil.Server.Services; + +/// +/// On-demand snapshot of online players + positions, formatted for BlueMap's +/// live player overlay. Pull-based: the BlueMap web UI polls a JSON file at +/// /map/maps/overworld/live/players.json roughly every 2 s, and the +/// daemon intercepts that path and calls per +/// request. Closed tab = no requests = no RCON calls -- same model as +/// /api/players, no server-side timer to manage. +/// +public static class BlueMapPlayers +{ + public static async Task> SnapshotAsync(RconManager rcon, string serverDir, CancellationToken ct) + { + var listResp = await rcon.SendCommandAsync("list", ct); + // Format: "There are N of a max of M players online: name1, name2, ..." + var colon = listResp.IndexOf(':'); + var names = colon < 0 + ? Array.Empty() + : listResp.Substring(colon + 1) + .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + var result = new List(); + foreach (var name in names) + { + ct.ThrowIfCancellationRequested(); + try + { + var posResp = await rcon.SendCommandAsync($"data get entity {name} Pos", ct); + var pos = ParseDoubleTriple(posResp); + if (pos is null) continue; + var rotResp = await rcon.SendCommandAsync($"data get entity {name} Rotation", ct); + var rot = ParseFloatPair(rotResp); + + result.Add(new + { + uuid = ResolveUuid(serverDir, name), + name, + foreign = false, + position = new { x = pos.Value.x, y = pos.Value.y, z = pos.Value.z }, + rotation = new { pitch = rot?.pitch ?? 0, yaw = rot?.yaw ?? 0, roll = 0.0 }, + }); + } + catch + { + // One bad player shouldn't drop the rest of the list. + } + } + return result; + } + + // ── UUID resolution ────────────────────────────────────────────────────── + // BlueMap uses the UUID for two things: marker identity across polls (so a + // changing UUID makes the marker flash on/off as it thinks the player keeps + // leaving and rejoining) and skin lookup against Mojang's profile API. We + // need the *real* Mojang UUID to satisfy both -- MC writes name→uuid pairs + // into /usercache.json after each successful auth. We cache that + // file's contents in memory and reload on mtime change, since usercache + // updates rarely (player join, periodic refresh). + private sealed class UserCacheEntry + { + public string? Name { get; set; } + public string? Uuid { get; set; } + } + + private static readonly object _cacheLock = new(); + private static Dictionary? _cache; // case-insensitive name → uuid + private static DateTime _cacheLoadedAt = DateTime.MinValue; + private static string? _cachePath; + + private static string ResolveUuid(string serverDir, string name) + { + var path = Path.Combine(Path.GetFullPath(serverDir), "usercache.json"); + lock (_cacheLock) + { + if (File.Exists(path)) + { + var mtime = File.GetLastWriteTimeUtc(path); + if (_cache is null || _cachePath != path || mtime > _cacheLoadedAt) + { + try + { + var json = File.ReadAllText(path); + var entries = JsonSerializer.Deserialize(json, JsonOpts.CaseInsensitive); + var dict = new Dictionary(StringComparer.OrdinalIgnoreCase); + if (entries is not null) + foreach (var e in entries) + if (!string.IsNullOrEmpty(e.Name) && !string.IsNullOrEmpty(e.Uuid)) + dict[e.Name] = e.Uuid; + _cache = dict; + _cachePath = path; + _cacheLoadedAt = mtime; + } + catch + { + // Corrupt usercache shouldn't take down the marker -- fall through. + } + } + } + if (_cache is not null && _cache.TryGetValue(name, out var uuid)) return uuid; + } + + // Fallback when usercache hasn't been written yet (very early after + // first auth) or has been wiped: deterministic UUID derived from the + // name. Stable across polls so the marker doesn't flash; skin lookup + // will 404 against Mojang and BlueMap will show a default head. + return DeriveStableUuid(name).ToString(); + } + + private static Guid DeriveStableUuid(string name) + { + var bytes = SHA1.HashData(Encoding.UTF8.GetBytes("brass-sigil:" + name.ToLowerInvariant())); + var guidBytes = new byte[16]; + Array.Copy(bytes, guidBytes, 16); + return new Guid(guidBytes); + } + + // Parse a NBT-style double triple like "[123.4d, 64.0d, -56.7d]" out of an + // RCON `data get` response. + private static (double x, double y, double z)? ParseDoubleTriple(string resp) + { + var m = Regex.Match(resp, @"\[([\-\d\.]+)d?,\s*([\-\d\.]+)d?,\s*([\-\d\.]+)d?\]"); + if (!m.Success) return null; + if (!double.TryParse(m.Groups[1].Value, NumberStyles.Float, CultureInfo.InvariantCulture, out var x)) return null; + if (!double.TryParse(m.Groups[2].Value, NumberStyles.Float, CultureInfo.InvariantCulture, out var y)) return null; + if (!double.TryParse(m.Groups[3].Value, NumberStyles.Float, CultureInfo.InvariantCulture, out var z)) return null; + return (x, y, z); + } + + // Rotation comes as `[yaw, pitch]` in floats. + private static (double pitch, double yaw)? ParseFloatPair(string resp) + { + var m = Regex.Match(resp, @"\[([\-\d\.]+)f?,\s*([\-\d\.]+)f?\]"); + if (!m.Success) return null; + if (!double.TryParse(m.Groups[1].Value, NumberStyles.Float, CultureInfo.InvariantCulture, out var yaw)) return null; + if (!double.TryParse(m.Groups[2].Value, NumberStyles.Float, CultureInfo.InvariantCulture, out var pitch)) return null; + return (pitch, yaw); + } +} diff --git a/server/Services/BlueMapService.cs b/server/Services/BlueMapService.cs new file mode 100644 index 0000000..8f519d7 --- /dev/null +++ b/server/Services/BlueMapService.cs @@ -0,0 +1,321 @@ +using System.Diagnostics; +using BrassAndSigil.Server.Models; + +namespace BrassAndSigil.Server.Services; + +/// +/// Wraps BlueMap CLI as an out-of-process renderer. +/// +/// The CLI jar is downloaded from GitHub releases on first render (mirrors the +/// JavaInstaller pattern -- keeps the brass-sigil-server binary lean and lets +/// BlueMap update independently). BlueMap 5.20+ requires Java 25, so we also +/// auto-install Adoptium Temurin JRE 25 alongside the JRE 21 we use for MC. +/// +/// Renders are kicked off manually from the panel and produce static HTML/JS/PNG +/// output served at /map/. Zero impact on the running MC server (separate JVM, +/// separate memory pool -- only competes for disk I/O during render). +/// +public sealed class BlueMapService : IDisposable +{ + private const string BlueMapVersion = "5.20"; + private const string BlueMapJarUrl = + "https://github.com/BlueMap-Minecraft/BlueMap/releases/download/v" + + BlueMapVersion + "/bluemap-" + BlueMapVersion + "-cli.jar"; + private const int BlueMapJavaVersion = 25; + private static readonly HttpClient _http = new() { Timeout = TimeSpan.FromMinutes(10) }; + + private readonly ServerConfig _config; + private readonly Action _log; + private readonly SemaphoreSlim _gate = new(1, 1); + + private Process? _renderProc; + public sealed class RenderState + { + public bool InProgress { get; set; } + public string Phase { get; set; } = "idle"; + // "idle" | "extracting" | "configuring" | "rendering" | "complete" | "failed" + public string? Error { get; set; } + public DateTimeOffset? StartedAt { get; set; } + public DateTimeOffset? FinishedAt { get; set; } + public int? ExitCode { get; set; } + public string? LastLogLine { get; set; } + } + public RenderState State { get; private set; } = new(); + + public string RootDir + { + get + { + // Configured override (e.g. /mnt/md0p1/brass-sigil/bluemap) wins. Default + // is sibling of serverDir so it doesn't bloat the world dir or the + // server install -- typically ~/brass-sigil-server/bluemap. + if (!string.IsNullOrWhiteSpace(_config.BlueMapDir)) + return Path.GetFullPath(_config.BlueMapDir); + var serverFull = Path.GetFullPath(_config.ServerDir); + var parent = Path.GetDirectoryName(serverFull) ?? serverFull; + return Path.Combine(parent, "bluemap"); + } + } + public string CliJarPath => Path.Combine(RootDir, "cli.jar"); + public string WebDir => Path.Combine(RootDir, "web"); + public string ConfigDir => Path.Combine(RootDir, "config"); + + public BlueMapService(ServerConfig config, Action log) + { + _config = config; + _log = log; + } + + public bool HasRendered => Directory.Exists(WebDir) && + File.Exists(Path.Combine(WebDir, "index.html")); + + /// Kick off a render in the background. Returns false if one is already running. + public bool StartRender() + { + if (!_gate.Wait(0)) return false; + State = new RenderState { InProgress = true, Phase = "extracting", StartedAt = DateTimeOffset.UtcNow }; + _ = Task.Run(RenderAsync); + return true; + } + + /// + /// Cancel an in-progress render by killing the BlueMap process. State on disk + /// is preserved, so the next render resumes from where this one stopped. + /// + public bool CancelRender() + { + if (!State.InProgress) return false; + try + { + // Kill the whole process tree (the BlueMap CLI may spawn worker JVMs + // for parallel rendering). entireProcessTree=true on Linux uses + // process group; on Windows it walks the tree via Job Objects. + _renderProc?.Kill(entireProcessTree: true); + State.Phase = "cancelled"; + State.Error = "Cancelled by user."; + _log("[bluemap] Render cancelled by user."); + return true; + } + catch (Exception ex) + { + _log($"[bluemap] Cancel failed: {ex.Message}"); + return false; + } + } + + /// + /// Delete rendered map output + render state. Used after a world wipe -- the + /// old tiles reference terrain that no longer exists. Preserves cli.jar and + /// configs so a follow-up Render still works (and skips re-download + + /// re-config). Returns true if anything was deleted. + /// + public bool ClearRenderOutput() + { + var dataDir = Path.Combine(RootDir, "data"); + var mapsDir = Path.Combine(RootDir, "web", "maps"); + var anyDeleted = false; + try + { + if (Directory.Exists(dataDir)) { Directory.Delete(dataDir, true); anyDeleted = true; _log("[bluemap] Cleared render state."); } + if (Directory.Exists(mapsDir)) { Directory.Delete(mapsDir, true); anyDeleted = true; _log("[bluemap] Cleared rendered tiles."); } + } + catch (Exception ex) { _log($"[bluemap] Couldn't clear output: {ex.Message}"); } + return anyDeleted; + } + + /// + /// Called when brass-sigil-server itself shuts down -- kill any in-flight + /// BlueMap process so it doesn't orphan to PID 1 and keep eating CPU after + /// the daemon's gone. Render state on disk is preserved; next start can + /// resume the render exactly where this one was killed. + /// + public void Dispose() + { + try + { + if (_renderProc is { HasExited: false }) + { + _renderProc.Kill(entireProcessTree: true); + _renderProc.WaitForExit(2000); + } + } + catch { } + _renderProc?.Dispose(); + _gate.Dispose(); + } + + private async Task RenderAsync() + { + try + { + Directory.CreateDirectory(RootDir); + + State.Phase = "downloading"; + await DownloadJarIfMissingAsync(); + + // BlueMap 5.20 needs Java 25; our MC server runs Java 21. Maintain a + // separate JRE 25 install for BlueMap only. + var bluemapJava = await EnsureJava25Async(); + if (bluemapJava is null) throw new InvalidOperationException("Couldn't install JRE 25 for BlueMap."); + + // First run: BlueMap with no config writes default configs and exits. + // We need to (a) run it once to seed configs, (b) patch the world path, + // (c) re-run with -r to actually render. + State.Phase = "configuring"; + EnsureConfig(bluemapJava); + + State.Phase = "rendering"; + // -r = render. --mods = pull textures from mod jars so Create + // blocks etc. show real colours instead of magenta/grey fallback. + var modsDir = Path.Combine(Path.GetFullPath(_config.ServerDir), "mods"); + var args = new List { "-jar", CliJarPath, "-r" }; + if (Directory.Exists(modsDir)) + { + args.Add("--mods"); + args.Add(modsDir); + } + + var psi = new ProcessStartInfo + { + FileName = bluemapJava, + WorkingDirectory = RootDir, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + }; + foreach (var a in args) psi.ArgumentList.Add(a); + + _renderProc = new Process { StartInfo = psi, EnableRaisingEvents = true }; + _renderProc.OutputDataReceived += (_, e) => { if (e.Data is { } line) { State.LastLogLine = line; _log($"[bluemap] {line}"); } }; + _renderProc.ErrorDataReceived += (_, e) => { if (e.Data is { } line) { State.LastLogLine = line; _log($"[bluemap] {line}"); } }; + + _renderProc.Start(); + _renderProc.BeginOutputReadLine(); + _renderProc.BeginErrorReadLine(); + await _renderProc.WaitForExitAsync(); + + State.ExitCode = _renderProc.ExitCode; + State.FinishedAt = DateTimeOffset.UtcNow; + if (_renderProc.ExitCode == 0) State.Phase = "complete"; + else { State.Phase = "failed"; State.Error = $"BlueMap exited with code {_renderProc.ExitCode}"; } + } + catch (Exception ex) + { + State.Phase = "failed"; + State.Error = ex.Message; + State.FinishedAt = DateTimeOffset.UtcNow; + _log($"[bluemap] Failed: {ex.Message}"); + } + finally + { + State.InProgress = false; + _renderProc?.Dispose(); + _renderProc = null; + _gate.Release(); + } + } + + private async Task DownloadJarIfMissingAsync() + { + if (File.Exists(CliJarPath)) return; + _log($"[bluemap] Downloading BlueMap CLI v{BlueMapVersion} to {CliJarPath}"); + Directory.CreateDirectory(Path.GetDirectoryName(CliJarPath)!); + using var resp = await _http.GetAsync(BlueMapJarUrl, HttpCompletionOption.ResponseHeadersRead); + resp.EnsureSuccessStatusCode(); + await using var src = await resp.Content.ReadAsStreamAsync(); + await using var dst = File.Create(CliJarPath); + await src.CopyToAsync(dst); + _log($"[bluemap] Downloaded {new FileInfo(CliJarPath).Length / 1024} KB."); + } + + /// Reuse JavaInstaller to drop a JRE 25 next to JRE 21 (separate dirs). + private async Task EnsureJava25Async() + { + var installer = new JavaInstaller(); + var serverFull = Path.GetFullPath(_config.ServerDir); + // Look for an existing JRE 25 install first (idempotent across renders). + var existing = installer.FindBundledJava(serverFull, BlueMapJavaVersion); + if (existing is not null) return existing; + var installDir = installer.GetJavaInstallDir(serverFull, BlueMapJavaVersion); + var progress = new Progress(msg => _log("[bluemap] " + msg)); + return await installer.InstallJreAsync(BlueMapJavaVersion, serverFull, installDir, progress, default); + } + + /// + /// Run BlueMap with no flags so it writes default configs (bluemap.conf, + /// maps/overworld.conf, etc.), then patch the overworld map's world path + /// to point at our serverDir. Idempotent -- only writes configs that don't + /// exist; existing user edits survive. + /// + private void EnsureConfig(string javaPath) + { + Directory.CreateDirectory(ConfigDir); + var bluemapConf = Path.Combine(ConfigDir, "core.conf"); + var seeded = File.Exists(bluemapConf); + if (!seeded) + { + _log("[bluemap] First run -- generating default configs."); + var psi = new ProcessStartInfo + { + FileName = javaPath, + WorkingDirectory = RootDir, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + }; + psi.ArgumentList.Add("-jar"); + psi.ArgumentList.Add(CliJarPath); + using var p = Process.Start(psi)!; + p.WaitForExit(60_000); + } + + // Patch the overworld map config to reference our world dir. + var serverDirAbs = Path.GetFullPath(_config.ServerDir); + var levelName = ReadLevelName(_config.ServerDir) ?? "world"; + var worldDir = Path.Combine(serverDirAbs, levelName).Replace('\\', '/'); + + var mapsDir = Path.Combine(ConfigDir, "maps"); + Directory.CreateDirectory(mapsDir); + var owConf = Path.Combine(mapsDir, "overworld.conf"); + if (!File.Exists(owConf) || !File.ReadAllText(owConf).Contains(worldDir)) + { + File.WriteAllText(owConf, $@"# Generated by brass-sigil-server. Edit at your own risk. +world: ""{worldDir}"" +dimension: ""minecraft:overworld"" +name: ""Brass and Sigil -- Overworld"" +sorting: 0 +sky-color: ""#7dabff"" +ambient-light: 0 +"); + _log("[bluemap] Wrote map config: maps/overworld.conf"); + } + + // Tell core.conf to accept that we read its license/disclaimer (otherwise CLI exits with a notice). + if (File.Exists(bluemapConf)) + { + var text = File.ReadAllText(bluemapConf); + if (!text.Contains("accept-download: true")) + { + text = text.Replace("accept-download: false", "accept-download: true"); + if (!text.Contains("accept-download:")) + text += "\naccept-download: true\n"; + File.WriteAllText(bluemapConf, text); + _log("[bluemap] Set accept-download: true in core.conf"); + } + } + } + + private static string? ReadLevelName(string serverDir) + { + var path = Path.Combine(serverDir, "server.properties"); + if (!File.Exists(path)) return null; + foreach (var line in File.ReadAllLines(path)) + { + if (line.StartsWith("level-name=", StringComparison.Ordinal)) + return line.Substring("level-name=".Length).Trim(); + } + return null; + } +} diff --git a/server/Services/Broadcaster.cs b/server/Services/Broadcaster.cs new file mode 100644 index 0000000..08fad5f --- /dev/null +++ b/server/Services/Broadcaster.cs @@ -0,0 +1,109 @@ +namespace BrassAndSigil.Server.Services; + +/// +/// Pushes player-visible messages and overlays into Minecraft via stdin +/// commands (/say, /title, /bossbar). The boss-bar countdown is the primary +/// primitive the updater uses for restart announcements. +/// +public sealed class Broadcaster +{ + private readonly ServerProcess _proc; + private const string BossBarId = "brass:announce"; + + public Broadcaster(ServerProcess proc) => _proc = proc; + + public Task SayAsync(string message, CancellationToken ct = default) + => _proc.SendInputAsync($"say {SingleLine(message)}", ct); + + public Task ActionBarAsync(string message, CancellationToken ct = default) + => _proc.SendInputAsync($"title @a actionbar {{\"text\":\"{EscapeJson(message)}\"}}", ct); + + /// + /// Re-sends the action bar text once per second so it stays sticky for the + /// full duration. Action bar fades after ~2-3 s of inactivity, so the + /// re-send is mandatory. Doesn't conflict with boss-bar UI for actual + /// boss fights -- preferred over BossBarCountdownAsync for restart warnings. + /// + public async Task ActionBarCountdownAsync( + string title, int durationSeconds, CancellationToken ct = default) + { + if (durationSeconds <= 0) return; + // Silence /title's "Showing new title for X" chat broadcast for the loop -- + // otherwise it spams chat once per second per online player. Restored in + // the finally block. World save typically isn't quick enough to persist + // the off state if we crash mid-flight, but worst case admins can flip + // it back manually with /gamerule sendCommandFeedback true. + await _proc.SendInputAsync("gamerule sendCommandFeedback false", ct); + try + { + for (int sec = durationSeconds; sec > 0; sec--) + { + ct.ThrowIfCancellationRequested(); + var mins = sec / 60; + var secs = sec % 60; + var label = mins > 0 ? $"{title} -- {mins}m {secs:00}s" : $"{title} -- {secs}s"; + await _proc.SendInputAsync($"title @a actionbar {{\"text\":\"{EscapeJson(label)}\"}}", ct); + try { await Task.Delay(1000, ct); } + catch (OperationCanceledException) { throw; } + } + } + finally + { + // Clear the action bar AND restore feedback. Both best-effort: if MC + // is stopping these'll fail and that's fine. + try { await _proc.SendInputAsync("title @a actionbar {\"text\":\"\"}"); } catch { } + try { await _proc.SendInputAsync("gamerule sendCommandFeedback true"); } catch { } + } + } + + public Task TitleAsync(string message, CancellationToken ct = default) + => _proc.SendInputAsync($"title @a title {{\"text\":\"{EscapeJson(message)}\"}}", ct); + + /// + /// Show a draining boss bar at the top of every player's screen for + /// . Updates the bar's name with a + /// "title -- Mm Ss" countdown each second. Returns when the bar is removed. + /// Honours cancellation: bar is removed cleanly even on cancel. + /// + public async Task BossBarCountdownAsync( + string title, int durationSeconds, string color = "yellow", CancellationToken ct = default) + { + if (durationSeconds <= 0) return; + + // Silence /bossbar feedback for the same reason as ActionBarCountdownAsync. + await _proc.SendInputAsync("gamerule sendCommandFeedback false", ct); + await _proc.SendInputAsync($"bossbar add {BossBarId} {{\"text\":\"{EscapeJson(title)}\"}}", ct); + await _proc.SendInputAsync($"bossbar set {BossBarId} color {color}", ct); + await _proc.SendInputAsync($"bossbar set {BossBarId} max {durationSeconds}", ct); + await _proc.SendInputAsync($"bossbar set {BossBarId} value {durationSeconds}", ct); + await _proc.SendInputAsync($"bossbar set {BossBarId} players @a", ct); + + try + { + for (int sec = durationSeconds; sec > 0; sec--) + { + ct.ThrowIfCancellationRequested(); + var mins = sec / 60; + var secs = sec % 60; + var label = mins > 0 ? $"{title} -- {mins}m {secs:00}s" : $"{title} -- {secs}s"; + await _proc.SendInputAsync($"bossbar set {BossBarId} name {{\"text\":\"{EscapeJson(label)}\"}}", ct); + await _proc.SendInputAsync($"bossbar set {BossBarId} value {sec}", ct); + try { await Task.Delay(1000, ct); } + catch (OperationCanceledException) { throw; } + } + } + finally + { + // Always remove the bar -- even on cancel, so a stuck bar isn't left + // on every player's screen. Use CancellationToken.None for the cleanup. + try { await _proc.SendInputAsync($"bossbar remove {BossBarId}"); } catch { } + try { await _proc.SendInputAsync("gamerule sendCommandFeedback true"); } catch { } + } + } + + private static string EscapeJson(string s) => + s.Replace("\\", "\\\\").Replace("\"", "\\\"").Replace("\n", " "); + + private static string SingleLine(string s) => + s.Replace("\r", " ").Replace("\n", " ").Trim(); +} diff --git a/server/Services/JavaInstaller.cs b/server/Services/JavaInstaller.cs new file mode 100644 index 0000000..34ed712 --- /dev/null +++ b/server/Services/JavaInstaller.cs @@ -0,0 +1,156 @@ +using System.Formats.Tar; +using System.IO.Compression; +using System.Runtime.InteropServices; + +namespace BrassAndSigil.Server.Services; + +/// +/// Downloads + extracts Adoptium Temurin JRE 21 to server/java/. Used as a fallback +/// when system Java is missing or too old. Adoptium's API gives us a stable +/// platform-keyed download URL without needing API keys or auth. +/// +public sealed class JavaInstaller +{ + private static readonly HttpClient _http = new() { Timeout = TimeSpan.FromMinutes(15) }; + + public string GetJavaInstallDir(string serverDir) => Path.Combine(serverDir, "java"); + public string GetJavaInstallDir(string serverDir, int majorVersion) => + Path.Combine(serverDir, "java" + majorVersion); + + /// If a previous install put a java executable under serverDir/java/, return its path. + public string? FindBundledJava(string serverDir) + { + var javaDir = GetJavaInstallDir(serverDir); + if (!Directory.Exists(javaDir)) return null; + var exe = OperatingSystem.IsWindows() ? "java.exe" : "java"; + return Directory.EnumerateFiles(javaDir, exe, SearchOption.AllDirectories).FirstOrDefault(); + } + + /// Find a Java install for a specific major version (e.g. javaXX/jdk-XX*/bin/java). + public string? FindBundledJava(string serverDir, int majorVersion) + { + var javaDir = GetJavaInstallDir(serverDir, majorVersion); + if (!Directory.Exists(javaDir)) return null; + var exe = OperatingSystem.IsWindows() ? "java.exe" : "java"; + return Directory.EnumerateFiles(javaDir, exe, SearchOption.AllDirectories).FirstOrDefault(); + } + + public Task InstallJre21Async(string serverDir, IProgress? progress, CancellationToken ct) + => InstallJreAsync(21, serverDir, GetJavaInstallDir(serverDir), progress, ct); + + /// + /// Download + extract Adoptium Temurin JRE for a specific major version into + /// . Used by BlueMap to get JRE 25 alongside the + /// JRE 21 we use for Minecraft. + /// + public async Task InstallJreAsync(int majorVersion, string serverDir, string installDir, + IProgress? progress, CancellationToken ct) + { + var javaDir = installDir; + Directory.CreateDirectory(javaDir); + + var (url, archiveName, isZip) = PickAdoptiumDownload(majorVersion); + if (url is null) + { + progress?.Report($"[err] No supported Adoptium binary for {RuntimeInformation.OSDescription} {RuntimeInformation.OSArchitecture}."); + return null; + } + + var archivePath = Path.Combine(javaDir, archiveName!); + progress?.Report($"Downloading Adoptium Temurin JRE 21 ({(isZip ? "zip" : "tar.gz")})..."); + + try + { + using (var resp = await _http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, ct)) + { + resp.EnsureSuccessStatusCode(); + await using var src = await resp.Content.ReadAsStreamAsync(ct); + await using var dst = File.Create(archivePath); + await src.CopyToAsync(dst, ct); + } + } + catch (Exception ex) + { + progress?.Report($" [err] Download failed: {ex.Message}"); + return null; + } + + progress?.Report($" Downloaded {new FileInfo(archivePath).Length:N0} bytes"); + progress?.Report("Extracting..."); + + try + { + if (isZip) + { + ZipFile.ExtractToDirectory(archivePath, javaDir, overwriteFiles: true); + } + else + { + await using var fs = File.OpenRead(archivePath); + await using var gzip = new GZipStream(fs, CompressionMode.Decompress); + await TarFile.ExtractToDirectoryAsync(gzip, javaDir, overwriteFiles: true, ct); + } + } + catch (Exception ex) + { + progress?.Report($" [err] Extract failed: {ex.Message}"); + return null; + } + + try { File.Delete(archivePath); } catch { /* best-effort */ } + + var javaExe = FindBundledJava(serverDir); + if (javaExe is null) + { + progress?.Report(" [err] Extracted, but couldn't locate bin/java in the result."); + return null; + } + + // On Linux/macOS, make sure java is executable. TarFile preserves mode bits in + // most setups, but be defensive. + if (!OperatingSystem.IsWindows()) + { + try + { + File.SetUnixFileMode(javaExe, + UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute | + UnixFileMode.GroupRead | UnixFileMode.GroupExecute | + UnixFileMode.OtherRead | UnixFileMode.OtherExecute); + } + catch { } + } + + progress?.Report($"Java {majorVersion} ready: {javaExe}"); + return javaExe; + } + + private static (string? Url, string? ArchiveName, bool IsZip) PickAdoptiumDownload(int majorVersion) + { + // Adoptium API picks the latest GA release matching our os/arch. + // Docs: https://api.adoptium.net/q/swagger-ui/ + var arch = RuntimeInformation.OSArchitecture switch + { + Architecture.X64 => "x64", + Architecture.Arm64 => "aarch64", + _ => null + }; + if (arch is null) return (null, null, false); + + if (OperatingSystem.IsWindows()) + { + return ($"https://api.adoptium.net/v3/binary/latest/{majorVersion}/ga/windows/{arch}/jre/hotspot/normal/eclipse", + $"jre{majorVersion}.zip", true); + } + if (OperatingSystem.IsLinux()) + { + return ($"https://api.adoptium.net/v3/binary/latest/{majorVersion}/ga/linux/{arch}/jre/hotspot/normal/eclipse", + $"jre{majorVersion}.tar.gz", false); + } + if (OperatingSystem.IsMacOS()) + { + return ($"https://api.adoptium.net/v3/binary/latest/{majorVersion}/ga/mac/{arch}/jre/hotspot/normal/eclipse", + $"jre{majorVersion}.tar.gz", false); + } + return (null, null, false); + } +} diff --git a/server/Services/JsonOpts.cs b/server/Services/JsonOpts.cs new file mode 100644 index 0000000..8de793d --- /dev/null +++ b/server/Services/JsonOpts.cs @@ -0,0 +1,24 @@ +using System.Text.Json; + +namespace BrassAndSigil.Server.Services; + +/// +/// Project-wide JSON serializer options. Always case-insensitive on read so that +/// hand-edited config files / API responses don't silently fail to bind a property +/// because of a casing mismatch (e.g. "Command" vs "command", "JavaPath" vs "javaPath"). +/// Use this everywhere we call JsonSerializer.Deserialize. +/// +public static class JsonOpts +{ + public static readonly JsonSerializerOptions CaseInsensitive = new() + { + PropertyNameCaseInsensitive = true, + ReadCommentHandling = JsonCommentHandling.Skip, + AllowTrailingCommas = true, + }; + + public static readonly JsonSerializerOptions Pretty = new() + { + WriteIndented = true, + }; +} diff --git a/server/Services/ManifestSync.cs b/server/Services/ManifestSync.cs new file mode 100644 index 0000000..d6a7d49 --- /dev/null +++ b/server/Services/ManifestSync.cs @@ -0,0 +1,199 @@ +using System.Net.Http.Json; +using System.Security.Cryptography; +using System.Text.Json; +using BrassAndSigil.Server.Models; + +namespace BrassAndSigil.Server.Services; + +/// +/// Server-side mod sync. Downloads only mods that the server needs: +/// queries Modrinth's project metadata for each mod's `server_side` field +/// and skips anything marked "unsupported" (Iris, Sodium, JEI, etc). +/// CurseForge mods can't be auto-classified without an API key, so they +/// are downloaded as-is and the server admin can manually delete unwanted ones. +/// +public sealed class ManifestSync +{ + private static readonly HttpClient _http = new() { Timeout = TimeSpan.FromMinutes(5) }; + private const string PackVersionFile = "pack-version.json"; + private const string ServerManifestCache = "server-pack.cache.json"; + + public sealed record SyncResult(int Downloaded, int Removed, int Skipped, string PackVersion); + + public async Task FetchManifestAsync(string url, CancellationToken ct = default) + { + var json = await _http.GetStringAsync(url, ct); + var manifest = JsonSerializer.Deserialize(json, JsonOpts.CaseInsensitive) + ?? throw new InvalidOperationException("Manifest is empty."); + manifest.Files ??= new(); + return manifest; + } + + public async Task SyncAsync( + string manifestUrl, string serverDir, IProgress? progress = null, CancellationToken ct = default) + { + progress?.Report("Fetching manifest..."); + var manifest = await FetchManifestAsync(manifestUrl, ct); + + progress?.Report($"Pack: {manifest.Name} v{manifest.Version}"); + Directory.CreateDirectory(serverDir); + + // Resolve which mods are server-side. + var skipSlugs = await ResolveServerSideSkipListAsync(manifest, ct); + + // Build the filtered list of files to keep on the server. + var keepFiles = manifest.Files + .Where(f => !ShouldSkipFile(f.Path, skipSlugs)) + .ToList(); + var skippedCount = manifest.Files.Count - keepFiles.Count; + + // Prune managed files that aren't in the keep set. + var wantedPaths = new HashSet( + keepFiles.Select(f => f.Path.Replace('\\', '/')), + StringComparer.OrdinalIgnoreCase); + var toRemove = ListManagedFiles(serverDir).Where(p => !wantedPaths.Contains(p)).ToList(); + foreach (var rel in toRemove) + { + var full = Path.Combine(serverDir, rel); + try { File.Delete(full); progress?.Report($" Removed: {rel}"); } + catch (Exception ex) { progress?.Report($" Could not remove {rel}: {ex.Message}"); } + } + + // Download missing or hash-mismatched files. + var toDownload = new List(); + foreach (var file in keepFiles) + { + ct.ThrowIfCancellationRequested(); + var dest = Path.Combine(serverDir, file.Path); + if (!File.Exists(dest)) { toDownload.Add(file); continue; } + if (!string.IsNullOrEmpty(file.Sha1)) + { + var actual = await ComputeSha1Async(dest, ct); + if (!string.Equals(actual, file.Sha1, StringComparison.OrdinalIgnoreCase)) + toDownload.Add(file); + } + } + + progress?.Report(toDownload.Count == 0 ? "Already up-to-date." : $"Downloading {toDownload.Count} files..."); + for (int i = 0; i < toDownload.Count; i++) + { + var file = toDownload[i]; + progress?.Report($" [{i + 1}/{toDownload.Count}] {file.Path}"); + await DownloadFileAsync(file.Url, Path.Combine(serverDir, file.Path), file.Sha1, ct); + } + + // Write pack-version.json marker. + var record = new + { + name = manifest.Name, + version = manifest.Version, + syncedAt = DateTime.UtcNow.ToString("o"), + includedFiles = keepFiles.Count, + skippedFiles = skippedCount + }; + await File.WriteAllTextAsync( + Path.Combine(serverDir, PackVersionFile), + JsonSerializer.Serialize(record, new JsonSerializerOptions { WriteIndented = true }), + ct); + + return new SyncResult(toDownload.Count, toRemove.Count, skippedCount, manifest.Version ?? "?"); + } + + private static bool ShouldSkipFile(string filePath, HashSet skipSlugs) + { + if (skipSlugs.Count == 0) return false; + var name = Path.GetFileNameWithoutExtension(filePath).ToLowerInvariant(); + // Match if any skip slug appears at the start of the filename (slug-version.jar) + return skipSlugs.Any(slug => name.StartsWith(slug + "-", StringComparison.OrdinalIgnoreCase) + || name.Equals(slug, StringComparison.OrdinalIgnoreCase)); + } + + /// Walk the manifest's mod URLs; for Modrinth ones, look up server_side; build a skip set. + private async Task> ResolveServerSideSkipListAsync(Manifest manifest, CancellationToken ct) + { + var skip = new HashSet(StringComparer.OrdinalIgnoreCase); + var modrinthIds = new HashSet(); + + foreach (var file in manifest.Files) + { + if (!file.Path.StartsWith("mods/", StringComparison.OrdinalIgnoreCase)) continue; + // Modrinth URL pattern: https://cdn.modrinth.com/data/{projectId}/versions/{versionId}/... + var url = file.Url; + const string prefix = "cdn.modrinth.com/data/"; + var idx = url.IndexOf(prefix, StringComparison.OrdinalIgnoreCase); + if (idx < 0) continue; + var rest = url.Substring(idx + prefix.Length); + var slash = rest.IndexOf('/'); + if (slash < 0) continue; + modrinthIds.Add(rest.Substring(0, slash)); + } + + foreach (var pid in modrinthIds) + { + ct.ThrowIfCancellationRequested(); + try + { + var info = await _http.GetFromJsonAsync( + $"https://api.modrinth.com/v2/project/{pid}", ct); + var slug = info.TryGetProperty("slug", out var s) ? s.GetString() : null; + var serverSide = info.TryGetProperty("server_side", out var ss) ? ss.GetString() : null; + if (!string.IsNullOrEmpty(slug) && string.Equals(serverSide, "unsupported", StringComparison.OrdinalIgnoreCase)) + { + skip.Add(slug); + } + } + catch + { + // Best-effort: if we can't classify, keep the mod (safer to ship extra than missing) + } + } + + return skip; + } + + private static List ListManagedFiles(string serverDir) + { + var roots = new[] { "mods", "config", "resourcepacks", "kubejs", "defaultconfigs" }; + var result = new List(); + foreach (var root in roots) + { + var rootDir = Path.Combine(serverDir, root); + if (!Directory.Exists(rootDir)) continue; + foreach (var f in Directory.EnumerateFiles(rootDir, "*", SearchOption.AllDirectories)) + result.Add(Path.GetRelativePath(serverDir, f).Replace('\\', '/')); + } + return result; + } + + private static async Task DownloadFileAsync(string url, string destPath, string? expectedSha1, CancellationToken ct) + { + Directory.CreateDirectory(Path.GetDirectoryName(destPath)!); + var tmp = destPath + ".part"; + using (var resp = await _http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, ct)) + { + resp.EnsureSuccessStatusCode(); + await using var src = await resp.Content.ReadAsStreamAsync(ct); + await using var dst = File.Create(tmp); + await src.CopyToAsync(dst, ct); + } + if (!string.IsNullOrEmpty(expectedSha1)) + { + var actual = await ComputeSha1Async(tmp, ct); + if (!string.Equals(actual, expectedSha1, StringComparison.OrdinalIgnoreCase)) + { + File.Delete(tmp); + throw new InvalidOperationException($"Hash mismatch for {Path.GetFileName(destPath)}"); + } + } + if (File.Exists(destPath)) File.Delete(destPath); + File.Move(tmp, destPath); + } + + private static async Task ComputeSha1Async(string path, CancellationToken ct) + { + using var sha = SHA1.Create(); + await using var stream = File.OpenRead(path); + var bytes = await sha.ComputeHashAsync(stream, ct); + return Convert.ToHexString(bytes).ToLowerInvariant(); + } +} diff --git a/server/Services/NeoForgeInstaller.cs b/server/Services/NeoForgeInstaller.cs new file mode 100644 index 0000000..ac6bdcd --- /dev/null +++ b/server/Services/NeoForgeInstaller.cs @@ -0,0 +1,112 @@ +using System.Diagnostics; + +namespace BrassAndSigil.Server.Services; + +/// +/// Downloads NeoForge's official server installer JAR and runs it with --installServer +/// to produce run.sh/run.bat + the server library tree. Handles Java invocation and +/// streams installer output via a progress callback. +/// +public sealed class NeoForgeInstaller +{ + private static readonly HttpClient _http = new() { Timeout = TimeSpan.FromMinutes(10) }; + + public bool IsAlreadyInstalled(string serverDir) + { + return File.Exists(Path.Combine(serverDir, OperatingSystem.IsWindows() ? "run.bat" : "run.sh")); + } + + public async Task InstallAsync(string version, string serverDir, string javaPath, + IProgress? progress, CancellationToken ct) + { + Directory.CreateDirectory(serverDir); + + // 1. Download installer + var installerName = $"neoforge-{version}-installer.jar"; + var installerPath = Path.Combine(serverDir, installerName); + var url = $"https://maven.neoforged.net/releases/net/neoforged/neoforge/{version}/{installerName}"; + + if (!File.Exists(installerPath)) + { + progress?.Report($"Downloading NeoForge {version} installer..."); + var bytes = await _http.GetByteArrayAsync(url, ct); + await File.WriteAllBytesAsync(installerPath, bytes, ct); + progress?.Report($" Saved {bytes.Length:N0} bytes to {installerName}"); + } + else + { + progress?.Report($"NeoForge installer already present, skipping download."); + } + + // 2. Run installer + progress?.Report("Running NeoForge installer (java -jar ... --installServer)..."); + var psi = new ProcessStartInfo + { + FileName = javaPath, + WorkingDirectory = serverDir, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + }; + psi.ArgumentList.Add("-jar"); + psi.ArgumentList.Add(installerName); + psi.ArgumentList.Add("--installServer"); + + Process? proc; + try + { + proc = Process.Start(psi); + } + catch (Exception ex) + { + progress?.Report($" [error] Could not start java: {ex.Message}"); + return false; + } + if (proc is null) + { + progress?.Report(" [error] Failed to start java."); + return false; + } + + var stdoutTask = StreamLines(proc.StandardOutput, line => progress?.Report($" {line}"), ct); + var stderrTask = StreamLines(proc.StandardError, line => progress?.Report($" [err] {line}"), ct); + + await proc.WaitForExitAsync(ct); + await Task.WhenAll(stdoutTask, stderrTask); + + if (proc.ExitCode != 0) + { + progress?.Report($" [error] NeoForge installer exited with code {proc.ExitCode}"); + return false; + } + + // 3. Verify run script exists + if (!IsAlreadyInstalled(serverDir)) + { + progress?.Report(" [error] NeoForge installer ran but run.sh/run.bat is missing."); + return false; + } + + progress?.Report($"NeoForge {version} installed."); + + // 4. Clean up the installer JAR (large, no longer needed) + try { File.Delete(installerPath); } catch { /* best-effort */ } + + return true; + } + + private static async Task StreamLines(StreamReader reader, Action onLine, CancellationToken ct) + { + try + { + while (!reader.EndOfStream) + { + var line = await reader.ReadLineAsync(ct); + if (line is null) break; + onLine(line); + } + } + catch { } + } +} diff --git a/server/Services/RconClient.cs b/server/Services/RconClient.cs new file mode 100644 index 0000000..9518cb0 --- /dev/null +++ b/server/Services/RconClient.cs @@ -0,0 +1,93 @@ +using System.Buffers.Binary; +using System.Net.Sockets; +using System.Text; + +namespace BrassAndSigil.Server.Services; + +/// +/// Minimal Minecraft RCON client (Source RCON protocol). +/// Used for sending console commands and reading "list" output for player counts. +/// +public sealed class RconClient : IDisposable +{ + private const int SERVERDATA_AUTH = 3; + private const int SERVERDATA_EXECCOMMAND = 2; + private const int SERVERDATA_RESPONSE_VALUE = 0; + + private TcpClient? _tcp; + private NetworkStream? _stream; + private int _nextRequestId = 1; + + public bool Connected => _tcp?.Connected ?? false; + + public async Task ConnectAsync(string host, int port, string password, CancellationToken ct = default) + { + _tcp = new TcpClient(); + await _tcp.ConnectAsync(host, port, ct); + _stream = _tcp.GetStream(); + + var authId = NextId(); + await SendPacketAsync(authId, SERVERDATA_AUTH, password, ct); + + // Read auth response. Server sends an empty response value first, then the auth result. + var (id1, _, _) = await ReadPacketAsync(ct); + if (id1 == -1) throw new InvalidOperationException("RCON auth failed (bad password)"); + // Auth ok if id matches what we sent + } + + public async Task SendCommandAsync(string command, CancellationToken ct = default) + { + if (_stream == null) throw new InvalidOperationException("Not connected"); + var id = NextId(); + await SendPacketAsync(id, SERVERDATA_EXECCOMMAND, command, ct); + var (_, _, body) = await ReadPacketAsync(ct); + return body; + } + + private int NextId() => Interlocked.Increment(ref _nextRequestId); + + private async Task SendPacketAsync(int id, int type, string body, CancellationToken ct) + { + var bodyBytes = Encoding.UTF8.GetBytes(body); + var packetSize = 4 + 4 + bodyBytes.Length + 2; // id + type + body + 2 null bytes + var buffer = new byte[4 + packetSize]; + BinaryPrimitives.WriteInt32LittleEndian(buffer.AsSpan(0, 4), packetSize); + BinaryPrimitives.WriteInt32LittleEndian(buffer.AsSpan(4, 4), id); + BinaryPrimitives.WriteInt32LittleEndian(buffer.AsSpan(8, 4), type); + bodyBytes.CopyTo(buffer.AsSpan(12)); + // last two bytes already 0 by default + await _stream!.WriteAsync(buffer, ct); + } + + private async Task<(int Id, int Type, string Body)> ReadPacketAsync(CancellationToken ct) + { + var sizeBuf = new byte[4]; + await ReadExactAsync(sizeBuf, ct); + var size = BinaryPrimitives.ReadInt32LittleEndian(sizeBuf); + if (size < 10 || size > 1024 * 1024) throw new InvalidOperationException($"Bad RCON packet size {size}"); + + var pkt = new byte[size]; + await ReadExactAsync(pkt, ct); + var id = BinaryPrimitives.ReadInt32LittleEndian(pkt.AsSpan(0, 4)); + var type = BinaryPrimitives.ReadInt32LittleEndian(pkt.AsSpan(4, 4)); + var body = Encoding.UTF8.GetString(pkt, 8, size - 10); // strip 2 trailing nulls + return (id, type, body); + } + + private async Task ReadExactAsync(byte[] buffer, CancellationToken ct) + { + var read = 0; + while (read < buffer.Length) + { + var n = await _stream!.ReadAsync(buffer.AsMemory(read), ct); + if (n == 0) throw new EndOfStreamException(); + read += n; + } + } + + public void Dispose() + { + _stream?.Dispose(); + _tcp?.Dispose(); + } +} diff --git a/server/Services/RconManager.cs b/server/Services/RconManager.cs new file mode 100644 index 0000000..2cc9a1d --- /dev/null +++ b/server/Services/RconManager.cs @@ -0,0 +1,68 @@ +namespace BrassAndSigil.Server.Services; + +/// +/// Thin reconnecting wrapper around . The original +/// single-connection-with-no-retry pattern caches a dead client whenever the +/// initial connect happens before MC has opened the RCON port (which is normal -- +/// boot takes ~30 s). This manager lazily connects on first use, retries on +/// failure, and drops the client when a send throws so the next call reconnects. +/// +public sealed class RconManager : IDisposable +{ + private readonly string _host; + private readonly int _port; + private readonly string _password; + private readonly SemaphoreSlim _lock = new(1, 1); + private RconClient? _client; + + public RconManager(string host, int port, string password) + { + _host = host; + _port = port; + _password = password; + } + + public async Task SendCommandAsync(string command, CancellationToken ct = default) + { + var client = await EnsureConnectedAsync(ct); + try + { + return await client.SendCommandAsync(command, ct); + } + catch + { + await DropAsync(); + throw; + } + } + + private async Task EnsureConnectedAsync(CancellationToken ct) + { + await _lock.WaitAsync(ct); + try + { + if (_client is { Connected: true }) return _client; + _client?.Dispose(); + _client = new RconClient(); + await _client.ConnectAsync(_host, _port, _password, ct); + return _client; + } + finally + { + _lock.Release(); + } + } + + private async Task DropAsync() + { + await _lock.WaitAsync(); + try { _client?.Dispose(); _client = null; } + finally { _lock.Release(); } + } + + public void Dispose() + { + _client?.Dispose(); + _lock.Dispose(); + } +} diff --git a/server/Services/ServerProcess.cs b/server/Services/ServerProcess.cs new file mode 100644 index 0000000..ba8a11a --- /dev/null +++ b/server/Services/ServerProcess.cs @@ -0,0 +1,405 @@ +using System.Collections.Concurrent; +using System.Diagnostics; +using BrassAndSigil.Server.Models; + +namespace BrassAndSigil.Server.Services; + +/// +/// Manages the Minecraft Java subprocess: spawns it with the right JVM args, +/// captures stdout/stderr into a ring buffer (so the web UI can show recent +/// logs), broadcasts new lines via an event, handles graceful shutdown. +/// +public sealed class ServerProcess : IDisposable +{ + private readonly ServerConfig _config; + private Process? _process; + private readonly ConcurrentQueue _logRing = new(); + private const int LogRingSize = 2000; + + // Process-tree containment: on Windows, the Job Object kills our subprocess + // automatically when our own process dies -- regardless of how we died. + // Created lazily on first Start() on Windows; destroyed in Dispose. + private static WindowsJobObject? _jobObject; + + public event Action? OnLogLine; + public event Action? Exited; + + public bool IsRunning => _process is { HasExited: false }; + public DateTime? StartedAt { get; private set; } + public int? Pid => _process?.Id; + + // Memory + CPU sampling. CpuMetrics is a moving average across calls -- the + // first call after start returns null because we need two samples for a delta. + // We track the Java *descendant* of our shell, not the shell itself, because + // run.sh / run.bat is ~2 MB and useless for stats. + private TimeSpan _lastCpuTime; + private DateTime _lastCpuSampleAt; + private int _lastTrackedPid; + private Process? _trackedJava; + private readonly object _statsLock = new(); + private readonly Queue _cpuSamples = new(); + private const int CpuSampleWindow = 20; // ~60 s rolling window @ 3 s polling + + /// + /// Returns the Java JVM descendant if found, otherwise falls back to the + /// directly-spawned shell process. Cached and re-resolved when the cached + /// pid exits (e.g., MC restart). + /// + private Process? TrackedProcess + { + get + { + if (_process is null || _process.HasExited) return null; + if (_trackedJava is { HasExited: false }) return _trackedJava; + // Try to find a 'java' descendant of our shell. If not found yet (still + // booting), fall back to the shell -- first stats will read tiny, then + // reset on next call once Java is up. + var found = FindJavaDescendant(_process.Id); + _trackedJava = found; + return found ?? _process; + } + } + + public long? MemoryBytes + { + get + { + var p = TrackedProcess; + if (p is null || p.HasExited) return null; + try { p.Refresh(); return p.WorkingSet64; } + catch { return null; } + } + } + + /// + /// System-wide CPU percentage (0-100) plus rolling-window peak and average. + /// Each call samples once and contributes to a 20-entry history (~60 s at 3 s + /// polling). First call after start returns null (need two samples for a delta). + /// + public (double Current, double Max, double Avg)? CpuMetrics + { + get + { + var p = TrackedProcess; + if (p is null || p.HasExited) return null; + lock (_statsLock) + { + try + { + p.Refresh(); + var now = DateTime.UtcNow; + var cpuNow = p.TotalProcessorTime; + if (_lastTrackedPid != p.Id || _lastCpuSampleAt == default) + { + _lastTrackedPid = p.Id; + _lastCpuTime = cpuNow; + _lastCpuSampleAt = now; + _cpuSamples.Clear(); + return null; + } + var elapsedReal = (now - _lastCpuSampleAt).TotalMilliseconds; + var elapsedCpu = (cpuNow - _lastCpuTime).TotalMilliseconds; + _lastCpuTime = cpuNow; + _lastCpuSampleAt = now; + if (elapsedReal <= 0) return (0, 0, 0); + + // System-wide: divide by core count so the value is bounded 0-100 + // and intuitive ("42% of total CPU capacity"). The user found the + // top-style 0-N*100 range confusing for a fleet view. + var perCore = elapsedCpu / elapsedReal * 100.0; + var systemWide = Math.Min(100.0, perCore / Environment.ProcessorCount); + + _cpuSamples.Enqueue(systemWide); + while (_cpuSamples.Count > CpuSampleWindow) _cpuSamples.Dequeue(); + + return (systemWide, _cpuSamples.Max(), _cpuSamples.Average()); + } + catch { return null; } + } + } + } + + /// + /// BFS the process tree starting from looking for + /// a process named like "java". Linux: read /proc/PID/task/PID/children. + /// Windows: enumerate parents via Process objects (no extra deps). + /// + private static Process? FindJavaDescendant(int rootPid) + { + try + { + if (OperatingSystem.IsLinux()) + { + return FindJavaDescendantLinux(rootPid); + } + if (OperatingSystem.IsWindows()) + { + return FindJavaDescendantWindows(rootPid); + } + } + catch { } + return null; + } + + private static Process? FindJavaDescendantLinux(int rootPid) + { + var visited = new HashSet(); + var queue = new Queue(); + queue.Enqueue(rootPid); + while (queue.Count > 0) + { + var pid = queue.Dequeue(); + if (!visited.Add(pid)) continue; + var childrenPath = $"/proc/{pid}/task/{pid}/children"; + if (!File.Exists(childrenPath)) continue; + string raw; + try { raw = File.ReadAllText(childrenPath); } catch { continue; } + foreach (var token in raw.Split(' ', StringSplitOptions.RemoveEmptyEntries)) + { + if (!int.TryParse(token, out var cpid)) continue; + Process? p = null; + try { p = Process.GetProcessById(cpid); } catch { continue; } + if (p.ProcessName.Equals("java", StringComparison.OrdinalIgnoreCase)) + return p; + queue.Enqueue(cpid); + } + } + return null; + } + + private static Process? FindJavaDescendantWindows(int rootPid) + { + // Build a parent->children map by reading every running process's parent + // PID once, then BFS. Slower than Linux's /proc but works without WMI. + var allProcs = Process.GetProcesses(); + var byParent = new Dictionary>(); + foreach (var p in allProcs) + { + int parent; + try { parent = GetParentPidWindows(p); } catch { continue; } + if (parent == 0) continue; + if (!byParent.TryGetValue(parent, out var list)) byParent[parent] = list = new List(); + list.Add(p); + } + var visited = new HashSet(); + var queue = new Queue(); + queue.Enqueue(rootPid); + while (queue.Count > 0) + { + var pid = queue.Dequeue(); + if (!visited.Add(pid)) continue; + if (!byParent.TryGetValue(pid, out var children)) continue; + foreach (var c in children) + { + if (c.ProcessName.Equals("java", StringComparison.OrdinalIgnoreCase)) + return c; + queue.Enqueue(c.Id); + } + } + return null; + } + + [System.Runtime.InteropServices.DllImport("ntdll.dll")] + private static extern int NtQueryInformationProcess( + IntPtr processHandle, int processInformationClass, + ref ProcessBasicInformation processInformation, int processInformationLength, out int returnLength); + + [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] + private struct ProcessBasicInformation + { + public IntPtr Reserved1; + public IntPtr PebBaseAddress; + public IntPtr Reserved2_0; + public IntPtr Reserved2_1; + public IntPtr UniqueProcessId; + public IntPtr InheritedFromUniqueProcessId; // <-- parent PID + } + + private static int GetParentPidWindows(Process p) + { + var info = new ProcessBasicInformation(); + int rc = NtQueryInformationProcess(p.Handle, 0, ref info, + System.Runtime.InteropServices.Marshal.SizeOf(), out _); + return rc != 0 ? 0 : info.InheritedFromUniqueProcessId.ToInt32(); + } + + public ServerProcess(ServerConfig config) => _config = config; + + public bool Start() + { + if (IsRunning) return false; + + // Reset cached Java descendant + CPU sampling baseline so the next call + // re-resolves once the new run.sh -> java tree is up. + _trackedJava = null; + _lastTrackedPid = 0; + _lastCpuSampleAt = default; + + // The mod loader's start script lives next to the server jar. NeoForge produces + // run.bat / run.sh from its installer; CmlLib's NeoForgeInstaller doesn't run on + // the server side, so we build the equivalent JVM command ourselves. + var startScript = ResolveStartCommand(out var argList); + var startInfo = new ProcessStartInfo + { + FileName = startScript, + WorkingDirectory = Path.GetFullPath(_config.ServerDir), + UseShellExecute = false, + RedirectStandardInput = true, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + }; + foreach (var a in argList) startInfo.ArgumentList.Add(a); + + // CRITICAL: NeoForge's run.bat / run.sh just calls plain `java`, which resolves to + // whatever's on PATH. If we configured a specific Java (or auto-downloaded one), + // prepend its bin dir + set JAVA_HOME so the script picks up the right JVM + // instead of an older system Java. + ApplyJavaEnvironment(startInfo); + + _process = new Process { StartInfo = startInfo, EnableRaisingEvents = true }; + _process.OutputDataReceived += (_, e) => OnLine(e.Data, isError: false); + _process.ErrorDataReceived += (_, e) => OnLine(e.Data, isError: true); + _process.Exited += (_, _) => + { + var code = _process?.ExitCode ?? -1; + OnLine($"=== Server exited (code {code}) ===", isError: false); + Exited?.Invoke(code); + }; + + _process.Start(); + + // Bind the Java subprocess to a Job Object on Windows so it gets killed + // automatically if we exit ungracefully (X-button, Task Manager, etc.). + if (OperatingSystem.IsWindows()) + { + try + { + _jobObject ??= new WindowsJobObject(); + _jobObject.AssignProcess(_process); + } + catch (Exception ex) + { + // Non-fatal -- we still try to clean up via Process.Kill in Dispose. + OnLine($"[brass-sigil-server] Couldn't attach Job Object: {ex.Message}", isError: true); + } + } + + _process.BeginOutputReadLine(); + _process.BeginErrorReadLine(); + StartedAt = DateTime.UtcNow; + return true; + } + + private string ResolveStartCommand(out List args) + { + args = new List(); + var dir = Path.GetFullPath(_config.ServerDir); + + // Prefer NeoForge's generated run.sh / run.bat -- they include the right module-path JVM args. + var runShell = OperatingSystem.IsWindows() ? "run.bat" : "run.sh"; + var runScript = Path.Combine(dir, runShell); + if (File.Exists(runScript)) + { + // Make sure the user_jvm_args.txt has the memory we want + EnsureUserJvmArgs(dir); + // Suppress the Swing server-GUI window -- we use the web panel instead. + // NeoForge's run.bat / run.sh forwards extra args to Minecraft. + args.Add("nogui"); + return runScript; + } + + // Fallback: invoke java directly on the server jar. This won't work for NeoForge + // (it requires the loader's run script), but it works for vanilla and Forge legacy. + args.Add($"-Xms{_config.MemoryMB}M"); + args.Add($"-Xmx{_config.MemoryMB}M"); + args.Add("-jar"); + args.Add("server.jar"); + args.Add("nogui"); + return _config.JavaPath; + } + + private void ApplyJavaEnvironment(ProcessStartInfo psi) + { + // Only meaningful when we have an absolute path to a specific java binary + // (i.e., not just "java" on PATH). + if (string.IsNullOrEmpty(_config.JavaPath)) return; + if (!Path.IsPathRooted(_config.JavaPath)) return; + if (!File.Exists(_config.JavaPath)) return; + + var javaBinDir = Path.GetDirectoryName(_config.JavaPath); + if (string.IsNullOrEmpty(javaBinDir)) return; + var javaHome = Path.GetDirectoryName(javaBinDir); // parent of bin/ + + var sep = OperatingSystem.IsWindows() ? ";" : ":"; + var existingPath = Environment.GetEnvironmentVariable("PATH") ?? ""; + psi.Environment["PATH"] = $"{javaBinDir}{sep}{existingPath}"; + if (!string.IsNullOrEmpty(javaHome)) + { + psi.Environment["JAVA_HOME"] = javaHome; + } + } + + private void EnsureUserJvmArgs(string dir) + { + // NeoForge's run.bat / run.sh reads this file for JVM-level args. + // Generational ZGC: concurrent low-pause GC, recommended by Distant Horizons + // and significantly better than G1 for heavily-modded MC. Requires Java 21+. + var path = Path.Combine(dir, "user_jvm_args.txt"); + var content = + $"-Xms{_config.MemoryMB}M\n" + + $"-Xmx{_config.MemoryMB}M\n" + + "-XX:+UseZGC\n" + + "-XX:+ZGenerational\n"; + try { File.WriteAllText(path, content); } catch { /* best-effort */ } + } + + private void OnLine(string? data, bool isError) + { + if (string.IsNullOrEmpty(data)) return; + var line = new LogLine(DateTimeOffset.UtcNow, isError, data); + _logRing.Enqueue(line); + while (_logRing.Count > LogRingSize) _logRing.TryDequeue(out _); + OnLogLine?.Invoke(line); + } + + public IReadOnlyList RecentLogs() => _logRing.ToArray(); + + public async Task SendInputAsync(string command, CancellationToken ct = default) + { + if (_process is null || _process.HasExited) return; + await _process.StandardInput.WriteLineAsync(command.AsMemory(), ct); + await _process.StandardInput.FlushAsync(ct); + } + + public async Task StopAsync(TimeSpan? graceful = null, CancellationToken ct = default) + { + if (!IsRunning) return false; + graceful ??= TimeSpan.FromSeconds(30); + try + { + await SendInputAsync("stop", ct); + using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct); + cts.CancelAfter(graceful.Value); + try { await _process!.WaitForExitAsync(cts.Token); return true; } + catch (OperationCanceledException) + { + _process?.Kill(entireProcessTree: true); + return false; + } + } + catch + { + try { _process?.Kill(entireProcessTree: true); } catch { } + return false; + } + } + + public void Dispose() + { + try { _process?.Kill(entireProcessTree: true); } catch { } + _process?.Dispose(); + } + + public sealed record LogLine(DateTimeOffset At, bool IsError, string Text); +} diff --git a/server/Services/ServerPropertiesService.cs b/server/Services/ServerPropertiesService.cs new file mode 100644 index 0000000..3ebf791 --- /dev/null +++ b/server/Services/ServerPropertiesService.cs @@ -0,0 +1,149 @@ +using BrassAndSigil.Server.Models; + +namespace BrassAndSigil.Server.Services; + +/// +/// Reads and writes Minecraft's server.properties. Editable keys are +/// gated by an allowlist so a compromised panel can't flip security-critical +/// fields like online-mode arbitrarily -- only common gameplay knobs. +/// Preserves comments and key order on write; appends new keys at the end. +/// +public sealed class ServerPropertiesService +{ + private readonly ServerConfig _config; + + public ServerPropertiesService(ServerConfig config) => _config = config; + + /// + /// Keys that may be modified via /api/server/settings. Anything outside this + /// set is silently dropped from the update payload -- admin must SSH for those. + /// + public static readonly IReadOnlySet EditableKeys = new HashSet(StringComparer.OrdinalIgnoreCase) + { + "motd", + "difficulty", + "gamemode", + "view-distance", + "simulation-distance", + "max-players", + "pvp", + "hardcore", + "white-list", + "enforce-whitelist", + "allow-flight", + "enable-command-block", + "spawn-protection", + }; + + public string PropertiesPath => Path.Combine(Path.GetFullPath(_config.ServerDir), "server.properties"); + + public Dictionary ReadAll() + { + var dict = new Dictionary(StringComparer.OrdinalIgnoreCase); + if (!File.Exists(PropertiesPath)) return dict; + foreach (var raw in File.ReadAllLines(PropertiesPath)) + { + var line = raw.TrimStart(); + if (line.Length == 0 || line[0] == '#' || line[0] == '!') continue; + var idx = line.IndexOf('='); + if (idx < 0) continue; + dict[line.Substring(0, idx).Trim()] = line.Substring(idx + 1); + } + return dict; + } + + /// Returns just the editable subset, with values left as raw strings. + public Dictionary ReadEditable() + { + var all = ReadAll(); + var result = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var key in EditableKeys) + { + if (all.TryGetValue(key, out var v)) result[key] = v; + } + return result; + } + + /// + /// Read the current level-seed value, or null if absent / empty. + /// + public string? GetLevelSeed() + { + if (!File.Exists(PropertiesPath)) return null; + foreach (var raw in File.ReadAllLines(PropertiesPath)) + { + var line = raw.TrimStart(); + if (!line.StartsWith("level-seed=", StringComparison.Ordinal)) continue; + var v = line.Substring("level-seed=".Length).Trim(); + return string.IsNullOrEmpty(v) ? null : v; + } + return null; + } + + /// + /// Direct write of level-seed. Bypasses + /// because the seed is set as part of the wipe flow (with confirmation), + /// not by general settings UI -- exposing it through the regular Update() + /// path would let it be flipped from any settings save. Empty string + /// clears the field, which makes Minecraft pick a random seed on next + /// world generation. + /// + public void SetLevelSeed(string seed) + { + var lines = File.Exists(PropertiesPath) + ? File.ReadAllLines(PropertiesPath).ToList() + : new List(); + var done = false; + for (int i = 0; i < lines.Count; i++) + { + var trimmed = lines[i].TrimStart(); + if (trimmed.StartsWith("level-seed=", StringComparison.Ordinal)) + { + lines[i] = $"level-seed={seed}"; + done = true; + break; + } + } + if (!done) lines.Add($"level-seed={seed}"); + File.WriteAllLines(PropertiesPath, lines); + } + + /// + /// Apply updates to the file. Keys not in are + /// silently dropped. Lines that already exist are updated in-place to + /// preserve order and comments; new keys are appended at the end. + /// + public void Update(IDictionary updates) + { + // Filter to allowed keys only. + var filtered = updates + .Where(kv => EditableKeys.Contains(kv.Key)) + .ToDictionary(kv => kv.Key, kv => kv.Value, StringComparer.OrdinalIgnoreCase); + if (filtered.Count == 0) return; + + var lines = File.Exists(PropertiesPath) + ? File.ReadAllLines(PropertiesPath).ToList() + : new List(); + + var applied = new HashSet(StringComparer.OrdinalIgnoreCase); + for (int i = 0; i < lines.Count; i++) + { + var raw = lines[i]; + var trimmed = raw.TrimStart(); + if (trimmed.Length == 0 || trimmed[0] == '#' || trimmed[0] == '!') continue; + var idx = trimmed.IndexOf('='); + if (idx < 0) continue; + var key = trimmed.Substring(0, idx).Trim(); + if (filtered.TryGetValue(key, out var newValue)) + { + lines[i] = $"{key}={newValue}"; + applied.Add(key); + } + } + foreach (var (key, value) in filtered) + { + if (!applied.Contains(key)) lines.Add($"{key}={value}"); + } + File.WriteAllLines(PropertiesPath, lines); + } +} diff --git a/server/Services/UpdaterService.cs b/server/Services/UpdaterService.cs new file mode 100644 index 0000000..7982626 --- /dev/null +++ b/server/Services/UpdaterService.cs @@ -0,0 +1,260 @@ +using BrassAndSigil.Server.Models; +using System.Text.Json; + +namespace BrassAndSigil.Server.Services; + +/// +/// Drives a "fetch new manifest, drain players, swap mods, restart MC" workflow. +/// Single-flight: one update at a time, guarded by a semaphore. State is exposed +/// so the panel can poll progress; logs go through the existing OnLogLine event +/// (re-streamed via SSE) so they show up in the live console too. +/// +public sealed class UpdaterService +{ + private readonly ServerConfig _config; + private readonly string _configPath; + private readonly ServerProcess _proc; + private readonly Broadcaster _broadcast; + private readonly Action _log; + private readonly SemaphoreSlim _gate = new(1, 1); + + private CancellationTokenSource? _cts; + public UpdateState State { get; private set; } = new(); + + public sealed class UpdateState + { + public bool InProgress { get; set; } + public string Phase { get; set; } = "idle"; + // "idle" | "countdown" | "stopping" | "syncing" | "installing_loader" | "starting" | "complete" | "failed" | "cancelled" + public int CountdownTotal { get; set; } + public int CountdownRemaining { get; set; } + public string? CurrentVersion { get; set; } + public string? AvailableVersion { get; set; } + public string? Error { get; set; } + public DateTimeOffset? LastFinishedAt { get; set; } + } + + public sealed record CheckResult(string? Current, string? Available, bool NeedsUpdate, string? Error); + + public UpdaterService(ServerConfig config, string configPath, + ServerProcess proc, Broadcaster broadcast, + Action log) + { + _config = config; + _configPath = configPath; + _proc = proc; + _broadcast = broadcast; + _log = log; + } + + /// Lightweight read: compare local pack-version.json to remote manifest. + public async Task CheckAsync(CancellationToken ct = default) + { + try + { + var sync = new ManifestSync(); + var manifest = await sync.FetchManifestAsync(_config.ManifestUrl, ct); + var local = ReadLocalPackVersion(_config.ServerDir); + var current = local; + var available = manifest.Version; + var needs = !string.Equals(current, available, StringComparison.Ordinal); + State.CurrentVersion = current; + State.AvailableVersion = available; + return new CheckResult(current, available, needs, null); + } + catch (Exception ex) + { + return new CheckResult(State.CurrentVersion, State.AvailableVersion, false, ex.Message); + } + } + + public bool TryCancel() + { + if (!State.InProgress || _cts is null) return false; + // Only meaningful during countdown phase -- a sync mid-flight isn't safely abortable. + if (State.Phase != "countdown") return false; + _cts.Cancel(); + return true; + } + + /// + /// Run the full update flow. Single-flight -- returns false if one is already running. + /// + public async Task StartAsync(int delaySeconds) + { + if (!await _gate.WaitAsync(0)) return false; + _cts = new CancellationTokenSource(); + var ct = _cts.Token; + + State = new UpdateState + { + InProgress = true, + Phase = "countdown", + CountdownTotal = delaySeconds, + CountdownRemaining = delaySeconds, + CurrentVersion = State.CurrentVersion, + AvailableVersion = State.AvailableVersion, + }; + + try + { + // ── 1. Player-facing countdown ── + if (delaySeconds > 0 && _proc.IsRunning) + { + _log($"[update] Announcing restart in {delaySeconds}s."); + await _broadcast.SayAsync($"Server will restart in {FormatDuration(delaySeconds)} for an update to v{State.AvailableVersion}.", ct); + + // Run the action-bar countdown + periodic chat warnings + UI ticker + // in parallel. Action bar (instead of boss bar) avoids stacking on + // top of real boss fight UIs (Ender Dragon, raids, mod bosses). + var actionBar = _broadcast.ActionBarCountdownAsync( + "Server restart for update", delaySeconds, ct); + + var warnings = WarnDuringCountdownAsync(delaySeconds, ct); + + // Drive State.CountdownRemaining for the UI poller. + var ticker = TickCountdownStateAsync(delaySeconds, ct); + + await Task.WhenAll(actionBar, warnings, ticker); + } + + // ── 2. Stop MC ── + ct.ThrowIfCancellationRequested(); + State.Phase = "stopping"; + _log("[update] Stopping Minecraft for update..."); + if (_proc.IsRunning) + { + await _broadcast.SayAsync("Server is restarting now."); + await _proc.StopAsync(TimeSpan.FromSeconds(30)); + } + + // ── 3. Sync mods from manifest ── + ct.ThrowIfCancellationRequested(); + State.Phase = "syncing"; + _log("[update] Syncing mods from manifest..."); + var sync = new ManifestSync(); + var progress = new Progress(msg => _log($"[update] {msg}")); + var result = await sync.SyncAsync(_config.ManifestUrl, _config.ServerDir, progress, ct); + _log($"[update] Sync complete: {result.Downloaded} downloaded, {result.Removed} removed."); + + // ── 4. Update NeoForge if loader version changed ── + ct.ThrowIfCancellationRequested(); + var manifest = await sync.FetchManifestAsync(_config.ManifestUrl, ct); + if (manifest.Loader is { } loader && + loader.Type.Equals("neoforge", StringComparison.OrdinalIgnoreCase) && + LoaderVersionChanged(_config.ServerDir, loader.Version)) + { + State.Phase = "installing_loader"; + _log($"[update] Reinstalling NeoForge {loader.Version}..."); + var nf = new NeoForgeInstaller(); + var ok = await nf.InstallAsync(loader.Version, _config.ServerDir, _config.JavaPath, progress, ct); + if (!ok) throw new InvalidOperationException("NeoForge installer failed."); + } + + // ── 5. Start MC ── + ct.ThrowIfCancellationRequested(); + State.Phase = "starting"; + _log("[update] Starting Minecraft..."); + _proc.Start(); + State.CurrentVersion = manifest.Version; + + State.Phase = "complete"; + State.InProgress = false; + State.LastFinishedAt = DateTimeOffset.UtcNow; + _log("[update] Update complete."); + return true; + } + catch (OperationCanceledException) + { + State.Phase = "cancelled"; + State.InProgress = false; + State.LastFinishedAt = DateTimeOffset.UtcNow; + _log("[update] Update cancelled."); + // If we cancelled during countdown, MC is still running -- leave it alone. + return false; + } + catch (Exception ex) + { + State.Phase = "failed"; + State.Error = ex.Message; + State.InProgress = false; + State.LastFinishedAt = DateTimeOffset.UtcNow; + _log($"[update] Failed: {ex.Message}"); + // Try to bring MC back up if we stopped it but never restarted. + if (!_proc.IsRunning) + { + try { _proc.Start(); _log("[update] Restored Minecraft after failure."); } + catch (Exception startEx) { _log($"[update] Restore failed too: {startEx.Message}"); } + } + return false; + } + finally + { + _cts?.Dispose(); + _cts = null; + _gate.Release(); + } + } + + private async Task TickCountdownStateAsync(int total, CancellationToken ct) + { + for (int sec = total; sec > 0; sec--) + { + ct.ThrowIfCancellationRequested(); + State.CountdownRemaining = sec; + try { await Task.Delay(1000, ct); } + catch (OperationCanceledException) { throw; } + } + State.CountdownRemaining = 0; + } + + private async Task WarnDuringCountdownAsync(int total, CancellationToken ct) + { + // Periodic chat warnings -- independent of the boss bar (visual-but-missable). + // Each milestone fires at an absolute time computed from the start, so the + // delays don't accumulate sequentially across the loop iterations. + var startUtc = DateTime.UtcNow; + var milestones = new[] { 300, 60, 30, 10 }; + foreach (var m in milestones) + { + if (m >= total) continue; + var fireAt = startUtc.AddSeconds(total - m); + var wait = fireAt - DateTime.UtcNow; + if (wait > TimeSpan.Zero) + { + try { await Task.Delay(wait, ct); } + catch (OperationCanceledException) { throw; } + } + try { await _broadcast.SayAsync($"Server restart in {FormatDuration(m)}."); } + catch { /* don't bring down the whole update for one failed broadcast */ } + } + } + + private static bool LoaderVersionChanged(string serverDir, string newVersion) + { + // Look at the libraries dir for an existing neoforge- path. + // If absent or different version, we should re-install. + var libsRoot = Path.Combine(serverDir, "libraries", "net", "neoforged", "neoforge"); + if (!Directory.Exists(libsRoot)) return true; + var versions = Directory.EnumerateDirectories(libsRoot).Select(Path.GetFileName).ToList(); + return !versions.Contains(newVersion); + } + + private static string? ReadLocalPackVersion(string serverDir) + { + var path = Path.Combine(serverDir, "pack-version.json"); + if (!File.Exists(path)) return null; + try + { + using var doc = JsonDocument.Parse(File.ReadAllText(path)); + return doc.RootElement.TryGetProperty("version", out var v) ? v.GetString() : null; + } + catch { return null; } + } + + private static string FormatDuration(int seconds) + { + if (seconds >= 60) return $"{seconds / 60} minute{(seconds / 60 == 1 ? "" : "s")}"; + return $"{seconds} second{(seconds == 1 ? "" : "s")}"; + } +} diff --git a/server/Services/WhitelistRequestService.cs b/server/Services/WhitelistRequestService.cs new file mode 100644 index 0000000..4cf1172 --- /dev/null +++ b/server/Services/WhitelistRequestService.cs @@ -0,0 +1,145 @@ +using System.Text.Json; +using BrassAndSigil.Server.Models; + +namespace BrassAndSigil.Server.Services; + +/// +/// Tracks "I want to play" requests from friends, pending admin approval. +/// State is a flat JSON file in the server dir so it survives daemon restarts +/// without needing a database. Single-flight gate prevents concurrent-write +/// corruption when admin and friend act at the same time. +/// +/// State machine: (none) -> pending -> approved | denied +/// "approved" means the admin clicked Approve; the actual /whitelist add +/// command goes through the existing whitelist endpoint, which removes the +/// request from the pending list. +/// +public sealed class WhitelistRequestService +{ + private readonly ServerConfig _config; + private readonly object _lock = new(); + + public WhitelistRequestService(ServerConfig config) => _config = config; + + public sealed class Request + { + public string Username { get; set; } = ""; + public string? Message { get; set; } + public string Status { get; set; } = "pending"; // pending | approved | denied + public DateTimeOffset RequestedAt { get; set; } + public DateTimeOffset? ResolvedAt { get; set; } + public string? RemoteIp { get; set; } // for admin diagnosis if needed + } + + private string FilePath => + Path.Combine(Path.GetFullPath(_config.ServerDir), "whitelist-requests.json"); + + private List Load() + { + try + { + if (!File.Exists(FilePath)) return new(); + var text = File.ReadAllText(FilePath); + if (string.IsNullOrWhiteSpace(text)) return new(); + return JsonSerializer.Deserialize>(text, JsonOpts.CaseInsensitive) ?? new(); + } + catch { return new(); } + } + + private void Save(List list) + { + var text = JsonSerializer.Serialize(list, JsonOpts.Pretty); + File.WriteAllText(FilePath, text); + } + + public IReadOnlyList List() { lock (_lock) return Load(); } + + public IReadOnlyList ListPending() + { + lock (_lock) + return Load().Where(r => r.Status == "pending").ToList(); + } + + /// Submit a new request. Idempotent on (username, status=pending) -- won't dupe. + public Request Submit(string username, string? message, string? remoteIp) + { + lock (_lock) + { + var list = Load(); + // Drop any prior request for this username (case-insensitive) so the + // most recent one wins regardless of previous state. Keeps the file + // from growing if a friend re-requests after a denial. + list.RemoveAll(r => r.Username.Equals(username, StringComparison.OrdinalIgnoreCase)); + var req = new Request + { + Username = username, + Message = string.IsNullOrWhiteSpace(message) ? null : message, + Status = "pending", + RequestedAt = DateTimeOffset.UtcNow, + RemoteIp = remoteIp, + }; + list.Add(req); + Save(list); + return req; + } + } + + /// + /// Effective status for the launcher. If the username is in the actual + /// whitelist.json (regardless of whether they ever filed a request), returns + /// "approved" -- that's what the friend's launcher cares about. Otherwise + /// falls back to whatever request record we have, or "unknown". + /// + public string StatusFor(string username) + { + if (IsActuallyWhitelisted(username)) return "approved"; + lock (_lock) + { + var match = Load().FirstOrDefault(r => r.Username.Equals(username, StringComparison.OrdinalIgnoreCase)); + return match?.Status ?? "unknown"; + } + } + + private bool IsActuallyWhitelisted(string username) + { + var path = Path.Combine(Path.GetFullPath(_config.ServerDir), "whitelist.json"); + if (!File.Exists(path)) return false; + try + { + using var doc = JsonDocument.Parse(File.ReadAllText(path)); + return doc.RootElement.EnumerateArray().Any(e => + e.TryGetProperty("name", out var n) && + string.Equals(n.GetString(), username, StringComparison.OrdinalIgnoreCase)); + } + catch { return false; } + } + + public bool MarkApproved(string username) => SetStatus(username, "approved"); + public bool MarkDenied(string username) => SetStatus(username, "denied"); + + /// Remove the request entirely (used after the actual /whitelist add fires). + public bool Remove(string username) + { + lock (_lock) + { + var list = Load(); + var removed = list.RemoveAll(r => r.Username.Equals(username, StringComparison.OrdinalIgnoreCase)); + if (removed > 0) Save(list); + return removed > 0; + } + } + + private bool SetStatus(string username, string status) + { + lock (_lock) + { + var list = Load(); + var match = list.FirstOrDefault(r => r.Username.Equals(username, StringComparison.OrdinalIgnoreCase)); + if (match is null) return false; + match.Status = status; + match.ResolvedAt = DateTimeOffset.UtcNow; + Save(list); + return true; + } + } +} diff --git a/server/Services/WindowsJobObject.cs b/server/Services/WindowsJobObject.cs new file mode 100644 index 0000000..2e03bb2 --- /dev/null +++ b/server/Services/WindowsJobObject.cs @@ -0,0 +1,124 @@ +using System.ComponentModel; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace BrassAndSigil.Server.Services; + +/// +/// Wraps a Windows Job Object configured with KILL_ON_JOB_CLOSE so that any process +/// assigned to it dies the moment our process does -- regardless of *how* we died +/// (X-button on the console, Task Manager End Task, parent BSOD, etc.). Without +/// this, a Java subprocess can outlive us and keep the server files locked. +/// +/// On Linux, use systemd's cgroup management instead; the equivalent guarantee +/// comes for free when the tool runs as a systemd unit. +/// +public sealed class WindowsJobObject : IDisposable +{ + private const int JobObjectExtendedLimitInformation = 9; + private const uint JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x2000; + + [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] + private static extern IntPtr CreateJobObject(IntPtr lpJobAttributes, string? lpName); + + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool SetInformationJobObject(IntPtr hJob, int infoType, IntPtr lpJobObjectInfo, uint cbJobObjectInfoLength); + + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool AssignProcessToJobObject(IntPtr hJob, IntPtr hProcess); + + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool CloseHandle(IntPtr hObject); + + [StructLayout(LayoutKind.Sequential)] + private struct JOBOBJECT_BASIC_LIMIT_INFORMATION + { + public long PerProcessUserTimeLimit; + public long PerJobUserTimeLimit; + public uint LimitFlags; + public UIntPtr MinimumWorkingSetSize; + public UIntPtr MaximumWorkingSetSize; + public uint ActiveProcessLimit; + public UIntPtr Affinity; + public uint PriorityClass; + public uint SchedulingClass; + } + + [StructLayout(LayoutKind.Sequential)] + private struct IO_COUNTERS + { + public ulong ReadOperationCount; + public ulong WriteOperationCount; + public ulong OtherOperationCount; + public ulong ReadTransferCount; + public ulong WriteTransferCount; + public ulong OtherTransferCount; + } + + [StructLayout(LayoutKind.Sequential)] + private struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION + { + public JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; + public IO_COUNTERS IoInfo; + public UIntPtr ProcessMemoryLimit; + public UIntPtr JobMemoryLimit; + public UIntPtr PeakProcessMemoryUsed; + public UIntPtr PeakJobMemoryUsed; + } + + private IntPtr _handle; + private bool _disposed; + + public WindowsJobObject() + { + if (!OperatingSystem.IsWindows()) + throw new PlatformNotSupportedException("WindowsJobObject only works on Windows."); + + _handle = CreateJobObject(IntPtr.Zero, null); + if (_handle == IntPtr.Zero) throw new Win32Exception(Marshal.GetLastWin32Error(), "CreateJobObject failed"); + + var info = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION + { + BasicLimitInformation = new JOBOBJECT_BASIC_LIMIT_INFORMATION + { + LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE + } + }; + var size = Marshal.SizeOf(info); + var ptr = Marshal.AllocHGlobal(size); + try + { + Marshal.StructureToPtr(info, ptr, fDeleteOld: false); + if (!SetInformationJobObject(_handle, JobObjectExtendedLimitInformation, ptr, (uint)size)) + throw new Win32Exception(Marshal.GetLastWin32Error(), "SetInformationJobObject failed"); + } + finally + { + Marshal.FreeHGlobal(ptr); + } + } + + public void AssignProcess(Process process) + { + if (_disposed) throw new ObjectDisposedException(nameof(WindowsJobObject)); + if (!AssignProcessToJobObject(_handle, process.Handle)) + throw new Win32Exception(Marshal.GetLastWin32Error(), "AssignProcessToJobObject failed"); + } + + public void Dispose() + { + if (_disposed) return; + _disposed = true; + if (_handle != IntPtr.Zero) + { + CloseHandle(_handle); // Closing the last handle triggers KILL_ON_JOB_CLOSE + _handle = IntPtr.Zero; + } + GC.SuppressFinalize(this); + } + + ~WindowsJobObject() => Dispose(); +} diff --git a/server/Services/WorldService.cs b/server/Services/WorldService.cs new file mode 100644 index 0000000..81f78d1 --- /dev/null +++ b/server/Services/WorldService.cs @@ -0,0 +1,229 @@ +using System.Text.RegularExpressions; +using BrassAndSigil.Server.Models; + +namespace BrassAndSigil.Server.Services; + +/// +/// Destructive world operations -- wipe and replace. Always single-flight, always +/// stops the server first, and offers a rename-as-backup default so an accidental +/// click doesn't lose data permanently. +/// +public sealed class WorldService +{ + private readonly ServerConfig _config; + private readonly ServerProcess _proc; + private readonly BackupService _backup; + private readonly Broadcaster _broadcast; + private readonly RconManager _rcon; + private readonly BlueMapService? _bluemap; + private readonly Action _log; + private readonly SemaphoreSlim _lock = new(1, 1); + + public WorldService(ServerConfig config, ServerProcess proc, BackupService backup, + Broadcaster broadcast, RconManager rcon, Action log, + BlueMapService? bluemap = null) + { + _config = config; + _proc = proc; + _backup = backup; + _broadcast = broadcast; + _rcon = rcon; + _bluemap = bluemap; + _log = log; + } + + public sealed record WipeResult(bool Ok, string? BackupName, string? SeedUsed, string? Error); + + /// + /// What seed strategy a wipe should use: + /// + /// Keep -- capture the live seed via RCON before wipe and reuse it. + /// Random -- clear level-seed so MC picks a fresh random one. + /// Custom -- set level-seed to . + /// + /// + public enum SeedMode { Keep, Random, Custom } + + public sealed record WipeOptions(bool Backup, SeedMode Mode, string? CustomSeed); + + /// + /// Best-effort lookup of the current world seed. Prefers RCON's seed + /// command (always returns the actual generated seed even when + /// server.properties has level-seed empty); falls back to the configured + /// level-seed value if RCON is unavailable (server stopped, no MC, etc.). + /// Returns null when neither is available. + /// + public async Task GetCurrentSeedAsync(CancellationToken ct = default) + { + if (_proc.IsRunning) + { + try + { + var resp = await _rcon.SendCommandAsync("seed", ct); + // Format: "Seed: []" + var m = Regex.Match(resp, @"Seed:\s*\[(-?\d+)\]"); + if (m.Success) return m.Groups[1].Value; + } + catch { /* fall through to properties */ } + } + return new ServerPropertiesService(_config).GetLevelSeed(); + } + + // Caching world size: scanning a large world dir is O(file count). 30 s cache + // dampens that to roughly once per status poll cycle on busy panels. + private long _cachedSize; + private DateTime _cachedAt = DateTime.MinValue; + + public long GetWorldSizeBytes() + { + if ((DateTime.UtcNow - _cachedAt) < TimeSpan.FromSeconds(30)) return _cachedSize; + var levelName = ReadLevelName(_config.ServerDir) ?? "world"; + var worldDir = Path.Combine(Path.GetFullPath(_config.ServerDir), levelName); + if (!Directory.Exists(worldDir)) { _cachedSize = 0; _cachedAt = DateTime.UtcNow; return 0; } + long total = 0; + try + { + foreach (var f in Directory.EnumerateFiles(worldDir, "*", SearchOption.AllDirectories)) + { + try { total += new FileInfo(f).Length; } catch { } + } + } + catch { } + _cachedSize = total; + _cachedAt = DateTime.UtcNow; + return total; + } + + /// + /// Stop the server, optionally archive the world via BackupService, delete the + /// world folder(s), apply the chosen seed strategy, then restart. Backups go + /// to the configured backup dir (typically a slower-but-bigger drive) rather + /// than next to the world dir. + /// + public async Task WipeWorldAsync(WipeOptions options, int warningSeconds = 30, CancellationToken ct = default) + { + if (!await _lock.WaitAsync(0, ct)) + return new WipeResult(false, null, null, "Another wipe is already in progress."); + + try + { + var serverDir = Path.GetFullPath(_config.ServerDir); + var levelName = ReadLevelName(serverDir) ?? "world"; + var primaryWorld = Path.Combine(serverDir, levelName); + var props = new ServerPropertiesService(_config); + + // ── Decide what seed the new world will use, BEFORE we stop the server ── + // Keep mode needs RCON, which only works while MC is alive. + string seedToWrite; // value for level-seed= line; "" means random + string? capturedSeed = null; + switch (options.Mode) + { + case SeedMode.Keep: + capturedSeed = await GetCurrentSeedAsync(ct); + if (string.IsNullOrEmpty(capturedSeed)) + { + return new WipeResult(false, null, null, + "Couldn't read current seed (RCON unreachable + level-seed empty). Stop the server, set level-seed manually, or pick Random/Custom."); + } + seedToWrite = capturedSeed; + _log($"[wipe] Keep-seed mode: captured current seed {capturedSeed} for reuse."); + break; + case SeedMode.Custom: + var custom = options.CustomSeed?.Trim() ?? ""; + if (string.IsNullOrEmpty(custom)) + return new WipeResult(false, null, null, "Custom seed mode selected but no seed provided."); + seedToWrite = custom; + _log($"[wipe] Custom-seed mode: new world will use seed {custom}."); + break; + default: // Random + seedToWrite = ""; + _log("[wipe] Random-seed mode: clearing level-seed so MC generates a fresh seed."); + break; + } + + // Loud, urgent player warning before any irreversible action -- wipe is + // destructive even with a backup (admins still need to restore manually). + if (warningSeconds > 0 && _proc.IsRunning) + { + _log($"[wipe] Announcing {warningSeconds}s wipe warning to players..."); + try + { + await _broadcast.SayAsync( + $"WORLD WIPE in {warningSeconds} seconds. Disconnect now if you want to keep your current world!", ct); + await _broadcast.ActionBarCountdownAsync("WORLD WIPING", warningSeconds, ct); + await _broadcast.SayAsync("Wiping world now."); + } + catch (OperationCanceledException) { throw; } + catch { /* don't abort wipe over a broadcast error */ } + } + + string? backupName = null; + if (options.Backup && Directory.Exists(primaryWorld)) + { + _log("[wipe] Creating backup before wipe..."); + // flush:true here -- we're about to delete the world. Capture every block + // and every move up to right now, even at the cost of a tick spike. + var br = await _backup.CreateAsync("pre-wipe", flush: true, ct: ct); + if (!br.Ok) + return new WipeResult(false, null, null, $"Backup failed: {br.Error}. Wipe aborted to preserve data."); + backupName = br.Name; + } + + if (_proc.IsRunning) + { + _log("[wipe] Stopping server..."); + await _proc.StopAsync(TimeSpan.FromSeconds(30), ct); + } + + if (Directory.Exists(primaryWorld)) + { + _log($"[wipe] Deleting {primaryWorld}"); + Directory.Delete(primaryWorld, recursive: true); + } + // Legacy sibling dirs (rare on modern NeoForge but cheap to handle) + foreach (var altSuffix in new[] { "_nether", "_the_end" }) + { + var altDir = Path.Combine(serverDir, levelName + altSuffix); + if (!Directory.Exists(altDir)) continue; + _log($"[wipe] Deleting {altDir}"); + Directory.Delete(altDir, recursive: true); + } + + // Apply the seed AFTER deletion but BEFORE restart -- MC reads + // server.properties at startup to determine the new world's seed. + props.SetLevelSeed(seedToWrite); + + // Map output for the now-deleted world is stale -- clear it so the next + // render starts fresh against the new terrain. + _bluemap?.ClearRenderOutput(); + + _log("[wipe] World wiped. Restarting server -- Minecraft will generate a fresh world."); + _proc.Start(); + // For Random mode we don't know the exact new seed yet (MC picks at startup); + // return the level-seed value we wrote, which is "" for random. + return new WipeResult(true, backupName, string.IsNullOrEmpty(seedToWrite) ? null : seedToWrite, null); + } + catch (Exception ex) + { + _log($"[wipe] Failed: {ex.Message}"); + try { if (!_proc.IsRunning) _proc.Start(); } catch { } + return new WipeResult(false, null, null, ex.Message); + } + finally + { + _lock.Release(); + } + } + + private static string? ReadLevelName(string serverDir) + { + var path = Path.Combine(serverDir, "server.properties"); + if (!File.Exists(path)) return null; + foreach (var line in File.ReadAllLines(path)) + { + if (line.StartsWith("level-name=", StringComparison.Ordinal)) + return line.Substring("level-name=".Length).Trim(); + } + return null; + } +} diff --git a/server/deploy/Caddyfile b/server/deploy/Caddyfile new file mode 100644 index 0000000..aefbead --- /dev/null +++ b/server/deploy/Caddyfile @@ -0,0 +1,50 @@ +# Caddyfile for the brass-sigil-server web panel. +# +# Caddy auto-fetches and renews a Let's Encrypt cert for your domain, +# so HTTPS just works once DNS is pointed at the server and ports 80 + 443 +# are open. +# +# Prereqs: +# 1. A domain name (e.g. panel.example.com) with an A/AAAA record pointing +# at this server's public IP. Let's Encrypt does NOT issue certs for +# raw IPs -- you need a hostname. +# 2. Inbound 80 (for the HTTP-01 ACME challenge) and 443 (for the panel) +# open in your firewall and in any cloud security group. +# 3. Caddy installed: +# sudo apt install caddy # Debian / Ubuntu +# brew install caddy # macOS +# winget install CaddyServer.Caddy # Windows +# 4. brass-sigil-server running on localhost:8080 with webHost: localhost +# and webPassword set (use `brass-sigil-server set-password` if you +# haven't already). +# +# Install: +# Linux package: replace /etc/caddy/Caddyfile with this file, then +# sudo systemctl reload caddy +# Manual: caddy run --config Caddyfile + +panel.example.com { + encode gzip + + reverse_proxy localhost:8080 { + # SSE log stream uses chunked streaming responses -- Caddy must not + # buffer them, otherwise console updates arrive in batches every minute + # instead of in real time. + flush_interval -1 + + # Pass the real client IP through. brass-sigil-server's ForwardedHeaders + # middleware honours this so the per-IP login rate limit partitions + # correctly (10 attempts / minute / IP). + header_up X-Forwarded-For {remote_host} + header_up X-Real-IP {remote_host} + } + + # Sensible hardening defaults. + header { + Strict-Transport-Security "max-age=31536000; includeSubDomains" + X-Content-Type-Options "nosniff" + X-Frame-Options "DENY" + Referrer-Policy "strict-origin-when-cross-origin" + -Server + } +} diff --git a/server/deploy/bns-admin.sijbers.uk.conf b/server/deploy/bns-admin.sijbers.uk.conf new file mode 100644 index 0000000..9685fe3 --- /dev/null +++ b/server/deploy/bns-admin.sijbers.uk.conf @@ -0,0 +1,27 @@ +# /etc/apache2/sites-available/bns-admin.sijbers.uk.conf +# +# Reverse-proxy vhost for the brass-sigil-server admin panel. +# certbot will manage the SSL config (certificate paths, redirect from :80, etc.) +# when run as: sudo certbot --apache -d bns-admin.sijbers.uk + + + ServerName bns-admin.sijbers.uk + + ProxyPreserveHost On + ProxyRequests Off + + # SSE log stream needs streaming responses, not buffered ones. + SetEnv no-gzip 1 + SetEnv proxy-sendcl 1 + + # `flushpackets=on` is the SSE-critical bit on Apache -- pushes each chunk + # straight through instead of batching for ~60 s. + ProxyPass / http://127.0.0.1:8080/ flushpackets=on keepalive=On + ProxyPassReverse / http://127.0.0.1:8080/ + + # So brass-sigil-server's rate limiter sees the real client IP, not 127.0.0.1. + RequestHeader set X-Forwarded-Proto "https" + + ErrorLog ${APACHE_LOG_DIR}/bns-admin.sijbers.uk-error.log + CustomLog ${APACHE_LOG_DIR}/bns-admin.sijbers.uk-access.log combined + diff --git a/server/deploy/brass-and-sigil.html b/server/deploy/brass-and-sigil.html new file mode 100644 index 0000000..f173ba6 --- /dev/null +++ b/server/deploy/brass-and-sigil.html @@ -0,0 +1,284 @@ + + + + + + + + Brass & Sigil Launcher -- Matt Sijbers + + + + + + + + + + +
    + Back to portfolio + +
    +

    Brass & Sigil Launcher

    +

    A private custom Minecraft Java Edition launcher for a small friend group.

    +
    + C# / .NET 8 + Avalonia + CmlLib.Core + Single-file Windows + Private project +
    + +

    + + You'll need to be whitelisted on the server to actually join — message Matt with your Minecraft username. +

    +
    + +
    +

    About the project

    +

    + Brass & Sigil is a private Minecraft modpack centred on the Create mod, aeronautics, tech and magic mods, + with Distant Horizons for far-render exploration. This launcher is the desktop client built specifically + to distribute the pack to a small friend group (under 50 players, no public release). +

    +

    + The launcher is a native Windows application written in C# on .NET 8, using the Avalonia UI framework. + It ships as a single self-contained executable so friends can just download and run it — no installer, + no .NET runtime to install, no separate config files. +

    +
    + +
    +

    What it does

    +
      +
    • Fetches a JSON manifest from a self-hosted server and syncs the modpack files (mods, configs, resourcepacks) to the player's local install directory, using SHA-1 hashing so only changed files are downloaded.
    • +
    • Authenticates the player with their own personal Microsoft account via the standard MSAL OAuth flow, so only legitimate Minecraft Java Edition owners can sign in.
    • +
    • Installs the right Minecraft version and Forge loader, then launches the game with the configured memory and the player's session.
    • +
    • Auto-updates the modpack on every launch when the manifest changes — players never have to manually install or update mods.
    • +
    +
    + +
    +

    Technical details

    +
    +
    +

    Language

    +

    C# (.NET 8)

    +
    +
    +

    UI Framework

    +

    Avalonia 12

    +
    +
    +

    Minecraft auth

    +

    CmlLib.Core.Auth.Microsoft

    +
    +
    +

    Game launching

    +

    CmlLib.Core 4.x + Forge installer

    +
    +
    +

    Distribution

    +

    Single-file self-contained .exe

    +
    +
    +

    Audience

    +

    Private friend group (< 50)

    +
    +
    +
    + +
    +

    Privacy & data

    +

    + The launcher does not collect, store, or transmit any user data beyond what the standard Microsoft and + Minecraft authentication flows require. Auth tokens are cached locally on the player's machine via the + MSAL token cache — no telemetry, no analytics, no third-party services beyond Microsoft and Mojang. +

    +

    + The modpack manifest and mod files are served from a self-hosted Linux server that I personally operate. +

    +
    + +
    +

    Status

    +

    + Active development. The launcher is functional end-to-end (manifest sync, Microsoft auth, Forge install, + game launch) and is currently being prepared for distribution to a small group of friends. +

    +

    + Source code is publicly available, MIT-licensed, on my self-hosted Bitbucket: + sijbers.uk:8443/.../brass-and-sigil-launcher. +

    +
    + +
    +

    + NOT AN OFFICIAL MINECRAFT PRODUCT. NOT APPROVED BY OR ASSOCIATED WITH MOJANG OR MICROSOFT. +

    +
    + +
    + Brass & Sigil Launcher — a private project by Matt Sijbers. +
    +
    + + + diff --git a/server/deploy/brass-sigil-server.service b/server/deploy/brass-sigil-server.service new file mode 100644 index 0000000..5106d2b --- /dev/null +++ b/server/deploy/brass-sigil-server.service @@ -0,0 +1,26 @@ +[Unit] +Description=Brass & Sigil Minecraft server (with web admin panel) +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +User=matt +Group=matt +WorkingDirectory=/home/matt/brass-sigil-server +ExecStart=/home/matt/brass-sigil-server/brass-sigil-server run +Restart=on-failure +RestartSec=10s + +# Give the JVM enough room to start up gracefully on Stop (sends "stop" to MC, +# waits for clean shutdown, then escalates to SIGTERM/SIGKILL). +TimeoutStopSec=60s +KillMode=mixed + +# Tighten attack surface -- typical for a service running as a regular user. +PrivateTmp=true +ProtectSystem=full +NoNewPrivileges=true + +[Install] +WantedBy=multi-user.target diff --git a/server/deploy/cleanup-sudo.sh b/server/deploy/cleanup-sudo.sh new file mode 100644 index 0000000..30c4813 --- /dev/null +++ b/server/deploy/cleanup-sudo.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash +# Sudo cleanup script -- review before running. +# Removes dormant game servers (ARK, Valheim, Terraria), trims journald logs, +# caps snap revision retention. Does NOT touch Bitbucket, TeamViewer, or the +# matt-wakeford.co.uk / sijbers.uk / diceheart.com websites. +# +# Run with: sudo bash /tmp/cleanup-sudo.sh +# +# Set -e: abort on first error so we don't cascade-damage state. +set -euo pipefail + +echo "=== Pre-cleanup disk ===" +df -h / | grep -v Filesystem + +# ──────────────────────────────────────────────── +# 1. ARK server -- install, user, broken systemd unit +# ──────────────────────────────────────────────── +echo +echo "=== ARK ===" +if systemctl list-unit-files ark.service &>/dev/null; then + echo " Disabling ark.service" + systemctl disable --now ark.service 2>/dev/null || true +fi +if [[ -f /lib/systemd/system/ark.service ]]; then + echo " Removing /lib/systemd/system/ark.service" + rm -f /lib/systemd/system/ark.service +fi +if [[ -f /etc/systemd/system/ark.service ]]; then + echo " Removing /etc/systemd/system/ark.service" + rm -f /etc/systemd/system/ark.service +fi +if id ark &>/dev/null; then + # Make sure no processes are running as ark before userdel. + pkill -u ark 2>/dev/null || true + sleep 1 + echo " Removing 'ark' user + home" + userdel -r ark 2>/dev/null || userdel ark +fi + +# ──────────────────────────────────────────────── +# 2. Valheim (vhserver) -- LGSM stack +# ──────────────────────────────────────────────── +echo +echo "=== Valheim (vhserver) ===" +if id vhserver &>/dev/null; then + pkill -u vhserver 2>/dev/null || true + sleep 1 + echo " Removing 'vhserver' user + home (incl. orphaned LGSM backups)" + userdel -r vhserver 2>/dev/null || userdel vhserver +fi + +# ──────────────────────────────────────────────── +# 3. Terraria -- empty home, never used +# ──────────────────────────────────────────────── +echo +echo "=== Terraria ===" +if id Terraria &>/dev/null; then + pkill -u Terraria 2>/dev/null || true + echo " Removing 'Terraria' user + home" + userdel -r Terraria 2>/dev/null || userdel Terraria +fi + +# ──────────────────────────────────────────────── +# 4. systemd reload to forget the gone units +# ──────────────────────────────────────────────── +echo +echo "=== systemctl daemon-reload ===" +systemctl daemon-reload +systemctl reset-failed 2>/dev/null || true + +# ──────────────────────────────────────────────── +# 5. journald -- cap to 500 MB +# ──────────────────────────────────────────────── +echo +echo "=== journald ===" +echo " Trimming /var/log/journal to 500 MB" +journalctl --vacuum-size=500M + +# ──────────────────────────────────────────────── +# 6. snap -- only keep current + 1 prior revision +# ──────────────────────────────────────────────── +echo +echo "=== snap retention ===" +echo " Setting refresh.retain=2 (snap will auto-clean older revs over time)" +snap set system refresh.retain=2 + +# Force-clean orphaned _old.snap files older than 30 days. Snap will redo +# this organically but we can prod it now to reclaim immediately. +echo " Forcing snap to drop disabled revisions" +for snap in $(snap list --all | awk '/disabled/{print $1, $3}'); do + if [[ "$snap" == "disabled" ]]; then continue; fi +done +# Easier path: ask snap directly. +LANG=C snap list --all | awk '/disabled/{print $1, $3}' | \ + while read -r name rev; do + echo " snap remove --revision=$rev $name" + snap remove --revision="$rev" "$name" || true + done + +# ──────────────────────────────────────────────── +echo +echo "=== Post-cleanup disk ===" +df -h / | grep -v Filesystem +echo +echo "Done. Bitbucket, TeamViewer, and websites untouched." diff --git a/server/deploy/manifest.json b/server/deploy/manifest.json new file mode 100644 index 0000000..e3287af --- /dev/null +++ b/server/deploy/manifest.json @@ -0,0 +1,135 @@ +{ + "name": "Brass and Sigil", + "version": "0.6.1", + "minecraft": { + "version": "1.21.1" + }, + "loader": { + "type": "neoforge", + "version": "21.1.228" + }, + "files": [ + { + "path": "mods/create-1.21.1-6.0.10.jar", + "url": "https://cdn.modrinth.com/data/LNytGWDc/versions/UjX6dr61/create-1.21.1-6.0.10.jar", + "sha1": "0e97e49837bed766e6f28a4c95b04885d6acc353", + "size": 19123767 + }, + { + "path": "mods/create-aeronautics-bundled-1.21.1-1.2.1.jar", + "url": "https://cdn.modrinth.com/data/oWaK0Q19/versions/YhZLrAFC/create-aeronautics-bundled-1.21.1-1.2.1.jar", + "sha1": "fdf1ae69e8b6437e0196b3a35dd2325aa904aba9", + "size": 33030286 + }, + { + "path": "mods/sable-neoforge-1.21.1-1.2.2.jar", + "url": "https://cdn.modrinth.com/data/T9PomCSv/versions/3FMsUjO4/sable-neoforge-1.21.1-1.2.2.jar", + "sha1": "c5ecd3fcf60a31d84112c708abe29e341b2d1b73", + "size": 12719293 + }, + { + "path": "mods/createbigcannons-5.11.3+mc.1.21.1.jar", + "url": "https://cdn.modrinth.com/data/GWp4jCJj/versions/bsGaXKEd/createbigcannons-5.11.3%2Bmc.1.21.1.jar", + "sha1": "8b61fa850e260bdeb5d360576123f98c260afa50", + "size": 3715787 + }, + { + "path": "mods/tfmg-1.2.0.jar", + "url": "https://cdn.modrinth.com/data/USgVjXsk/versions/uDi14nbt/tfmg-1.2.0.jar", + "sha1": "b520f3687f60a69eb265ff5b9a16759b9e124103", + "size": 4924243 + }, + { + "path": "mods/DistantHorizons-3.0.2-b-1.21.1-fabric-neoforge.jar", + "url": "https://cdn.modrinth.com/data/uCdwusMi/versions/KkaaQtTD/DistantHorizons-3.0.2-b-1.21.1-fabric-neoforge.jar", + "sha1": "1ff0a8920e52add541471f7b32d0d389997145ba", + "size": 30019727 + }, + { + "path": "mods/sodium-neoforge-0.6.13+mc1.21.1.jar", + "url": "https://cdn.modrinth.com/data/AANobbMI/versions/Pb3OXVqC/sodium-neoforge-0.6.13%2Bmc1.21.1.jar", + "sha1": "38af70fa4dc4b2aaac636e92fdba3bedd5a025e1", + "size": 1162994 + }, + { + "path": "mods/iris-neoforge-1.8.12+mc1.21.1.jar", + "url": "https://cdn.modrinth.com/data/YL57xq9U/versions/t3ruzodq/iris-neoforge-1.8.12%2Bmc1.21.1.jar", + "sha1": "a3e6355915c7d3b2bc392724795113e51d289378", + "size": 2438548 + }, + { + "path": "mods/modernfix-neoforge-5.27.4+mc1.21.1.jar", + "url": "https://cdn.modrinth.com/data/nmDcB62a/versions/6U8JVjdw/modernfix-neoforge-5.27.4%2Bmc1.21.1.jar", + "sha1": "2f39363f0d6d5a5ccc2a9e0f50ad3385611c3cb7", + "size": 562051 + }, + { + "path": "mods/ferritecore-7.0.3-neoforge.jar", + "url": "https://cdn.modrinth.com/data/uXXizFIs/versions/x7kQWVju/ferritecore-7.0.3-neoforge.jar", + "sha1": "9563692efb708b6b568df27a01ec52f6311928ef", + "size": 121559 + }, + { + "path": "mods/architectury-13.0.8-neoforge.jar", + "url": "https://cdn.modrinth.com/data/lhGA9TYQ/versions/ZxYGwlk0/architectury-13.0.8-neoforge.jar", + "sha1": "6ca11d3cc136bf69bb8f4d56982481eb85b5100b", + "size": 584004 + }, + { + "path": "mods/rhino-2101.2.7-build.81.jar", + "url": "https://cdn.modrinth.com/data/sk9knFPE/versions/ZdLtebKH/rhino-2101.2.7-build.81.jar", + "sha1": "480235a9f7749f68ce6fec3b9c3cac3428b92a4a", + "size": 882033 + }, + { + "path": "mods/ritchiesprojectilelib-2.1.2+mc.1.21.1-neoforge.jar", + "url": "https://cdn.modrinth.com/data/B3pb093D/versions/hZ6B2Z0x/ritchiesprojectilelib-2.1.2%2Bmc.1.21.1-neoforge.jar", + "sha1": "ec2e4996f8bee8714173e603e379fef8a6901765", + "size": 76369 + }, + { + "path": "mods/kubejs-neoforge-2101.7.2-build.363.jar", + "url": "https://cdn.modrinth.com/data/umyGl7zF/versions/Fe9CjPws/kubejs-neoforge-2101.7.2-build.363.jar", + "sha1": "d4e88254e8c26687d4c6aeb4dfa9c2ad70f260a2", + "size": 2270442 + }, + { + "path": "mods/jei-1.21.1-neoforge-19.27.0.340.jar", + "url": "https://cdn.modrinth.com/data/u6dRKJwZ/versions/YAcQ6elZ/jei-1.21.1-neoforge-19.27.0.340.jar", + "sha1": "27d0d85e7e32e926fc3664ab6815df5cdabb7941", + "size": 1529391 + }, + { + "path": "mods/Jade-1.21.1-NeoForge-15.10.5.jar", + "url": "https://cdn.modrinth.com/data/nvQzSEkH/versions/yd8FKCmx/Jade-1.21.1-NeoForge-15.10.5.jar", + "sha1": "d5bf134b3dbde9f5258666823900e21341dc0a50", + "size": 725742 + }, + { + "path": "mods/Chunky-NeoForge-1.4.23.jar", + "url": "https://cdn.modrinth.com/data/fALzjamp/versions/LuFhm4eU/Chunky-NeoForge-1.4.23.jar", + "sha1": "ab0c74743a653020fe2dfc4986b43e893947f3e9", + "size": 340572 + }, + { + "path": "mods/ftb-library-neoforge-2101.1.31.jar", + "url": "https://mediafilez.forgecdn.net/files/7746/959/ftb-library-neoforge-2101.1.31.jar", + "sha1": "686d4e784c28c14f7760cc22b2de6a8573b56b74", + "size": 1411181 + }, + { + "path": "mods/ftb-teams-neoforge-2101.1.9.jar", + "url": "https://mediafilez.forgecdn.net/files/7369/21/ftb-teams-neoforge-2101.1.9.jar", + "sha1": "328e04bf1a445870aacea8fe7637670f84272a8f", + "size": 291847 + }, + { + "path": "mods/ftb-chunks-neoforge-2101.1.14.jar", + "url": "https://mediafilez.forgecdn.net/files/7608/681/ftb-chunks-neoforge-2101.1.14.jar", + "sha1": "908b63b11d0e00ae6c9557d3fe6440bdbcf21bb7", + "size": 642340 + } + ], + "launcherVersion": "0.1.0", + "launcherUrl": "https://sijbers.uk/pack/BrassAndSigil-Launcher.exe" +} \ No newline at end of file diff --git a/server/deploy/server-config.example.json b/server/deploy/server-config.example.json new file mode 100644 index 0000000..ee3a104 --- /dev/null +++ b/server/deploy/server-config.example.json @@ -0,0 +1,12 @@ +{ + "manifestUrl": "https://sijbers.uk/pack/manifest.json", + "serverDir": "./server", + "javaPath": "java", + "memoryMB": 8192, + "webPort": 8080, + "webHost": "localhost", + "webPassword": null, + "rconPort": 25575, + "rconPassword": "", + "acceptEula": false +} diff --git a/server/wwwroot/app.js b/server/wwwroot/app.js new file mode 100644 index 0000000..a3d5dcf --- /dev/null +++ b/server/wwwroot/app.js @@ -0,0 +1,42 @@ +"use strict"; + +import { tickStatus, tickPlayers, tickWhitelist, refreshWhitelistSoon } from "./modules/panels.js"; +import { setupConsole } from "./modules/console.js"; +import { setupAutocomplete } from "./modules/autocomplete.js"; +import { setupWhitelistActions } from "./modules/whitelist.js"; +import { setupServerControls } from "./modules/serverControls.js"; +import { setupPregen } from "./modules/pregen.js"; +import { setupAuth } from "./modules/auth.js"; +import { setupUpdate } from "./modules/update.js"; +import { setupDanger } from "./modules/danger.js"; +import { setupBackup } from "./modules/backup.js"; +import { setupModalTriggers } from "./modules/modal.js"; +import { setupSettings } from "./modules/settings.js"; +import { setupMap } from "./modules/map.js"; + +setupModalTriggers(); +setupAuth(); +setupConsole(); +setupAutocomplete(); +setupWhitelistActions(refreshWhitelistSoon); +setupServerControls(); +setupPregen(); +setupUpdate(); +setupBackup(); +setupDanger(); +setupSettings(); +setupMap(); + +// First paint +tickStatus(); +tickPlayers(); +tickWhitelist(); + +// Polling cadence: +// status 3 s -- pid/uptime/pack version (cheap, doesn't change much) +// players 10 s -- RCON `list` call; players join/leave infrequently +// whitelist 30 s -- file read; mostly relies on refresh-on-action via add/remove +// (Logs are NOT polled -- they stream live via Server-Sent Events from /api/logs/stream.) +setInterval(tickStatus, 3000); +setInterval(tickPlayers, 10000); +setInterval(tickWhitelist, 30000); diff --git a/server/wwwroot/favicon.png b/server/wwwroot/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..009e57735c12e817cefc841315b7a014c77c1289 GIT binary patch literal 8808 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

    qXl%VeBeU5KfdJpukP2_oV^(b7J;O=RQMZk zahI2bVn1`(Z&ZM_h6?h-*hgQU(Bi7Y-Od&f0se>z2}fXXG<-u-;1!V#x5ykAI7MTl zb2_*lWyowBqJsDubw?lK5X~1yXskBbGK7S>VRT#qrWQ^k(NztJ9x9~%*wdFpES)|Z z0ntA?1uc_j(p{AG5qJv?=+&KqSUhFD45z>1(03qJVHt@h|Ebi`zP7^3XN z5t|f?{+mE!=MdCLnMK&>;9`3MN`h>muON#!cN=)wn8DiE1W^ILl>3U{l0L9^@`sg6 zI23j5sSapB%QghAnLD5o*an}1Zgie|fvVYuIC^gdQOzguiAoH0hF$2r0Su4q0sG97 zolRmaIeg$TR0CpdS=vHURvq%HhKNruLR?-mtOg4^}#T65^e>(*s<`09|63xuc7JJ zLdwq=iIqI;r$ADJY1BP}TR1;Ase2(m;FAq?vg=F&uh5&BEqvIOvc+S;-l z4jrsn`rc<6Stu8lICeT{iamP{mtKn|4x#_JL%e!?}#&dV$rd) z8kL71p=9bIhDq6t5AvX?B#+gr#UZv{3Kj;2$V-VudsQhKE31%`Q;evDtq6$Ag>QT@ zypk&rUc|%Zj$O4Qx8o(!@ zF5Z~w$g*XID&3g_>>olk_@I{}fK7+vUE$c-mXGp@JE)j`h;2l|1Pwd0!|iY}R)MgP zI99EZ!WtnNC@Sm1ev>;wBNC}|6d^UQ7KsI|2+!FLx1=hV_-8}LCL8AQyU}#~J3@J9 zm(kN)gb-5^#KlG6WlSLbVWK zEd?Xar%+h^hgpfw-;I^|@^=LhHXMxAd(&v?inj77lpeT>vcp8cq5CK!FPeCOHVWS( z=Pu$vM?TH!=I}C=BQhkxx({Sxu-OU!>4~jKYaW=sLED z-i9PJY_UXBnhg@za3|35?65=Oo@g)6bflT_LCdfGpi1Pk-$ro0`pu-a*oP}&bV#Ma z8Z@s+-V_!6{67Vl{xY*rCV?vZ*?_j##}PUbUy2BB^G)Wg)z6o9~~9p*fw~H zLUswIllTARMdNfm{1iQBUSRyxd5jM6(ASiW)`Bq9XZWBtGXTxo;=${z#h#gYbS%6e z5+5Od>>+kiS2=xh6azIOC<@l28AFt|EC5V_}>FXE>BY2HLy7~7L^Uu4m)~LxoZ;D z2hO8<>OQJT##YX~;*(NLAPXiQBY*rc^2ph1!Ne03O+7=|k(X#X`ULx?k72AW3zZ>y zNVZet=lUOkv!Ty-x))ExkUD*RWXJb^8}!C)yfwnGnJRLEgEG=xl#t=crIBp`Yc2sM{P zsF@UPQikbFGX^is1a;xsDDq>U)ap?&v_x5=6RJ~OQJd;aBFmP57^2Ky1KG~XNTicZ zwv%VFJ-JLpm^Q;cg-UT!B)~FAuxE2$j@q6qLsur>TLrCYmR*AFyjk0^Bk^B|{qu45 z3h*%ygRhY|dJ}9Ocyq$)lL?C@IXP+sAnMg7uV&FraMN9l6$glbRW7*a34XppG?V3_#Iz$?#Zk$NZ~1r}k+ zVe);|m{1ZW!XLd;C0P2Fy7ZcNW!8P5DZT1n9l64}0Rc)~}$Cn0a zLP_X@BF@+E=_`nT`k~|0C?PPEL^{9@}q2WgfL@-lDuS-S|02O&8ifHH5pE#`sV{!pDOmCYOLbMgkm;&KCoaLC*;%K7hDmc& zAaL9Vf@MFj^&kJX$j?v|Wx<+Aqe$>Gl0dM9T#1jZ{%-_J{&wc5%@MX!S>0yKT?HM9 zPlw)m>;L``GR#`0y}(BeetII53gQSc5@!OaZsd5VAlg=TP_XPrZR3WIo9($@!$D1` z&)rZ)R&e|OA2U`E64T*)`HtZ2kD7y)uzy309<@y>W>oZ8rxRtGD93#b#1jR}e$JP+jDBtFmnq8WNvw6fFCDwvYZzTl~`@ zhmArvLTnTthTAGVaMoOZLs#na@y|d1g+t5#MBA`o!@rwrEB@Zrfcra5%?&^AFF5~U ee{Fl~t^Wf`V8HVE;F)Fs0000 + + + + + Brass & Sigil -- Server Panel + + + + +

    +
    + +

    BRASS & SIGIL -- SERVER

    +
    +
    Connecting…
    +
    + +
    + + +
    +
    +

    Console

    +
    Connecting to server log…
    +
    +
    +
    + +
    +
    + +
    +
    + Tab autocomplete · / history · Esc dismiss +
    +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + diff --git a/server/wwwroot/modules/api.js b/server/wwwroot/modules/api.js new file mode 100644 index 0000000..a018437 --- /dev/null +++ b/server/wwwroot/modules/api.js @@ -0,0 +1,28 @@ +// Tiny JSON API helper used by every module. +"use strict"; + +export async function api(path, opts) { + const res = await fetch(path, opts); + if (res.status === 401) { + // Auth cookie missing or wrong. Surface to the auth module which + // shows the login overlay; the caller still gets an error so any + // calling code stops cleanly. + document.dispatchEvent(new CustomEvent("authrequired")); + throw new Error("Unauthorized"); + } + if (!res.ok) throw new Error(`${path} → HTTP ${res.status}`); + return await res.json(); +} + +export async function apiJson(path, body, method = "POST") { + return api(path, { + method, + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body) + }); +} + +export function escapeHtml(s) { + return s.replace(/[&<>"']/g, c => + ({"&":"&","<":"<",">":">",'"':""","'":"'"}[c])); +} diff --git a/server/wwwroot/modules/auth.js b/server/wwwroot/modules/auth.js new file mode 100644 index 0000000..07edb5f --- /dev/null +++ b/server/wwwroot/modules/auth.js @@ -0,0 +1,115 @@ +// Login overlay + Account panel (logout / change password). +// +// Cookie is set server-side as HttpOnly so JS never sees it -- that defeats +// XSS-based exfiltration. We only briefly hold the password during input. +"use strict"; + +// We deliberately don't import apiJson here -- change-password returns its +// own error messages and we want to surface them verbatim to the user. + +let overlayShown = false; +function showOverlay() { + if (overlayShown) return; + overlayShown = true; + const overlay = document.getElementById("loginOverlay"); + if (overlay) { + overlay.hidden = false; + document.getElementById("loginPassword")?.focus(); + } +} + +export function setupAuth() { + document.addEventListener("authrequired", showOverlay); + setupLoginForm(); + setupAccountPanel(); +} + +function setupLoginForm() { + const overlay = document.getElementById("loginOverlay"); + const input = document.getElementById("loginPassword"); + const button = document.getElementById("loginSubmit"); + const errorEl = document.getElementById("loginError"); + if (!overlay || !input || !button || !errorEl) return; + + async function tryLogin() { + const pw = input.value; + if (!pw) return; + errorEl.textContent = ""; + button.disabled = true; + try { + const res = await fetch("/api/auth/login", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ password: pw }), + }); + if (res.status === 401) { errorEl.textContent = "Wrong password."; input.select(); return; } + if (res.status === 429) { errorEl.textContent = "Too many attempts. Wait a minute."; return; } + if (!res.ok) { errorEl.textContent = `Error ${res.status}`; return; } + // Server set the cookie. Reload so SSE / pollers pick it up. + location.reload(); + } catch (e) { + errorEl.textContent = e.message; + } finally { + button.disabled = false; + input.value = ""; + } + } + + button.addEventListener("click", tryLogin); + input.addEventListener("keydown", e => { if (e.key === "Enter") tryLogin(); }); +} + +function setupAccountPanel() { + const logoutBtn = document.getElementById("acctLogout"); + const changeBtn = document.getElementById("acctChangePw"); + const form = document.getElementById("acctChangeForm"); + const cur = document.getElementById("acctCurrent"); + const nxt = document.getElementById("acctNew"); + const cnf = document.getElementById("acctConfirm"); + const submit = document.getElementById("acctSubmit"); + const cancel = document.getElementById("acctCancel"); + const msg = document.getElementById("acctMsg"); + if (!logoutBtn || !changeBtn) return; + + logoutBtn.addEventListener("click", async () => { + if (!confirm("Log out of the panel?")) return; + try { await fetch("/api/auth/logout", { method: "POST" }); } + finally { location.reload(); } + }); + + changeBtn.addEventListener("click", () => { + form.hidden = !form.hidden; + msg.textContent = ""; + if (!form.hidden) cur.focus(); + }); + cancel.addEventListener("click", () => { + form.hidden = true; + cur.value = nxt.value = cnf.value = ""; + msg.textContent = ""; + }); + + submit.addEventListener("click", async () => { + msg.className = "acct-msg"; + msg.textContent = ""; + if (nxt.value.length < 8) { msg.textContent = "New password must be at least 8 characters."; return; } + if (nxt.value !== cnf.value) { msg.textContent = "New password and confirmation don't match."; return; } + submit.disabled = true; + try { + const res = await fetch("/api/auth/change-password", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ current: cur.value, next: nxt.value }), + }); + const body = await res.json().catch(() => ({})); + if (!res.ok) { msg.textContent = body.error || `Error ${res.status}`; return; } + msg.className = "acct-msg ok"; + msg.textContent = "Password changed."; + cur.value = nxt.value = cnf.value = ""; + setTimeout(() => { form.hidden = true; msg.textContent = ""; }, 1500); + } catch (e) { + msg.textContent = e.message; + } finally { + submit.disabled = false; + } + }); +} diff --git a/server/wwwroot/modules/autocomplete.js b/server/wwwroot/modules/autocomplete.js new file mode 100644 index 0000000..02facab --- /dev/null +++ b/server/wwwroot/modules/autocomplete.js @@ -0,0 +1,263 @@ +// Tab-completion + suggestion dropdown for the console command input. +// - Ghost text shows the top match inline (Tab to accept) +// - A dropdown list shows up to N matches with their argument signature +// (MC-style: [optional] for choices) +// - Click a list item to insert it; arrow keys + Enter also navigate the list +// when it's open +"use strict"; + +import { state } from "./state.js"; +import { escapeHtml } from "./api.js"; + +const COMMANDS = [ + "help", "list", "say", "tell", "msg", "me", "w", + "op", "deop", + "whitelist", "ban", "ban-ip", "pardon", "pardon-ip", "banlist", + "kick", + "tp", "teleport", + "give", "clear", "kill", + "gamemode", "gamerule", "difficulty", + "weather", "time", "seed", "spawnpoint", "setworldspawn", + "save-all", "save-on", "save-off", "stop", "reload", + "xp", "experience", "effect", "enchant", + "summon", "data", "execute", "fill", "setblock", "locate", "tag", + "ftbchunks", "ftbteams", + "chunky", + "kubejs", "kjs", +]; + +const SUBCOMMANDS = { + whitelist: ["add", "remove", "list", "reload", "on", "off"], + gamemode: ["survival", "creative", "adventure", "spectator"], + weather: ["clear", "rain", "thunder"], + difficulty: ["peaceful", "easy", "normal", "hard"], + time: ["set", "add", "query"], + chunky: ["start", "cancel", "pause", "continue", "world", "shape", "center", "radius", "force_load", "force_unload", "trim", "help"], + ftbchunks: ["claim", "unclaim", "load", "unload", "admin"], +}; + +const TAKES_PLAYER_AT = { + "op": 1, "deop": 1, "tp": 1, "teleport": 1, "kick": 1, + "ban": 1, "pardon": 1, "kill": 1, + "tell": 1, "msg": 1, "w": 1, + "give": 1, "clear": 1, "effect": 1, "enchant": 1, "xp": 1, "experience": 1, + "whitelist add": 2, "whitelist remove": 2, + "gamemode survival": 2, "gamemode creative": 2, "gamemode adventure": 2, "gamemode spectator": 2, +}; + +// MC-style argument signatures for each command. Shown as a hint after the name +// in the suggestion list. [optional] for enum choices. +const SIGNATURES = { + help: "[command]", + list: "", + say: "", + tell: " ", + msg: " ", + me: "", + w: " ", + op: "", + deop: "", + whitelist: "", + "whitelist add": "", + "whitelist remove": "", + "whitelist list": "", + "whitelist on": "", + "whitelist off": "", + "whitelist reload": "", + ban: " [reason…]", + "ban-ip": " [reason…]", + pardon: "", + "pardon-ip": "", + banlist: "[ips|players]", + kick: " [reason…]", + tp: " [destination]", + teleport: " [destination]", + give: " [count]", + clear: "[player] [item]", + kill: "[target]", + gamemode: " [player]", + "gamemode survival": "[player]", + "gamemode creative": "[player]", + "gamemode adventure": "[player]", + "gamemode spectator": "[player]", + gamerule: " [value]", + difficulty: "", + weather: " [duration]", + time: " ", + seed: "", + spawnpoint: "[player] [pos]", + setworldspawn: "[pos]", + "save-all": "[flush]", + "save-on": "", + "save-off": "", + stop: "", + reload: "", + xp: " [player]", + experience: " ", + effect: " ", + enchant: " [level]", + summon: " [pos]", + fill: " ", + setblock: " ", + locate: " ", + tag: " [tag]", + chunky: "", + "chunky start": "[world] [shape] [center_x] [center_z] [radius]", + "chunky cancel": "", + "chunky pause": "", + "chunky continue": "", + "chunky world": "", + "chunky shape": "", + "chunky center": " ", + "chunky radius": "", + "chunky trim": "[world] [radius] [trim_radius]", + ftbchunks: "", + ftbteams: "", + kubejs: "", + kjs: "", +}; + +const MAX_SUGGESTIONS = 8; + +let activeIndex = 0; +let currentSuggestions = []; + +export function setupAutocomplete() { + const cmdInput = document.getElementById("cmdInput"); + const cmdGhost = document.getElementById("cmdGhost"); + const cmdSuggest = document.getElementById("cmdSuggest"); + + function refresh() { + const v = cmdInput.value; + currentSuggestions = computeAllSuggestions(v).slice(0, MAX_SUGGESTIONS); + activeIndex = 0; + + // Inline ghost = top suggestion (only if it extends what they typed) + const top = currentSuggestions[0]; + if (top && top.text.startsWith(v) && top.text !== v) { + const suffix = top.text.substring(v.length); + cmdGhost.innerHTML = `${escapeHtml(v)}${escapeHtml(suffix)}`; + cmdInput.dataset.suggestion = top.text; + } else { + cmdGhost.innerHTML = ""; + cmdInput.dataset.suggestion = ""; + } + + renderList(cmdSuggest, currentSuggestions); + } + + cmdInput.addEventListener("input", refresh); + cmdInput.addEventListener("focus", refresh); + cmdInput.addEventListener("blur", () => { + // Delay so a click on a list item registers before we hide + setTimeout(() => cmdSuggest.classList.remove("show"), 150); + }); + + cmdInput.addEventListener("keydown", e => { + if (e.key === "Tab") { + const sug = currentSuggestions[activeIndex]; + if (sug) { + e.preventDefault(); + cmdInput.value = sug.text + " "; + refresh(); + } + } else if (e.key === "Escape") { + cmdGhost.innerHTML = ""; + cmdInput.dataset.suggestion = ""; + cmdSuggest.classList.remove("show"); + } else if (e.key === "ArrowDown" && cmdSuggest.classList.contains("show") && currentSuggestions.length > 0) { + e.preventDefault(); + activeIndex = (activeIndex + 1) % currentSuggestions.length; + highlightActive(cmdSuggest); + } else if (e.key === "ArrowUp" && cmdSuggest.classList.contains("show") && currentSuggestions.length > 0) { + e.preventDefault(); + activeIndex = (activeIndex - 1 + currentSuggestions.length) % currentSuggestions.length; + highlightActive(cmdSuggest); + } + // Note: Enter is handled by console.js (sends the command) + }); + + cmdSuggest.addEventListener("mousedown", e => { + // mousedown (not click) so we beat the input blur handler + const item = e.target.closest(".suggest-item"); + if (!item) return; + e.preventDefault(); + const idx = parseInt(item.dataset.idx, 10); + const sug = currentSuggestions[idx]; + if (sug) { + cmdInput.value = sug.text + " "; + cmdInput.focus(); + refresh(); + } + }); +} + +function highlightActive(listEl) { + [...listEl.querySelectorAll(".suggest-item")].forEach((el, i) => { + el.classList.toggle("active", i === activeIndex); + if (i === activeIndex) el.scrollIntoView({ block: "nearest" }); + }); +} + +function renderList(listEl, suggestions) { + if (suggestions.length === 0) { + listEl.classList.remove("show"); + listEl.innerHTML = ""; + return; + } + listEl.innerHTML = suggestions.map((s, i) => { + const args = s.args ? `${escapeHtml(s.args)}` : ""; + return `
    ` + + `${escapeHtml(s.text)}${args}
    `; + }).join(""); + listEl.classList.add("show"); +} + +// Returns an array of {text, args} suggestions ordered by relevance. +// args is the MC-style hint shown next to the name. +function computeAllSuggestions(input) { + if (!input) return []; + const stripped = input.startsWith("/") ? input.substring(1) : input; + const tokens = stripped.split(" "); + const partial = tokens[tokens.length - 1].toLowerCase(); + const completed = tokens.slice(0, -1); + const prefix = input.startsWith("/") ? "/" : ""; + + // First token: command name + if (completed.length === 0) { + const matches = COMMANDS.filter(c => c.startsWith(partial)).sort(); + return matches.map(name => ({ + text: prefix + name, + args: SIGNATURES[name] ?? "", + })); + } + + // Subcommands + const headLower = completed[0].toLowerCase(); + if (completed.length === 1 && SUBCOMMANDS[headLower]) { + const subs = SUBCOMMANDS[headLower].filter(s => s.startsWith(partial)); + return subs.map(sub => ({ + text: prefix + [...completed, sub].join(" "), + args: SIGNATURES[`${headLower} ${sub}`] ?? "", + })); + } + + // Player-name positions + const cmdKey = completed.join(" ").toLowerCase(); + const playerSlot = TAKES_PLAYER_AT[cmdKey]; + if (playerSlot !== undefined && tokens.length === playerSlot + 1) { + const matches = state.knownPlayers.filter(p => p.toLowerCase().startsWith(partial)); + return matches.map(p => ({ + text: prefix + [...completed, p].join(" "), + args: "", + })); + } + + // No structured suggestion at this position -- but still show the current + // command's signature as a contextual hint + const sig = SIGNATURES[cmdKey]; + if (sig) { + return [{ text: input, args: sig }]; + } + return []; +} diff --git a/server/wwwroot/modules/backup.js b/server/wwwroot/modules/backup.js new file mode 100644 index 0000000..beda00f --- /dev/null +++ b/server/wwwroot/modules/backup.js @@ -0,0 +1,183 @@ +// World backup management -- list, create, restore, delete. +// +// Backups are server-online (no downtime) -- the daemon issues `save-all flush` +// + `save-off`, archives the world, then `save-on`. Restore *does* stop the +// server (it has to), and snapshots the current world to a `-prerestore-*` dir +// before extracting so a wrong restore is recoverable. +"use strict"; + +import { api } from "./api.js"; + +const els = {}; +let lastSchedule = null; +let lastKeep = null; + +function fmtSize(bytes) { + if (bytes < 1024) return `${bytes} B`; + if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)} KB`; + if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; + return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`; +} + +function fmtDate(iso) { + try { return new Date(iso).toLocaleString(); } catch { return iso; } +} + +function fmtRelativeFuture(iso) { + if (!iso) return "--"; + const target = new Date(iso).getTime(); + const ms = target - Date.now(); + if (ms <= 0) return "imminent"; + const sec = Math.round(ms / 1000); + if (sec < 60) return `in ${sec}s`; + const min = Math.round(sec / 60); + if (min < 60) return `in ${min}m`; + const hr = Math.floor(min / 60); + const rem = min % 60; + if (hr < 24) return rem ? `in ${hr}h ${rem}m` : `in ${hr}h`; + const days = Math.floor(hr / 24); + return `in ${days}d ${hr % 24}h`; +} + +async function refresh() { + let data; + try { data = await api("/api/backup/list"); } + catch { return; } + + els.dir.textContent = data.dir || "--"; + // Server returns a human description ("Daily at 04:00", "Every 6 hours", "Disabled"). + els.schedule.textContent = data.description || (data.schedule ? `Daily at ${data.schedule}` : "Disabled"); + els.next.textContent = data.nextRun ? fmtRelativeFuture(data.nextRun) : "--"; + els.keep.textContent = data.keep != null ? `${data.keep} latest` : "--"; + lastSchedule = data.schedule || ""; + lastKeep = data.keep ?? 14; + + // Right-sidebar badge: count of backups + const badge = document.getElementById("bkpBadge"); + if (badge) badge.textContent = data.backups?.length ? `${data.backups.length}` : "0"; + + if (!data.backups || data.backups.length === 0) { + els.list.innerHTML = '
  1. No backups yet
  2. '; + return; + } + + els.list.innerHTML = data.backups.map(b => ` +
  3. +
    +
    ${escape(b.name)}
    +
    ${fmtSize(b.sizeBytes)} · ${fmtDate(b.createdAt)}
    +
    +
    + + +
    +
  4. + `).join(""); +} + +function escape(s) { + return String(s).replace(/[&<>"']/g, c => + ({"&":"&","<":"<",">":">",'"':""","'":"'"}[c])); +} + +function showMsg(text, ok = false) { + els.msg.className = ok ? "acct-msg ok" : "acct-msg"; + els.msg.textContent = text; +} + +async function postJson(path, body) { + const res = await fetch(path, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + }); + return { ok: res.ok, status: res.status, body: await res.json().catch(() => ({})) }; +} + +export function setupBackup() { + els.dir = document.getElementById("backupDir"); + els.list = document.getElementById("bkpList"); + els.create = document.getElementById("bkpCreate"); + els.msg = document.getElementById("bkpMsg"); + els.schedule = document.getElementById("backupSchedule"); + els.next = document.getElementById("backupNext"); + els.keep = document.getElementById("backupKeep"); + els.editBtn = document.getElementById("bkpEditSchedule"); + els.form = document.getElementById("bkpScheduleForm"); + els.input = document.getElementById("bkpScheduleInput"); + els.keepInput = document.getElementById("bkpKeepInput"); + els.saveBtn = document.getElementById("bkpScheduleSave"); + els.cancelBtn = document.getElementById("bkpScheduleCancel"); + if (!els.create) return; + + els.editBtn?.addEventListener("click", () => { + els.form.hidden = !els.form.hidden; + if (!els.form.hidden) { + els.input.value = lastSchedule || ""; + els.keepInput.value = lastKeep ?? 14; + els.input.focus(); + } + }); + + els.cancelBtn?.addEventListener("click", () => { + els.form.hidden = true; + showMsg(""); + }); + + els.saveBtn?.addEventListener("click", async () => { + const sched = els.input.value.trim(); + const keep = parseInt(els.keepInput.value, 10); + const r = await postJson("/api/backup/schedule", { + schedule: sched, + keep: Number.isFinite(keep) ? keep : undefined, + }); + if (!r.ok || r.body.ok === false) { + showMsg(r.body.error || `Error ${r.status}`); + } else { + showMsg(sched ? `Schedule saved: daily at ${sched}` : "Schedule disabled.", true); + els.form.hidden = true; + refresh(); + } + }); + + els.create.addEventListener("click", async () => { + const reason = prompt("Optional reason / label for this backup (e.g. 'pre-update'). Leave blank for none:"); + if (reason === null) return; // user cancelled + showMsg("Creating backup -- this may take a minute on a large world..."); + els.create.disabled = true; + const r = await postJson("/api/backup/create", { reason: reason.trim() || null }); + els.create.disabled = false; + if (!r.ok || r.body.ok === false) { + showMsg(r.body.error || `Error ${r.status}`); + } else { + showMsg(`Backup created: ${r.body.name} (${fmtSize(r.body.sizeBytes)})`, true); + refresh(); + } + }); + + els.list.addEventListener("click", async e => { + const restore = e.target.closest(".bkp-restore"); + const del = e.target.closest(".bkp-delete"); + if (restore) { + const name = restore.dataset.name; + if (!confirm(`Restore from ${name}?\n\nServer will stop, current world is moved to a "-prerestore" folder for safety, then the backup is extracted and server starts again.`)) + return; + showMsg("Restoring -- this stops the server..."); + const r = await postJson("/api/backup/restore", { name }); + if (!r.ok || r.body.ok === false) showMsg(r.body.error || `Error ${r.status}`); + else showMsg("Restore complete. Server is starting.", true); + } + if (del) { + const name = del.dataset.name; + if (!confirm(`Delete backup ${name}? This cannot be undone.`)) return; + const r = await postJson("/api/backup/delete", { name }); + if (!r.ok || r.body.ok === false) showMsg(r.body.error || `Error ${r.status}`); + else { showMsg("Deleted.", true); refresh(); } + } + }); + + refresh(); + // Backups don't change often; light poll to pick up new ones if scheduled + // backups are added later, or just to refresh after an external mv/rm. + setInterval(refresh, 30000); +} diff --git a/server/wwwroot/modules/console.js b/server/wwwroot/modules/console.js new file mode 100644 index 0000000..9d01474 --- /dev/null +++ b/server/wwwroot/modules/console.js @@ -0,0 +1,76 @@ +// Live log streaming via Server-Sent Events + command-input wiring. +// EventSource gives us instant push (no 1-second polling lag) and reconnects +// automatically if the connection drops. +"use strict"; + +import { api, apiJson, escapeHtml } from "./api.js"; +import { state } from "./state.js"; + +const consoleEl = () => document.getElementById("console"); + +export function setupConsole() { + consoleEl().textContent = "Connecting to server log…"; + + const es = new EventSource("/api/logs/stream"); + let firstEvent = true; + es.addEventListener("log", e => { + if (firstEvent) { consoleEl().textContent = ""; firstEvent = false; } + try { + const d = JSON.parse(e.data); + const ts = new Date(d.t).toLocaleTimeString(); + const div = document.createElement("div"); + if (d.e) div.className = "err"; + div.textContent = `[${ts}] ${d.m}`; + consoleEl().appendChild(div); + consoleEl().scrollTop = consoleEl().scrollHeight; + // Trim very old lines so the DOM doesn't grow unbounded + while (consoleEl().childNodes.length > 5000) { + consoleEl().removeChild(consoleEl().firstChild); + } + // Re-broadcast so other modules (e.g. pregen) can react to log lines + // without opening a second SSE connection. + document.dispatchEvent(new CustomEvent("serverlog", { detail: d })); + } catch {} + }); + es.onerror = () => { + // EventSource will retry automatically. + }; + + // Command input + const cmdInput = document.getElementById("cmdInput"); + document.getElementById("cmdSend").addEventListener("click", sendCommand); + cmdInput.addEventListener("keydown", onCmdKeyDown); +} + +async function sendCommand() { + const cmdInput = document.getElementById("cmdInput"); + const v = cmdInput.value.trim(); + if (!v) return; + try { + await apiJson("/api/command", { command: v }); + state.cmdHistory.push(v); + state.cmdHistoryIdx = state.cmdHistory.length; + cmdInput.value = ""; + cmdInput.dispatchEvent(new Event("input")); // refresh ghost text + } catch (e) { alert(e.message); } +} + +function onCmdKeyDown(e) { + const cmdInput = document.getElementById("cmdInput"); + if (e.key === "Enter") { + sendCommand(); + } else if (e.key === "ArrowUp") { + if (state.cmdHistory.length === 0) return; + e.preventDefault(); + state.cmdHistoryIdx = Math.max(0, state.cmdHistoryIdx - 1); + cmdInput.value = state.cmdHistory[state.cmdHistoryIdx] || ""; + cmdInput.dispatchEvent(new Event("input")); + } else if (e.key === "ArrowDown") { + if (state.cmdHistory.length === 0) return; + e.preventDefault(); + state.cmdHistoryIdx = Math.min(state.cmdHistory.length, state.cmdHistoryIdx + 1); + cmdInput.value = state.cmdHistory[state.cmdHistoryIdx] || ""; + cmdInput.dispatchEvent(new Event("input")); + } + // Note: Tab is handled by the autocomplete module's keydown listener. +} diff --git a/server/wwwroot/modules/danger.js b/server/wwwroot/modules/danger.js new file mode 100644 index 0000000..2b88a80 --- /dev/null +++ b/server/wwwroot/modules/danger.js @@ -0,0 +1,111 @@ +// Danger zone -- destructive operations. +// Currently: world wipe. Always type-to-confirm to prevent accidental clicks. +"use strict"; + +export function setupDanger() { + const btn = document.getElementById("wipeBtn"); + const cb = document.getElementById("wipeBackup"); + const msg = document.getElementById("wipeMsg"); + const seedDisplay = document.getElementById("wipeCurrentSeed"); + const customInput = document.getElementById("wipeCustomSeed"); + if (!btn) return; + + // Enable the custom-seed text field only when its radio is selected. + document.querySelectorAll('input[name="wipeSeedMode"]').forEach(radio => { + radio.addEventListener("change", () => { + const mode = document.querySelector('input[name="wipeSeedMode"]:checked')?.value; + customInput.disabled = (mode !== "custom"); + if (mode === "custom") customInput.focus(); + }); + }); + + // Fetch current seed each time the wipe modal becomes visible. Watching + // the wipe section's ancestor modal works without coupling to the modal + // module's open/close API. + const refreshSeed = async () => { + seedDisplay.textContent = "loading..."; + try { + const res = await fetch("/api/world/seed"); + const body = await res.json(); + seedDisplay.textContent = body.seed + ? body.seed + : "(unknown -- server stopped or seed not set)"; + } catch (e) { + seedDisplay.textContent = "(failed to read)"; + } + }; + // Refresh on first load + whenever the modal becomes visible. Modal markup + // uses a wrapping div with "[hidden]" attr, so we observe attribute changes. + refreshSeed(); + const modal = btn.closest(".modal"); + if (modal) { + new MutationObserver(muts => { + for (const m of muts) { + if (m.attributeName === "hidden" && !modal.hasAttribute("hidden")) { + refreshSeed(); + } + } + }).observe(modal, { attributes: true }); + } + + btn.addEventListener("click", async () => { + msg.className = "acct-msg"; + msg.textContent = ""; + + const mode = document.querySelector('input[name="wipeSeedMode"]:checked')?.value || "random"; + const customSeed = (customInput.value || "").trim(); + if (mode === "custom" && !customSeed) { + msg.textContent = "Custom seed selected but the field is empty."; + return; + } + + // Build a confirmation prompt that reflects the chosen seed strategy + // so the user sees exactly what's about to happen. + let seedNote = ""; + if (mode === "keep") seedNote = `Same seed (${seedDisplay.textContent}) will be reused.\n`; + else if (mode === "custom") seedNote = `Seed will be set to: ${customSeed}\n`; + else seedNote = "A new random seed will be generated.\n"; + + const typed = prompt( + "Type WIPE (uppercase, exactly) to confirm world wipe.\n" + + "Server will stop, world will be replaced, server will restart.\n\n" + + seedNote + ); + if (typed !== "WIPE") { + if (typed != null) msg.textContent = "Confirmation didn't match -- nothing wiped."; + return; + } + + btn.disabled = true; + msg.textContent = "Wiping..."; + try { + const res = await fetch("/api/world/wipe", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + confirm: typed, + backup: cb.checked, + seedMode: mode, + customSeed: mode === "custom" ? customSeed : null, + }), + }); + const body = await res.json().catch(() => ({})); + if (!res.ok || body.ok === false) { + msg.textContent = body.error || `Error ${res.status}`; + return; + } + msg.className = "acct-msg ok"; + const parts = ["World wiped."]; + if (body.seedUsed) parts.push(`Seed: ${body.seedUsed}.`); + if (body.backupName) parts.push(`Backup: ${body.backupName}.`); + parts.push("Server restarting..."); + msg.textContent = parts.join(" "); + // Refresh the seed display so user sees the new value once MC is back. + setTimeout(refreshSeed, 5000); + } catch (e) { + msg.textContent = e.message; + } finally { + btn.disabled = false; + } + }); +} diff --git a/server/wwwroot/modules/map.js b/server/wwwroot/modules/map.js new file mode 100644 index 0000000..971303a --- /dev/null +++ b/server/wwwroot/modules/map.js @@ -0,0 +1,114 @@ +// World map (BlueMap) controls. +// +// Render runs out-of-process via BlueMap CLI. Status polled every 3 s while +// the modal is open OR while a render is in progress. The "Open map" button +// only opens the new tab if there's actually rendered output -- otherwise we +// pop a friendly message saying "render first". +"use strict"; + +import { api } from "./api.js"; + +const els = {}; +let pollTimer = null; +let modalOpen = false; +let lastHasOutput = false; + +function setPolling(intervalMs) { + if (pollTimer) clearInterval(pollTimer); + pollTimer = setInterval(tick, intervalMs); +} + +async function tick() { + let s; + try { s = await api("/api/map/status"); } + catch { return; } + + lastHasOutput = !!s.hasOutput; + document.getElementById("mapBadge").hidden = !s.inProgress; + if (s.inProgress) document.getElementById("mapBadge").textContent = "rendering"; + + if (!modalOpen) return; // don't bother updating modal DOM if hidden + + els.phase.textContent = phaseLabel(s.phase); + els.lastLog.textContent = s.lastLogLine ?? "--"; + els.render.disabled = s.inProgress; + els.render.textContent = s.inProgress ? "Rendering…" : "Render now"; + els.cancel.hidden = !s.inProgress; + + if (s.phase === "complete" || s.phase === "failed" || s.phase === "cancelled") { + if (s.phase === "failed" && s.error) showMsg("Failed: " + s.error); + else if (s.phase === "cancelled") showMsg("Cancelled. Next render resumes from this point."); + else if (s.phase === "complete") showMsg("Render complete.", true); + } +} + +function phaseLabel(phase) { + switch (phase) { + case "downloading": return "Downloading CLI"; + case "extracting": return "Extracting CLI"; + case "configuring": return "Configuring"; + case "rendering": return "Rendering"; + case "complete": return "Complete"; + case "failed": return "Failed"; + case "cancelled": return "Cancelled"; + default: return "Idle"; + } +} + +function showMsg(text, ok = false) { + els.msg.className = ok ? "acct-msg ok" : "acct-msg"; + els.msg.textContent = text; +} + +export function setupMap() { + els.phase = document.getElementById("mapPhase"); + els.lastLog = document.getElementById("mapLastLog"); + els.render = document.getElementById("mapRender"); + els.cancel = document.getElementById("mapCancel"); + els.open = document.getElementById("mapOpen"); + els.msg = document.getElementById("mapMsg"); + if (!els.render) return; + + els.cancel.addEventListener("click", async () => { + if (!confirm("Cancel the render? It's resumable -- next time you click Render, BlueMap continues from where it stopped.")) return; + try { + const res = await fetch("/api/map/cancel", { method: "POST" }); + const body = await res.json().catch(() => ({})); + if (!res.ok || body.ok === false) showMsg(body.error || `Error ${res.status}`); + else { showMsg("Cancelling…"); tick(); } + } catch (e) { showMsg(e.message); } + }); + + // Track modal open/close so we can poll faster when the user is watching. + const modal = document.getElementById("modalMap"); + new MutationObserver(() => { + modalOpen = !modal.hidden; + if (modalOpen) tick(); + }).observe(modal, { attributes: true, attributeFilter: ["hidden"] }); + + els.render.addEventListener("click", async () => { + showMsg("Starting render…"); + els.render.disabled = true; + try { + const res = await fetch("/api/map/render", { method: "POST" }); + const body = await res.json().catch(() => ({})); + if (!res.ok || body.ok === false) { + showMsg(body.error || `Error ${res.status}`); + els.render.disabled = false; + return; + } + tick(); + } catch (e) { showMsg(e.message); els.render.disabled = false; } + }); + + els.open.addEventListener("click", () => { + if (!lastHasOutput) { + showMsg("No map output yet -- click Render now first."); + return; + } + window.open("/map/", "_blank", "noopener"); + }); + + tick(); + setPolling(3000); // light poll keeps the badge fresh + catches background renders +} diff --git a/server/wwwroot/modules/modal.js b/server/wwwroot/modules/modal.js new file mode 100644 index 0000000..245f2aa --- /dev/null +++ b/server/wwwroot/modules/modal.js @@ -0,0 +1,57 @@ +// Tiny modal helper. Registers a single document-level Esc + backdrop-click +// handler so individual modals don't have to. Public API: openModal(id) / +// closeModal(id) / closeAllModals(). +"use strict"; + +let bound = false; + +function bindGlobal() { + if (bound) return; + bound = true; + document.addEventListener("keydown", e => { + if (e.key === "Escape") closeAllModals(); + }); + document.addEventListener("click", e => { + // Backdrop click closes the topmost open modal. + const backdrop = e.target.closest(".modal-backdrop"); + if (backdrop) closeModal(backdrop.parentElement.id); + const closeBtn = e.target.closest(".modal-close"); + if (closeBtn) closeModal(closeBtn.closest(".modal").id); + }); +} + +export function openModal(id) { + bindGlobal(); + const m = document.getElementById(id); + if (!m) return; + m.hidden = false; + document.body.classList.add("modal-open"); + // Focus first input/button for keyboard users. + setTimeout(() => { + const focusable = m.querySelector("input, button:not(.modal-close), select, textarea"); + focusable?.focus(); + }, 50); +} + +export function closeModal(id) { + const m = document.getElementById(id); + if (!m) return; + m.hidden = true; + if (!document.querySelector(".modal:not([hidden])")) { + document.body.classList.remove("modal-open"); + } +} + +export function closeAllModals() { + document.querySelectorAll(".modal:not([hidden])").forEach(m => m.hidden = true); + document.body.classList.remove("modal-open"); +} + +/// Wires `data-open-modal="someId"` on any element to opening the modal. +export function setupModalTriggers() { + bindGlobal(); + document.addEventListener("click", e => { + const trigger = e.target.closest("[data-open-modal]"); + if (trigger) openModal(trigger.getAttribute("data-open-modal")); + }); +} diff --git a/server/wwwroot/modules/panels.js b/server/wwwroot/modules/panels.js new file mode 100644 index 0000000..a3af67e --- /dev/null +++ b/server/wwwroot/modules/panels.js @@ -0,0 +1,117 @@ +// Status / players / whitelist sidebar panels. Polled (not streamed) because the +// data they show changes infrequently. Logs use SSE -- see console.js. +"use strict"; + +import { api, escapeHtml } from "./api.js"; +import { state, rebuildKnownPlayers } from "./state.js"; + +export async function tickStatus() { + const pill = document.getElementById("statusPill"); + const text = document.getElementById("statusText"); + const memEl = document.getElementById("memUsage"); + const memBar = document.getElementById("memBar"); + const cpuCur = document.getElementById("cpuCurrent"); + const cpuBar = document.getElementById("cpuBar"); + const cpuMax = document.getElementById("cpuMax"); + const cpuAvg = document.getElementById("cpuAvg"); + + function renderResources(s) { + if (s.memoryBytes != null) { + const usedGB = s.memoryBytes / (1024 ** 3); + const maxGB = s.memoryMaxMB ? s.memoryMaxMB / 1024 : null; + memEl.textContent = maxGB + ? `${usedGB.toFixed(2)} / ${maxGB.toFixed(1)} GB` + : `${usedGB.toFixed(2)} GB`; + memBar.style.width = maxGB ? `${Math.min(100, (usedGB / maxGB) * 100)}%` : "0%"; + } else { + memEl.textContent = "--"; + memBar.style.width = "0%"; + } + if (s.cpu) { + cpuCur.textContent = `${s.cpu.current.toFixed(1)} %`; + cpuBar.style.width = `${Math.min(100, s.cpu.current)}%`; + cpuMax.textContent = `${s.cpu.max.toFixed(1)}%`; + cpuAvg.textContent = `${s.cpu.avg.toFixed(1)}%`; + } else { + cpuCur.textContent = "--"; + cpuBar.style.width = "0%"; + cpuMax.textContent = "--"; + cpuAvg.textContent = "--"; + } + } + + try { + const s = await api("/api/status"); + if (s.running) { + pill.className = "status-pill online"; + text.textContent = "Online"; + document.getElementById("pid").textContent = s.pid ?? "--"; + const secs = Math.floor(s.uptime ?? 0); + const h = Math.floor(secs / 3600), m = Math.floor((secs % 3600) / 60); + document.getElementById("uptime").textContent = `${h}h ${m}m`; + renderResources(s); + } else { + pill.className = "status-pill offline"; + text.textContent = "Offline"; + document.getElementById("pid").textContent = "--"; + document.getElementById("uptime").textContent = "--"; + renderResources({ memoryBytes: null, cpu: null, memoryMaxMB: null }); + } + const pv = s.packVersion; + document.getElementById("packVersion").textContent = pv?.name ? `${pv.name} v${pv.version}` : "--"; + + // World size -- even when server is offline we can still report disk usage. + const worldEl = document.getElementById("worldSize"); + if (worldEl) { + const b = s.worldSizeBytes; + if (b == null || b === 0) worldEl.textContent = "--"; + else if (b < 1024 * 1024) worldEl.textContent = `${(b / 1024).toFixed(0)} KB`; + else if (b < 1024 * 1024 * 1024) worldEl.textContent = `${(b / (1024 * 1024)).toFixed(1)} MB`; + else worldEl.textContent = `${(b / (1024 * 1024 * 1024)).toFixed(2)} GB`; + } + } catch { + pill.className = "status-pill offline"; + text.textContent = "Disconnected"; + } +} + +export async function tickPlayers() { + try { + const p = await api("/api/players"); + state.onlinePlayers = (p.players || []).slice(); + document.getElementById("playerCount").textContent = p.online >= 0 ? p.online : "?"; + const list = document.getElementById("players"); + if (state.onlinePlayers.length === 0) { + list.innerHTML = '
  5. No-one online
  6. '; + } else { + list.innerHTML = state.onlinePlayers.map(n => `
  7. ${escapeHtml(n)}
  8. `).join(""); + } + } catch {} + rebuildKnownPlayers(); +} + +export async function tickWhitelist() { + try { + const w = await api("/api/whitelist"); + state.whitelistedPlayers = (w.players || []).slice(); + const list = document.getElementById("whitelist"); + if (state.whitelistedPlayers.length === 0) { + list.innerHTML = '
  9. No players whitelisted yet
  10. '; + } else { + list.innerHTML = state.whitelistedPlayers.map(n => + `
  11. ${escapeHtml(n)}
  12. ` + ).join(""); + } + } catch {} + rebuildKnownPlayers(); +} + +// MC takes ~1-2 s to look up a UUID via Mojang and write whitelist.json. +// Refresh shortly after a user-triggered add/remove instead of waiting for the +// 30-second polling tick. +let pendingRefresh; +export function refreshWhitelistSoon() { + clearTimeout(pendingRefresh); + pendingRefresh = setTimeout(tickWhitelist, 1500); + setTimeout(tickWhitelist, 4000); // belt-and-braces if Mojang is slow +} diff --git a/server/wwwroot/modules/pregen.js b/server/wwwroot/modules/pregen.js new file mode 100644 index 0000000..89cd8a3 --- /dev/null +++ b/server/wwwroot/modules/pregen.js @@ -0,0 +1,222 @@ +// World pre-generation controls + live status display. +// +// We use the canonical config-then-start sequence rather than the all-in-one +// `chunky start ` form because the all-in-one +// form's argument order varies between Chunky versions, and Brigadier silently +// prints the usage hint instead of erroring when it doesn't match. +// +// Status is parsed from Chunky's own log lines (re-broadcast by console.js as +// the `serverlog` custom event) -- no separate polling endpoint is needed. +// +// Chunky is intentionally only invoked from this panel -- it can punch holes +// in chunks if it crashes mid-run, so we don't want it ticking on its own. +"use strict"; + +import { apiJson } from "./api.js"; + +async function send(cmd) { + await apiJson("/api/command", { command: cmd }); +} + +async function startPregen(radius) { + await send("chunky world minecraft:overworld"); + await send("chunky shape square"); + await send("chunky center 0 0"); + await send(`chunky radius ${radius}`); + await send("chunky start"); +} + +// ─────────── status display ─────────── + +const els = {}; + +function setState(label, cssClass) { + if (!els.state) return; + els.state.textContent = label; + els.state.className = "val " + cssClass; + applyButtonStates(cssClass); +} + +/// Enable/disable the Start/Pause/Resume/Cancel buttons based on the current +/// pregen state. Called whenever setState changes the displayed status. +function applyButtonStates(cssClass) { + if (!els.btnStart) return; + // Map the state CSS class to a logical state name. Default = idle. + let s = "idle"; + if (cssClass === "pg-state-running") s = "running"; + else if (cssClass === "pg-state-paused") s = "paused"; + else if (cssClass === "pg-state-cancelling") s = "cancelling"; + + els.btnStart.disabled = s !== "idle"; + els.btnPause.disabled = s !== "running"; + els.btnContinue.disabled = s !== "paused"; + els.btnCancel.disabled = !(s === "running" || s === "paused"); +} + +function resetMetrics() { + if (!els.progressFill) return; + els.progressFill.style.width = "0%"; + els.progressText.textContent = "--"; + els.chunks.textContent = "--"; + els.rate.textContent = "--"; + els.eta.textContent = "--"; +} + +// Parse a Chunky log line. Returns an object describing what changed, or null +// if this line isn't a Chunky message we recognise (or is for a different world). +// +// Chunky supports one task per world running concurrently, so we narrow our +// display to the overworld -- that's the only world the Start button targets, +// and it keeps the UI sane if someone kicks off other worlds via raw command. +// +// Real Chunky lines look roughly like: +// "[Chunky] Task running for minecraft:overworld at 0,0. Progress: 12.50% (1234/9876 chunks), 45.20 cps, ETA: 0h 1m 30s" +// "[Chunky] Task started for minecraft:overworld." +// "[Chunky] Task stopped for minecraft:overworld." +// "[Chunky] Task paused for minecraft:overworld." +// "[Chunky] No task running." +const TARGET_WORLD = "minecraft:overworld"; + +function parseChunky(text) { + if (!/Chunky|chunky/.test(text)) return null; + + // If a world is named, only react when it's the one we're tracking. + // Lines without a world (e.g. "No task running.") fall through. + const worldMatch = text.match(/(minecraft:[a-z_]+|the_nether|the_end|overworld)/i); + if (worldMatch) { + const w = worldMatch[1].toLowerCase(); + const normalised = w.startsWith("minecraft:") ? w : `minecraft:${w}`; + if (normalised !== TARGET_WORLD) return null; + } + + // State transitions + if (/Task started/i.test(text)) return { state: "running" }; + if (/Task paused/i.test(text)) return { state: "paused" }; + if (/Task (stopped|cancelled|canceled|completed|finished)/i.test(text)) + return { state: "idle", clear: true }; + if (/No task running/i.test(text)) return { state: "idle", clear: true }; + + // Progress line: try to extract whatever pieces are present + const out = {}; + let matched = false; + + const pct = text.match(/(\d+(?:\.\d+)?)\s*%/); + if (pct) { out.percent = parseFloat(pct[1]); matched = true; } + + const chunks = text.match(/(\d[\d,]*)\s*\/\s*(\d[\d,]*)\s*chunks?/i); + if (chunks) { + out.done = chunks[1].replace(/,/g, ""); + out.total = chunks[2].replace(/,/g, ""); + matched = true; + } + + const cps = text.match(/(\d+(?:\.\d+)?)\s*cps/i); + if (cps) { out.cps = parseFloat(cps[1]); matched = true; } + + const eta = text.match(/ETA[:\s]+([^,)\n]+?)(?=[,)\n]|$)/i); + if (eta) { out.eta = eta[1].trim(); matched = true; } + + if (matched) { out.state = "running"; return out; } + return null; +} + +function applyParsed(p) { + if (!els.state) return; + if (p.state === "running") setState("Running", "pg-state-running"); + if (p.state === "paused") setState("Paused", "pg-state-paused"); + if (p.state === "idle") setState("Idle", "pg-state-idle"); + if (p.clear) resetMetrics(); + + if (p.percent != null) { + els.progressFill.style.width = `${Math.min(100, p.percent)}%`; + els.progressText.textContent = `${p.percent.toFixed(2)}%`; + } + if (p.done && p.total) { + const fmt = n => Number(n).toLocaleString(); + els.chunks.textContent = `${fmt(p.done)} / ${fmt(p.total)}`; + } + if (p.cps != null) els.rate.textContent = `${p.cps.toFixed(1)} chunks/s`; + if (p.eta) els.eta.textContent = p.eta; +} + +function setupCollapsible() { + // Persist collapsed state per card across reloads via localStorage. + document.querySelectorAll(".card.collapsible").forEach(card => { + const id = card.id || ""; + const storageKey = id ? `bs-collapsed:${id}` : null; + const startCollapsed = storageKey && localStorage.getItem(storageKey) === "1"; + if (!startCollapsed) card.classList.add("expanded"); + const toggle = card.querySelector(".collapsible-toggle"); + if (!toggle) return; + toggle.addEventListener("click", () => { + card.classList.toggle("expanded"); + if (storageKey) { + localStorage.setItem(storageKey, + card.classList.contains("expanded") ? "0" : "1"); + } + }); + }); +} + +export function setupPregen() { + setupCollapsible(); + els.state = document.getElementById("pgState"); + els.progressFill = document.getElementById("pgProgressFill"); + els.progressText = document.getElementById("pgProgressText"); + els.chunks = document.getElementById("pgChunks"); + els.rate = document.getElementById("pgRate"); + els.eta = document.getElementById("pgEta"); + els.btnStart = document.getElementById("pgStart"); + els.btnPause = document.getElementById("pgPause"); + els.btnContinue = document.getElementById("pgContinue"); + els.btnCancel = document.getElementById("pgCancel"); + + // Idle by default -- disable everything except Start. + applyButtonStates("pg-state-idle"); + + const radiusInput = document.getElementById("pgRadius"); + + document.getElementById("pgStart").addEventListener("click", async () => { + const r = parseInt(radiusInput.value, 10); + if (!Number.isFinite(r) || r < 100) { + alert("Enter a radius of at least 100 blocks."); + return; + } + if (r > 20000 && !confirm(`Radius ${r} is large and may take hours. Continue?`)) { + return; + } + try { + setState("Starting…", "pg-state-running"); + resetMetrics(); + await startPregen(r); + } catch (e) { + setState("Idle", "pg-state-idle"); + alert(e.message); + } + }); + + document.getElementById("pgPause").addEventListener("click", async () => { + try { await send("chunky pause"); } catch (e) { alert(e.message); } + }); + document.getElementById("pgContinue").addEventListener("click", async () => { + try { + await send("chunky continue"); + setState("Running", "pg-state-running"); + } catch (e) { alert(e.message); } + }); + document.getElementById("pgCancel").addEventListener("click", async () => { + if (!confirm("Cancel the current pre-generation run?")) return; + try { + setState("Cancelling…", "pg-state-cancelling"); + await send("chunky cancel"); + } catch (e) { alert(e.message); } + }); + + // Subscribe to the shared SSE re-broadcast from console.js + document.addEventListener("serverlog", e => { + const msg = e.detail?.m; + if (typeof msg !== "string") return; + const parsed = parseChunky(msg); + if (parsed) applyParsed(parsed); + }); +} diff --git a/server/wwwroot/modules/serverControls.js b/server/wwwroot/modules/serverControls.js new file mode 100644 index 0000000..8fab107 --- /dev/null +++ b/server/wwwroot/modules/serverControls.js @@ -0,0 +1,16 @@ +// Start / stop buttons. +"use strict"; + +import { api } from "./api.js"; + +export function setupServerControls() { + document.getElementById("btnStart").addEventListener("click", async () => { + try { await api("/api/server/start", { method: "POST" }); } + catch (e) { alert(e.message); } + }); + document.getElementById("btnStop").addEventListener("click", async () => { + if (!confirm("Stop the server?")) return; + try { await api("/api/server/stop", { method: "POST" }); } + catch (e) { alert(e.message); } + }); +} diff --git a/server/wwwroot/modules/settings.js b/server/wwwroot/modules/settings.js new file mode 100644 index 0000000..e3d6b5f --- /dev/null +++ b/server/wwwroot/modules/settings.js @@ -0,0 +1,135 @@ +// Server settings: read/write a curated subset of server.properties. +// Changes require an MC restart -- Save writes only, Save & restart bounces MC. +"use strict"; + +import { api } from "./api.js"; + +const els = {}; + +// Map of input element ID -> server.properties key. Keeps the form ↔ file +// translation in one place; new fields can be added by adding a row here + +// matching elements in index.html. +const FIELDS = [ + { id: "ssfMotd", key: "motd", type: "string" }, + { id: "ssfGamemode", key: "gamemode", type: "string" }, + { id: "ssfDifficulty", key: "difficulty", type: "string" }, + { id: "ssfViewDistance", key: "view-distance", type: "int" }, + { id: "ssfSimulationDistance", key: "simulation-distance", type: "int" }, + { id: "ssfMaxPlayers", key: "max-players", type: "int" }, + { id: "ssfSpawnProtection", key: "spawn-protection", type: "int" }, + { id: "ssfPvp", key: "pvp", type: "bool" }, + { id: "ssfHardcore", key: "hardcore", type: "bool" }, + { id: "ssfAllowFlight", key: "allow-flight", type: "bool" }, + { id: "ssfWhiteList", key: "white-list", type: "bool" }, + { id: "ssfEnforceWhitelist", key: "enforce-whitelist", type: "bool" }, + { id: "ssfEnableCommandBlock", key: "enable-command-block", type: "bool" }, +]; + +function readForm() { + const out = {}; + for (const f of FIELDS) { + const el = document.getElementById(f.id); + if (!el) continue; + if (f.type === "bool") out[f.key] = el.checked ? "true" : "false"; + else if (f.type === "int") { + const v = parseInt(el.value, 10); + if (Number.isFinite(v)) out[f.key] = String(v); + } else { + out[f.key] = el.value; + } + } + return out; +} + +function writeForm(values) { + for (const f of FIELDS) { + const el = document.getElementById(f.id); + if (!el) continue; + const v = values[f.key]; + if (v === undefined) continue; + if (f.type === "bool") el.checked = (v === "true"); + else el.value = v; + } +} + +function renderSummary(values) { + document.getElementById("ssMotd").textContent = values["motd"] ?? "--"; + document.getElementById("ssDifficulty").textContent = values["difficulty"] ?? "--"; + document.getElementById("ssDistances").textContent = + `${values["view-distance"] ?? "--"} / ${values["simulation-distance"] ?? "--"}`; + document.getElementById("ssMaxPlayers").textContent = values["max-players"] ?? "--"; + const wl = values["white-list"] === "true"; + const enf = values["enforce-whitelist"] === "true"; + document.getElementById("ssWhitelist").textContent = + wl ? (enf ? "enforced" : "enabled") : "off"; +} + +async function refresh() { + try { + const data = await api("/api/server/settings"); + renderSummary(data.values || {}); + writeForm(data.values || {}); + } catch { /* ignore -- panel just shows last-known */ } +} + +async function postSettings() { + const payload = readForm(); + const res = await fetch("/api/server/settings", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }); + return { ok: res.ok, body: await res.json().catch(() => ({})) }; +} + +function showMsg(text, ok = false) { + els.msg.className = ok ? "acct-msg ok" : "acct-msg"; + els.msg.textContent = text; +} + +export function setupSettings() { + els.msg = document.getElementById("ssMsg"); + els.save = document.getElementById("ssSave"); + els.restart = document.getElementById("ssRestart"); + if (!els.save) return; + + els.save.addEventListener("click", async () => { + showMsg("Saving..."); + els.save.disabled = true; + try { + const r = await postSettings(); + if (!r.ok || r.body.ok === false) { + showMsg(r.body.error || `Error ${r.body.status ?? ""}`); + return; + } + showMsg(r.body.restartRequired + ? "Saved. Restart for changes to take effect." + : "Saved.", true); + refresh(); + } catch (e) { showMsg(e.message); } + finally { els.save.disabled = false; } + }); + + els.restart.addEventListener("click", async () => { + if (!confirm("Save changes and restart the server now? Players will be disconnected briefly.")) return; + showMsg("Saving + restarting..."); + els.save.disabled = true; els.restart.disabled = true; + try { + const r = await postSettings(); + if (!r.ok || r.body.ok === false) { + showMsg(r.body.error || `Save failed: ${r.body.status ?? ""}`); + return; + } + const rr = await fetch("/api/server/restart", { method: "POST" }); + const rb = await rr.json().catch(() => ({})); + if (!rr.ok || rb.ok === false) showMsg("Saved, but restart failed: " + (rb.error || rr.status)); + else showMsg("Saved + restarting. New settings live in ~30s.", true); + refresh(); + } catch (e) { showMsg(e.message); } + finally { els.save.disabled = false; els.restart.disabled = false; } + }); + + refresh(); + // Light poll: pick up out-of-band edits to server.properties. + setInterval(refresh, 30000); +} diff --git a/server/wwwroot/modules/state.js b/server/wwwroot/modules/state.js new file mode 100644 index 0000000..881f2ab --- /dev/null +++ b/server/wwwroot/modules/state.js @@ -0,0 +1,18 @@ +// Shared in-memory state -- the union of online + whitelisted players is what +// tab-completion matches against, so we keep it centralised here. +"use strict"; + +export const state = { + onlinePlayers: [], + whitelistedPlayers: [], + knownPlayers: [], // sorted union, for autocomplete + cmdHistory: [], + cmdHistoryIdx: -1, +}; + +export function rebuildKnownPlayers() { + const set = new Set(); + state.onlinePlayers.forEach(n => set.add(n)); + state.whitelistedPlayers.forEach(n => set.add(n)); + state.knownPlayers = [...set].sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())); +} diff --git a/server/wwwroot/modules/update.js b/server/wwwroot/modules/update.js new file mode 100644 index 0000000..52a6256 --- /dev/null +++ b/server/wwwroot/modules/update.js @@ -0,0 +1,138 @@ +// Modpack update controls. +// +// The card hides itself when there's no update available and reveals when the +// manifest reports a newer pack version. Polls /api/update/status (every 5 s +// when idle, every 1 s when an update is in-flight) to keep state fresh. +"use strict"; + +import { api, apiJson } from "./api.js"; + +const els = {}; +let pollTimer = null; +let pollInterval = 5000; + +function setPolling(intervalMs) { + if (intervalMs === pollInterval && pollTimer) return; + if (pollTimer) clearInterval(pollTimer); + pollInterval = intervalMs; + pollTimer = setInterval(tick, intervalMs); +} + +async function tick() { + let s; + try { s = await api("/api/update/status"); } + catch { return; } + + els.current.textContent = s.current ?? "--"; + els.available.textContent = s.available ?? "--"; + + const card = els.card; + if (s.needsUpdate || s.inProgress) { + card.hidden = false; + card.classList.toggle("has-update", s.needsUpdate && !s.inProgress); + } else { + card.hidden = true; + } + + if (s.inProgress) { + els.progress.hidden = false; + els.start.disabled = true; + els.delay.disabled = true; + els.phase.textContent = phaseLabel(s.phase); + + const showCancel = s.phase === "countdown"; + els.cancel.hidden = !showCancel; + + if (s.phase === "countdown" && s.countdownTotal > 0) { + const elapsed = s.countdownTotal - s.countdownRemaining; + const pct = (elapsed / s.countdownTotal) * 100; + els.fill.style.width = `${pct}%`; + els.status.textContent = `Restarting in ${formatSeconds(s.countdownRemaining)}`; + } else { + // Indeterminate during sync / loader install / start phases -- + // just show 100% and a phase-specific status string. + els.fill.style.width = "100%"; + els.status.textContent = phaseStatus(s.phase); + } + setPolling(1000); + } else { + els.progress.hidden = true; + els.start.disabled = !s.needsUpdate; + els.delay.disabled = false; + if (s.phase === "failed" && s.error) { + els.progress.hidden = false; + els.phase.textContent = "FAILED"; + els.status.textContent = s.error; + els.fill.style.width = "0%"; + } + setPolling(5000); + } +} + +function phaseLabel(phase) { + switch (phase) { + case "countdown": return "COUNTDOWN"; + case "stopping": return "STOPPING"; + case "syncing": return "SYNCING MODS"; + case "installing_loader": return "INSTALLING LOADER"; + case "starting": return "STARTING"; + case "complete": return "COMPLETE"; + case "failed": return "FAILED"; + case "cancelled": return "CANCELLED"; + default: return "WORKING"; + } +} + +function phaseStatus(phase) { + switch (phase) { + case "stopping": return "Stopping Minecraft cleanly..."; + case "syncing": return "Syncing mods from manifest..."; + case "installing_loader": return "Re-running NeoForge installer..."; + case "starting": return "Starting Minecraft..."; + case "complete": return "Update complete."; + default: return ""; + } +} + +function formatSeconds(s) { + if (s < 60) return `${s}s`; + const m = Math.floor(s / 60), r = s % 60; + return `${m}m ${String(r).padStart(2, "0")}s`; +} + +export function setupUpdate() { + els.card = document.getElementById("updateCard"); + els.current = document.getElementById("updCurrent"); + els.available = document.getElementById("updAvailable"); + els.delay = document.getElementById("updDelay"); + els.start = document.getElementById("updStart"); + els.progress = document.getElementById("updProgress"); + els.phase = document.getElementById("updPhaseLabel"); + els.fill = document.getElementById("updProgressFill"); + els.status = document.getElementById("updStatusText"); + els.cancel = document.getElementById("updCancel"); + + els.start.addEventListener("click", async () => { + const delay = parseInt(els.delay.value, 10); + if (!Number.isFinite(delay) || delay < 0) { + alert("Enter a non-negative warning duration."); + return; + } + if (!confirm(`Update modpack? Players get a ${delay}s warning, then the server restarts.`)) return; + try { + await apiJson("/api/update/start", { delaySeconds: delay }); + await tick(); + } catch (e) { alert(e.message); } + }); + + els.cancel.addEventListener("click", async () => { + if (!confirm("Cancel the countdown? Update will be aborted; server stays running.")) return; + try { + await apiJson("/api/update/cancel", {}); + await tick(); + } catch (e) { alert(e.message); } + }); + + tick(); + setPolling(5000); +} diff --git a/server/wwwroot/modules/whitelist.js b/server/wwwroot/modules/whitelist.js new file mode 100644 index 0000000..42a15cf --- /dev/null +++ b/server/wwwroot/modules/whitelist.js @@ -0,0 +1,86 @@ +// Whitelist add / remove via the API; refreshes the panel display shortly after +// each action (server takes ~1-2 s to look up UUID via Mojang and write whitelist.json). +"use strict"; + +import { api, apiJson, escapeHtml } from "./api.js"; + +export function setupWhitelistActions(refreshSoon) { + const wlInput = document.getElementById("wlInput"); + document.getElementById("wlAdd").addEventListener("click", () => addWhitelisted(refreshSoon)); + wlInput.addEventListener("keydown", e => { if (e.key === "Enter") addWhitelisted(refreshSoon); }); + + // Delegated removal -- list items are re-rendered each tick, no static binding. + document.getElementById("whitelist").addEventListener("click", async e => { + const btn = e.target.closest(".wl-remove"); + if (!btn) return; + const name = btn.dataset.name; + if (!name) return; + if (!confirm(`Remove ${name} from whitelist?`)) return; + try { + await apiJson("/api/whitelist/remove", { name }); + refreshSoon(); + } catch (err) { alert(err.message); } + }); + + // Pending whitelist requests from friends. Approve adds to whitelist + clears + // the request; Deny just marks denied so the friend's launcher knows. + const reqsList = document.getElementById("wlRequests"); + const reqsBlock = document.getElementById("wlRequestsBlock"); + const reqsBadge = document.getElementById("wlReqBadge"); + + reqsList?.addEventListener("click", async e => { + const btn = e.target.closest("button[data-req-action]"); + if (!btn) return; + const name = btn.dataset.name; + const action = btn.dataset.reqAction; // "approve" | "deny" + if (!name || !action) return; + if (action === "deny" && !confirm(`Deny ${name}'s request?`)) return; + try { + await apiJson(`/api/whitelist/requests/${action}`, { name }); + await refreshRequests(); + // Approving fires /whitelist add via stdin -- let the server-side write + // ~1-2 s of grace before re-reading whitelist.json. + if (action === "approve") refreshSoon(); + } catch (err) { alert(err.message); } + }); + + async function refreshRequests() { + if (!reqsList || !reqsBlock || !reqsBadge) return; + let data; + try { data = await api("/api/whitelist/requests"); } + catch { return; } + const reqs = data.requests || []; + if (reqs.length === 0) { + reqsBlock.hidden = true; + reqsBadge.hidden = true; + return; + } + reqsBlock.hidden = false; + reqsBadge.hidden = false; + reqsBadge.textContent = String(reqs.length); + reqsList.innerHTML = reqs.map(r => ` +
  13. +
    ${escapeHtml(r.username)}
    + ${r.message ? `
    "${escapeHtml(r.message)}"
    ` : ""} +
    + + +
    +
  14. + `).join(""); + } + + refreshRequests(); + setInterval(refreshRequests, 15000); +} + +async function addWhitelisted(refreshSoon) { + const inp = document.getElementById("wlInput"); + const name = inp.value.trim(); + if (!name) return; + try { + await apiJson("/api/whitelist/add", { name }); + inp.value = ""; + refreshSoon(); + } catch (e) { alert(e.message); } +} diff --git a/server/wwwroot/styles.css b/server/wwwroot/styles.css new file mode 100644 index 0000000..b9ba053 --- /dev/null +++ b/server/wwwroot/styles.css @@ -0,0 +1,521 @@ +:root { + --bg-deep: #070b16; + --bg: #0b1220; + --card: #13192a; + --card-edge: #2a3552; + --text: #e8dfc8; + --text-muted: #7a8497; + --brass: #d4a24c; + --brass-hi: #e8b95c; + --brass-lo: #5c4519; + --magic: #5dd4e8; + --danger: #b94228; + --ok: #4ade80; +} + +html, body { + margin: 0; padding: 0; + background: var(--bg); + color: var(--text); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, system-ui, sans-serif; + min-height: 100vh; +} + +.topbar { + display: flex; align-items: center; justify-content: space-between; + padding: 14px 22px; + border-bottom: 1px solid var(--brass-lo); + background: linear-gradient(180deg, #0f1626 0%, var(--bg-deep) 100%); +} +.topbar h1 { + font-size: 16px; margin: 0; + color: var(--brass-hi); + font-weight: 600; letter-spacing: 0.04em; +} + +.status-pill { + display: inline-flex; align-items: center; gap: 8px; + padding: 6px 12px; border-radius: 99px; + background: var(--bg-deep); border: 1px solid var(--card-edge); + font-size: 13px; +} +.status-pill .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--text-muted); } +.status-pill.online .dot { background: var(--ok); box-shadow: 0 0 8px var(--ok); } +.status-pill.offline .dot { background: var(--danger); } + +.layout { + max-width: 1400px; margin: 22px auto; padding: 0 22px; + display: grid; grid-template-columns: 280px 1fr 280px; gap: 18px; +} +/* Below the 3-column breakpoint: drop the right sidebar to a new full-width row + under the main + left sidebar so cards still get reasonable horizontal space. */ +@media (max-width: 1100px) { + .layout { grid-template-columns: 280px 1fr; } + .aside-right { grid-column: 1 / -1; } +} +@media (max-width: 800px) { + .layout { grid-template-columns: 1fr; } + .aside-right { grid-column: 1 / -1; } +} + +.card { + background: linear-gradient(180deg, #13192a 0%, #0a0f1a 100%); + border: 1px solid var(--brass-lo); + border-radius: 8px; + padding: 18px; +} +.card + .card { margin-top: 14px; } +.card h2 { + margin: 0 0 14px; + font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; + color: var(--brass-hi); font-weight: 600; +} + +.stat-row { display: flex; justify-content: space-between; margin: 6px 0; font-size: 13px; } +.stat-row .key { color: var(--text-muted); } +.stat-row .val { color: var(--text); font-family: "SF Mono", Consolas, monospace; } + +.name-list { list-style: none; padding: 0; margin: 0; } +.name-list li { + padding: 6px 8px; background: var(--bg-deep); border-radius: 4px; + margin-bottom: 4px; font-size: 13px; + display: flex; align-items: center; justify-content: space-between; +} +.name-list li button { + background: transparent; border: 1px solid var(--card-edge); + color: var(--text-muted); padding: 2px 8px; font-size: 11px; + border-radius: 3px; cursor: pointer; +} +.name-list li button:hover { color: var(--danger); border-color: var(--danger); } +.empty-state { color: var(--text-muted); font-size: 13px; padding: 8px 0; font-style: italic; } + +.console-pane { + background: #050810; + border: 1px solid var(--card-edge); + border-radius: 4px; + padding: 12px; + font-family: "SF Mono", Consolas, "Cascadia Mono", monospace; + font-size: 12px; line-height: 1.4; + color: #b7c0d6; + height: 480px; overflow-y: auto; + white-space: pre-wrap; word-break: break-word; +} +.console-pane .err { color: #ff8a72; } + +.input-row { display: flex; gap: 8px; margin-top: 10px; } +.input-wrap { + flex: 1; position: relative; + background: var(--bg-deep); + border: 1px solid var(--card-edge); + border-radius: 4px; +} +.input-wrap:focus-within { border-color: var(--brass); } + +.ghost { + position: absolute; inset: 0; + padding: 8px 12px; + font-family: "SF Mono", Consolas, monospace; font-size: 13px; + line-height: normal; + color: var(--text-muted); + pointer-events: none; + white-space: pre; + overflow: hidden; + opacity: 0.55; +} +.ghost .typed { color: transparent; } + +.input-wrap input { + width: 100%; box-sizing: border-box; + background: transparent; + border: none; + color: var(--text); + padding: 8px 12px; + font-family: "SF Mono", Consolas, monospace; font-size: 13px; + position: relative; +} +.input-wrap input:focus { outline: none; } +/* Hide the browser's built-in number-input spinner -- looks out of place against the dark theme */ +.input-wrap input[type="number"]::-webkit-inner-spin-button, +.input-wrap input[type="number"]::-webkit-outer-spin-button { + -webkit-appearance: none; margin: 0; +} +.input-wrap input[type="number"] { -moz-appearance: textfield; } + +/* Suggestion dropdown -- shown below the command input with multiple matches */ +.suggest-list { + position: absolute; + top: calc(100% + 4px); + left: 0; right: 0; + background: var(--bg-deep); + border: 1px solid var(--brass-lo); + border-radius: 4px; + max-height: 220px; + overflow-y: auto; + z-index: 10; + box-shadow: 0 6px 18px rgba(0, 0, 0, 0.4); + display: none; +} +.suggest-list.show { display: block; } +.suggest-item { + padding: 7px 12px; + cursor: pointer; + font-family: "SF Mono", Consolas, monospace; + font-size: 13px; + color: var(--text); + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 12px; +} +.suggest-item + .suggest-item { + border-top: 1px solid #1a2436; +} +.suggest-item:hover, .suggest-item.active { + background: var(--card); + color: var(--brass-hi); +} +.suggest-item .args { + color: var(--text-muted); + font-size: 11px; + font-style: italic; +} +.suggest-item .args em { font-style: normal; color: var(--brass); } +.suggest-empty { padding: 8px 12px; color: var(--text-muted); font-size: 12px; font-style: italic; } + +.hint { + font-size: 11px; color: var(--text-muted); + padding: 6px 0 0 4px; min-height: 16px; +} +.hint kbd { + background: var(--bg-deep); border: 1px solid var(--card-edge); + padding: 1px 4px; border-radius: 2px; font-size: 10px; +} + +button { + background: linear-gradient(180deg, var(--brass-hi) 0%, var(--brass) 50%, var(--brass-lo) 100%); + color: #1a140f; + border: 1px solid var(--brass-lo); + padding: 8px 16px; border-radius: 4px; + font-weight: 600; cursor: pointer; font-size: 13px; +} +button:hover { filter: brightness(1.1); } +button.danger { + background: linear-gradient(180deg, #d65a3e 0%, var(--danger) 50%, #6a2814 100%); + color: #fff; + border-color: #6a2814; +} +button.ghost-btn { + background: var(--bg-deep); + color: var(--text); + border-color: var(--card-edge); +} + +.actions { display: flex; gap: 8px; flex-wrap: wrap; } +.footer { color: var(--text-muted); font-size: 11px; text-align: center; padding: 22px; } + +/* Modal dialogs (Pregen / Backups / Wipe / etc.) */ +.modal { + position: fixed; inset: 0; z-index: 50; + display: flex; align-items: center; justify-content: center; + padding: 20px; +} +.modal[hidden] { display: none; } +.modal-backdrop { + position: absolute; inset: 0; + background: rgba(7, 11, 22, 0.85); + backdrop-filter: blur(2px); +} +.modal-dialog { + position: relative; + background: linear-gradient(180deg, #13192a 0%, #0a0f1a 100%); + border: 1px solid var(--brass-lo); + border-radius: 8px; + padding: 24px; + width: 100%; max-width: 520px; + max-height: 85vh; overflow-y: auto; + box-shadow: 0 14px 40px rgba(0, 0, 0, 0.6); +} +.modal-dialog.danger { border-color: #6a2814; } +.modal-header { + display: flex; justify-content: space-between; align-items: center; + margin-bottom: 14px; + padding-bottom: 10px; + border-bottom: 1px solid var(--card-edge); +} +.modal-header h2 { + margin: 0; + font-size: 13px; letter-spacing: 0.08em; text-transform: uppercase; + color: var(--brass-hi); font-weight: 600; +} +.modal-dialog.danger .modal-header h2 { color: #d65a3e; } +.modal-close { + background: transparent; border: none; + color: var(--text-muted); font-size: 22px; line-height: 1; + cursor: pointer; padding: 0 4px; +} +.modal-close:hover { color: var(--text); } + +/* Trigger button list (the "World" card, etc.) */ +.trigger-list { + display: flex; flex-direction: column; gap: 6px; +} +.trigger-list button { + width: 100%; text-align: left; + display: flex; align-items: center; justify-content: space-between; + gap: 8px; +} +.trigger-list .badge { + background: var(--bg-deep); border: 1px solid var(--card-edge); + color: var(--text-muted); + padding: 1px 6px; border-radius: 99px; + font-size: 10px; font-weight: 500; +} +.trigger-list .badge.ok { color: var(--ok); border-color: var(--ok); } +.trigger-list .badge.warn { color: var(--brass-hi); border-color: var(--brass-lo); } + +/* Topbar server icon */ +.topbar-icon { + height: 28px; width: 28px; + margin-right: 10px; + image-rendering: -webkit-optimize-contrast; +} +.topbar-left { + display: flex; align-items: center; +} + +/* Login overlay */ +.login-overlay { + position: fixed; inset: 0; z-index: 100; + background: rgba(7, 11, 22, 0.92); + display: flex; align-items: center; justify-content: center; + backdrop-filter: blur(2px); +} +.login-overlay[hidden] { display: none; } +.login-box { + background: linear-gradient(180deg, #13192a 0%, #0a0f1a 100%); + border: 1px solid var(--brass-lo); + border-radius: 8px; + padding: 28px 32px; + width: 320px; + box-shadow: 0 14px 40px rgba(0, 0, 0, 0.6); +} +.login-box h2 { + margin: 0 0 4px; + font-size: 16px; letter-spacing: 0.04em; + color: var(--brass-hi); font-weight: 600; +} +.login-box p { + margin: 0 0 16px; color: var(--text-muted); font-size: 13px; +} +.login-box .input-wrap { margin-bottom: 12px; } +.login-box button { width: 100%; } +.login-error { color: var(--danger); font-size: 12px; min-height: 14px; padding-top: 8px; } + +/* Account card */ +.acct-form { font-size: 12px; } +.acct-msg { font-size: 12px; min-height: 14px; margin-top: 8px; color: var(--danger); } +.acct-msg.ok { color: var(--ok); } + +/* Modpack update card */ +#updateCard .update-note { + font-size: 12px; color: var(--text-muted); + margin: 10px 0 0; line-height: 1.4; +} +#updateCard .update-progress { margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--card-edge); } +#updateCard .update-phase { + font-size: 12px; letter-spacing: 0.06em; text-transform: uppercase; + color: var(--brass-hi); font-weight: 600; margin-bottom: 6px; +} +#updateCard .update-status { font-size: 12px; color: var(--text); margin-top: 6px; } +#updateCard .update-progress button { margin-top: 10px; } +/* Pulsing border highlight when an update is available */ +#updateCard.has-update { + border-color: var(--brass); + box-shadow: 0 0 0 1px var(--brass-lo), 0 0 18px rgba(212, 162, 76, 0.18); +} + +/* Resources card -- Memory + CPU with progress bars */ +.res-block { margin-bottom: 14px; } +.res-block:last-child { margin-bottom: 0; } +.res-label { + display: flex; justify-content: space-between; align-items: baseline; + font-size: 12px; color: var(--text-muted); + margin-bottom: 6px; +} +.res-label .res-val { color: var(--text); font-family: "SF Mono", Consolas, monospace; } +.res-bar { + height: 6px; + background: var(--bg-deep); + border: 1px solid var(--card-edge); + border-radius: 3px; + overflow: hidden; +} +.res-bar > div { + height: 100%; width: 0%; + background: linear-gradient(90deg, var(--brass-lo), var(--brass-hi)); + transition: width 0.4s ease; +} +.res-sub { + display: flex; justify-content: space-between; + margin-top: 6px; + font-size: 11px; color: var(--text-muted); +} +.res-sub strong { + color: var(--text); font-family: "SF Mono", Consolas, monospace; + font-weight: 500; margin-left: 4px; +} + +/* Collapsible cards (h2 click toggles) */ +.card.collapsible .collapsible-toggle { + cursor: pointer; + user-select: none; + display: flex; align-items: center; gap: 8px; +} +.card.collapsible .caret { + display: inline-block; + transition: transform 0.2s ease; + color: var(--brass); + font-size: 12px; +} +.card.collapsible:not(.expanded) .caret { transform: rotate(-90deg); } +.card.collapsible:not(.expanded) .card-body { display: none; } +.card.collapsible:not(.expanded) h2 { margin: 0; } + +/* Server settings modal */ +.settings-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px; + margin-bottom: 14px; +} +.settings-grid label { + display: flex; flex-direction: column; gap: 4px; + font-size: 11px; color: var(--text-muted); +} +.settings-grid input, .settings-grid select { + background: var(--bg-deep); + border: 1px solid var(--card-edge); + border-radius: 4px; + color: var(--text); + padding: 6px 8px; + font-family: "SF Mono", Consolas, monospace; + font-size: 12px; +} +.settings-grid input:focus, .settings-grid select:focus { + outline: none; border-color: var(--brass); +} +.settings-grid label:nth-child(1) { grid-column: 1 / -1; } /* MOTD spans both cols */ +.settings-checks { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 6px 14px; + padding-top: 10px; + border-top: 1px solid var(--card-edge); +} +.settings-checks label { font-size: 12px; } + +/* Whitelist requests */ +.wl-req-label { + font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; + color: var(--brass-hi); font-weight: 600; + margin: 6px 0 6px 2px; +} +#wlRequests li { + flex-direction: column; align-items: stretch; gap: 6px; +} +.wl-req-meta { font-size: 11px; color: var(--text); } +.wl-req-msg { font-size: 11px; color: var(--text-muted); font-style: italic; } +.wl-req-actions { display: flex; gap: 4px; } +.wl-req-actions button { padding: 3px 8px; font-size: 10px; } +.card h2 .badge { vertical-align: middle; margin-left: 6px; } + +/* Backups card */ +.backup-item { + display: flex; justify-content: space-between; align-items: center; + gap: 8px; padding: 8px 10px; + flex-wrap: wrap; +} +.backup-meta { flex: 1; min-width: 0; } +.backup-name { + font-family: "SF Mono", Consolas, monospace; font-size: 11px; + color: var(--text); word-break: break-all; +} +.backup-sub { font-size: 10px; color: var(--text-muted); margin-top: 2px; } +.backup-actions { display: flex; gap: 4px; flex-shrink: 0; } +.backup-actions button { font-size: 10px; padding: 3px 8px; } + +/* Danger zone card */ +.danger-card { border-color: #6a2814; } +.danger-card .collapsible-toggle .caret { color: var(--danger); } +.danger-card h2 { color: #d65a3e; } +.danger-note { + font-size: 12px; color: var(--text-muted); + margin: 0 0 12px; line-height: 1.45; +} +.danger-note code { + background: var(--bg-deep); border: 1px solid var(--card-edge); + padding: 1px 5px; border-radius: 3px; font-size: 11px; +} +.danger-row { + display: flex; align-items: center; gap: 8px; + font-size: 13px; color: var(--text); + cursor: pointer; +} +.danger-row input[type="checkbox"] { margin: 0; } +.danger-section { + margin-top: 12px; + padding: 10px 12px; + border: 1px solid var(--card-edge); + border-radius: 6px; + background: rgba(255, 255, 255, 0.02); +} +.danger-section-title { + font-size: 12px; font-weight: 600; + text-transform: uppercase; + color: var(--muted); + margin-bottom: 8px; + letter-spacing: 0.4px; +} +.danger-section .danger-row { margin: 4px 0; } +.danger-section code { + font-family: var(--mono, monospace); + font-size: 12px; + color: var(--accent, #d4a24c); +} +.danger-section input[type="text"] { + background: var(--input-bg, #0b1220); + color: var(--text); + border: 1px solid var(--card-edge); + border-radius: 4px; + padding: 4px 6px; + font-size: 12px; + font-family: var(--mono, monospace); +} +.danger-section input[type="text"]:disabled { opacity: 0.4; } + +/* Pre-generation status panel */ +.pg-status { + margin-top: 14px; + padding-top: 12px; + border-top: 1px solid var(--card-edge); + font-size: 12px; +} +.pg-status .stat-row { font-size: 12px; margin: 4px 0; } +.pg-progress-bar { + height: 6px; + background: var(--bg-deep); + border: 1px solid var(--card-edge); + border-radius: 3px; + margin: 8px 0 10px; + overflow: hidden; +} +.pg-progress-bar > div { + height: 100%; + background: linear-gradient(90deg, var(--brass-lo), var(--brass-hi)); + width: 0%; + transition: width 0.4s ease; +} +.pg-state-running { color: var(--ok); } +.pg-state-paused { color: var(--brass-hi); } +.pg-state-idle { color: var(--text-muted); } +.pg-state-cancelling { color: var(--danger); }

    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 + + Exe + net8.0 + enable + enable + BrassAndSigil.Server + brass-sigil-server + Assets\icon.ico + + + linux-x64 + linux-x64;win-x64 + true + true + true + true + embedded + + + true + false + true + + + + + + + + + + + + + + BrassAndSigil.Server.Assets.server-icon.png + + + diff --git a/server/Commands/BaseCommandSettings.cs b/server/Commands/BaseCommandSettings.cs new file mode 100644 index 0000000..14c0bfa --- /dev/null +++ b/server/Commands/BaseCommandSettings.cs @@ -0,0 +1,11 @@ +using System.ComponentModel; +using Spectre.Console.Cli; + +namespace BrassAndSigil.Server.Commands; + +public class BaseCommandSettings : CommandSettings +{ + [CommandOption("-c|--config ")] + [Description("Path to server-config.json (defaults to ./server-config.json)")] + public string ConfigPath { get; set; } = "server-config.json"; +} diff --git a/server/Commands/CheckCommand.cs b/server/Commands/CheckCommand.cs new file mode 100644 index 0000000..43382c7 --- /dev/null +++ b/server/Commands/CheckCommand.cs @@ -0,0 +1,90 @@ +using System.Diagnostics; +using BrassAndSigil.Server.Models; +using BrassAndSigil.Server.Services; +using Spectre.Console; +using Spectre.Console.Cli; + +namespace BrassAndSigil.Server.Commands; + +public sealed class CheckCommand : AsyncCommand +{ + public override async Task ExecuteAsync(CommandContext context, BaseCommandSettings settings) + { + var config = ServerConfig.Load(settings.ConfigPath); + AnsiConsole.MarkupLine("[bold]Checking server install...[/]"); + var ok = true; + + // 1. Java available? + var javaVersion = await TryRunForOutputAsync(config.JavaPath, "-version"); + if (javaVersion is not null) + AnsiConsole.MarkupLine($" [green]✓[/] Java reachable: {javaVersion.Split('\n')[0].Trim().EscapeMarkup()}"); + else + { AnsiConsole.MarkupLine($" [red]✗[/] Java not found at '{config.JavaPath}'"); ok = false; } + + // 2. Server dir + var serverDir = Path.GetFullPath(config.ServerDir); + if (Directory.Exists(serverDir)) + AnsiConsole.MarkupLine($" [green]✓[/] Server dir exists: {serverDir}"); + else + { AnsiConsole.MarkupLine($" [yellow]?[/] Server dir missing -- run [yellow]install[/] first"); ok = false; } + + // 3. EULA + var eulaPath = Path.Combine(serverDir, "eula.txt"); + if (File.Exists(eulaPath) && File.ReadAllText(eulaPath).Contains("eula=true")) + AnsiConsole.MarkupLine(" [green]✓[/] EULA accepted"); + else + { AnsiConsole.MarkupLine(" [yellow]?[/] EULA not accepted (re-run [yellow]install --accept-eula[/])"); ok = false; } + + // 4. NeoForge run script + var runScript = Path.Combine(serverDir, OperatingSystem.IsWindows() ? "run.bat" : "run.sh"); + if (File.Exists(runScript)) + AnsiConsole.MarkupLine($" [green]✓[/] Loader start script: {Path.GetFileName(runScript)}"); + else + AnsiConsole.MarkupLine($" [yellow]?[/] No {Path.GetFileName(runScript)} -- install the NeoForge server first"); + + // 5. Manifest reachable + try + { + using var http = new HttpClient { Timeout = TimeSpan.FromSeconds(10) }; + var resp = await http.GetAsync(config.ManifestUrl); + if (resp.IsSuccessStatusCode) + AnsiConsole.MarkupLine($" [green]✓[/] Manifest reachable: {config.ManifestUrl}"); + else + { AnsiConsole.MarkupLine($" [red]✗[/] Manifest HTTP {(int)resp.StatusCode}: {config.ManifestUrl}"); ok = false; } + } + catch (Exception ex) + { AnsiConsole.MarkupLine($" [red]✗[/] Manifest fetch error: {ex.Message.EscapeMarkup()}"); ok = false; } + + // 6. Pack version on disk + var packVer = Path.Combine(serverDir, "pack-version.json"); + if (File.Exists(packVer)) + AnsiConsole.MarkupLine($" [green]✓[/] Pack synced: {File.ReadAllText(packVer).Replace("\n", " ").Replace("\r", "").Trim().EscapeMarkup()}"); + else + AnsiConsole.MarkupLine(" [yellow]?[/] Pack not synced yet (run [yellow]sync[/])"); + + AnsiConsole.MarkupLine(""); + AnsiConsole.MarkupLine(ok ? "[green]All required checks passed.[/]" : "[yellow]Some checks failed; see above.[/]"); + return ok ? 0 : 1; + } + + private static async Task TryRunForOutputAsync(string fileName, string args) + { + try + { + var p = Process.Start(new ProcessStartInfo + { + FileName = fileName, + Arguments = args, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true, + }); + if (p is null) return null; + var output = await p.StandardError.ReadToEndAsync() + await p.StandardOutput.ReadToEndAsync(); + await p.WaitForExitAsync(); + return output; + } + catch { return null; } + } +} diff --git a/server/Commands/InstallCommand.cs b/server/Commands/InstallCommand.cs new file mode 100644 index 0000000..339b9e0 --- /dev/null +++ b/server/Commands/InstallCommand.cs @@ -0,0 +1,141 @@ +using System.ComponentModel; +using BrassAndSigil.Server.Models; +using BrassAndSigil.Server.Services; +using Spectre.Console; +using Spectre.Console.Cli; + +namespace BrassAndSigil.Server.Commands; + +public sealed class InstallCommand : AsyncCommand +{ + public sealed class Settings : BaseCommandSettings + { + [CommandOption("--manifest ")] + [Description("Manifest URL to bootstrap from")] + public string? ManifestUrl { get; set; } + + [CommandOption("--server-dir ")] + [Description("Where to install the server (defaults to ./server)")] + public string? ServerDir { get; set; } + + [CommandOption("--memory ")] + [Description("RAM allocation in MB (defaults to 8192)")] + public int? MemoryMB { get; set; } + + [CommandOption("--accept-eula")] + [Description("Accept the Minecraft EULA. Required for the server to actually run.")] + public bool AcceptEula { get; set; } + } + + public override async Task ExecuteAsync(CommandContext context, Settings settings) + { + var config = ServerConfig.Load(settings.ConfigPath); + if (settings.ManifestUrl != null) config.ManifestUrl = settings.ManifestUrl; + if (settings.ServerDir != null) config.ServerDir = settings.ServerDir; + if (settings.MemoryMB != null) config.MemoryMB = settings.MemoryMB.Value; + if (settings.AcceptEula) config.AcceptEula = true; + + AnsiConsole.MarkupLine("[bold yellow]Brass & Sigil Server install[/]"); + AnsiConsole.MarkupLine($" Config: {settings.ConfigPath}"); + AnsiConsole.MarkupLine($" ServerDir: {Path.GetFullPath(config.ServerDir)}"); + AnsiConsole.MarkupLine($" Manifest: {config.ManifestUrl}"); + AnsiConsole.MarkupLine($" Memory: {config.MemoryMB} MB"); + AnsiConsole.MarkupLine(""); + + if (!config.AcceptEula) + { + AnsiConsole.MarkupLine("[red]EULA not accepted.[/] Re-run with --accept-eula to confirm you accept the"); + AnsiConsole.MarkupLine("Minecraft End User License Agreement: [blue]https://aka.ms/MinecraftEULA[/]"); + return 1; + } + + Directory.CreateDirectory(config.ServerDir); + + // Generate eula.txt + await File.WriteAllTextAsync( + Path.Combine(config.ServerDir, "eula.txt"), + $"# Generated by brass-sigil-server install\n" + + $"# By setting this to true you agree to the Minecraft EULA: https://aka.ms/MinecraftEULA\n" + + $"eula=true\n"); + + // Generate a default server.properties if none exists yet + var propsPath = Path.Combine(config.ServerDir, "server.properties"); + if (!File.Exists(propsPath)) + { + await File.WriteAllTextAsync(propsPath, DefaultServerProperties(config)); + AnsiConsole.MarkupLine($"[grey]Wrote default server.properties[/]"); + } + + // Generate a random RCON password if missing + if (string.IsNullOrEmpty(config.RconPassword)) + { + config.RconPassword = Convert.ToHexString(Guid.NewGuid().ToByteArray()).ToLowerInvariant(); + UpdateProp(propsPath, "enable-rcon", "true"); + UpdateProp(propsPath, "rcon.port", config.RconPort.ToString()); + UpdateProp(propsPath, "rcon.password", config.RconPassword); + } + + // Save config + config.Save(settings.ConfigPath); + AnsiConsole.MarkupLine($"[grey]Saved config to {settings.ConfigPath}[/]"); + + // Sync mods + AnsiConsole.MarkupLine(""); + AnsiConsole.MarkupLine("[bold]Syncing mods from manifest...[/]"); + var sync = new ManifestSync(); + var progress = new Progress(msg => AnsiConsole.MarkupLine($" [grey]{msg.EscapeMarkup()}[/]")); + try + { + var result = await sync.SyncAsync(config.ManifestUrl, config.ServerDir, progress); + AnsiConsole.MarkupLine(""); + AnsiConsole.MarkupLine($"[green]✓ Sync complete:[/] pack v{result.PackVersion}, " + + $"{result.Downloaded} downloaded, {result.Removed} removed, " + + $"{result.Skipped} client-only mods skipped"); + } + catch (Exception ex) + { + AnsiConsole.MarkupLine($"[red]✗ Sync failed:[/] {ex.Message.EscapeMarkup()}"); + return 1; + } + + AnsiConsole.MarkupLine(""); + AnsiConsole.MarkupLine("[bold green]Install complete.[/]"); + AnsiConsole.MarkupLine("Next steps:"); + AnsiConsole.MarkupLine($" 1. Download the matching NeoForge server installer for the manifest's loader version"); + AnsiConsole.MarkupLine($" (server side, into {Path.GetFullPath(config.ServerDir)}) -- the modpack manifest"); + AnsiConsole.MarkupLine($" doesn't bundle it because each loader has its own installer."); + AnsiConsole.MarkupLine($" [blue]https://maven.neoforged.net/releases/net/neoforged/neoforge/[/]"); + AnsiConsole.MarkupLine($" 2. Run the NeoForge installer with --installServer in the server dir"); + AnsiConsole.MarkupLine($" 3. Then start: [yellow]brass-sigil-server run[/]"); + return 0; + } + + private static string DefaultServerProperties(ServerConfig config) => $@"# Brass & Sigil server defaults -- edit as needed +motd=Brass & Sigil +gamemode=survival +difficulty=normal +hardcore=false +pvp=true +online-mode=true +white-list=true +enforce-whitelist=true +max-players=20 +view-distance=12 +simulation-distance=10 +spawn-protection=0 +enable-rcon=true +rcon.port={config.RconPort} +rcon.password={config.RconPassword} +broadcast-rcon-to-ops=false +"; + + private static void UpdateProp(string path, string key, string value) + { + var lines = File.ReadAllLines(path).ToList(); + var prefix = $"{key}="; + var idx = lines.FindIndex(l => l.StartsWith(prefix)); + if (idx >= 0) lines[idx] = prefix + value; + else lines.Add(prefix + value); + File.WriteAllLines(path, lines); + } +} diff --git a/server/Commands/RunCommand.cs b/server/Commands/RunCommand.cs new file mode 100644 index 0000000..8732593 --- /dev/null +++ b/server/Commands/RunCommand.cs @@ -0,0 +1,1225 @@ +using System.Collections.Concurrent; +using System.Diagnostics; +using System.Text.Json; +using BrassAndSigil.Server.Models; +using BrassAndSigil.Server.Services; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.FileProviders.Embedded; +using Microsoft.Extensions.Hosting; +using Spectre.Console; +using Spectre.Console.Cli; + +namespace BrassAndSigil.Server.Commands; + +public sealed class RunCommand : AsyncCommand +{ + public override async Task ExecuteAsync(CommandContext context, BaseCommandSettings settings) + { + var configPath = settings.ConfigPath; + var config = ServerConfig.Load(configPath); + + AnsiConsole.MarkupLine("[bold yellow]Brass & Sigil Server[/]"); + AnsiConsole.MarkupLine($"[grey]config: {configPath}[/]"); + AnsiConsole.MarkupLine(""); + + // ────────── First-run admin setup ────────── + // Fail-secure: if WebPassword is null (key missing or never set), force a + // password to be configured before doing anything else. Empty string ("") + // is the explicit "no auth" opt-out and is rejected on non-localhost binds. + // Done here, BEFORE the heavy install + MC start so the prompt isn't + // drowned out by streaming log output. + if (config.WebPassword is null) + { + if (Console.IsInputRedirected) + { + var generated = Convert.ToBase64String(System.Security.Cryptography.RandomNumberGenerator.GetBytes(18)) + .Replace("+", "-").Replace("/", "_").Replace("=", ""); + config.WebPassword = generated; + config.Save(configPath); + AnsiConsole.MarkupLine(""); + AnsiConsole.MarkupLine("[bold yellow]═══════════ ADMIN PASSWORD GENERATED ═══════════[/]"); + AnsiConsole.MarkupLine($"[bold]Password:[/] [yellow]{generated}[/]"); + AnsiConsole.MarkupLine($"[grey]Saved to {configPath}. Use the [/][bold]Change password[/][grey] button in the panel to set your own.[/]"); + AnsiConsole.MarkupLine("[bold yellow]════════════════════════════════════════════════[/]"); + AnsiConsole.MarkupLine(""); + } + else + { + AnsiConsole.MarkupLine("[bold]First-run admin setup[/]"); + AnsiConsole.MarkupLine("[grey]The web panel needs an admin password before continuing.[/]"); + AnsiConsole.MarkupLine("[grey](Set [/][yellow]webPassword[/][grey] to empty string in config to disable -- local dev only.)[/]"); + string pw1, pw2; + while (true) + { + pw1 = AnsiConsole.Prompt(new TextPrompt("Admin password (min 8 chars):").Secret()); + if (pw1.Length < 8) { AnsiConsole.MarkupLine("[red]Too short.[/]"); continue; } + pw2 = AnsiConsole.Prompt(new TextPrompt("Confirm:").Secret()); + if (pw1 != pw2) { AnsiConsole.MarkupLine("[red]Doesn't match.[/]"); continue; } + break; + } + config.WebPassword = pw1; + config.Save(configPath); + AnsiConsole.MarkupLine("[green]✓[/] Admin password saved."); + AnsiConsole.MarkupLine(""); + } + } + else if (!IsLocalhostBind(config) && config.WebPassword.Length == 0) + { + AnsiConsole.MarkupLine("[red]Refusing to bind on a non-localhost address with webPassword disabled (\"\").[/]"); + AnsiConsole.MarkupLine("[red]Either set a real password or change [yellow]webHost[/] to [yellow]localhost[/].[/]"); + return 1; + } + + // ────────── Auto-setup phase: bring the server install up to spec ────────── + var ok = await EnsureInstalledAsync(config, configPath); + if (!ok) + { + AnsiConsole.MarkupLine("[red]Auto-setup failed; cannot run server.[/]"); + return 1; + } + + // ────────── Process + daemon phase ────────── + var serverProc = new ServerProcess(config); + // RCON connects lazily on first use AND reconnects after failure -- MC takes + // ~30 s to open the RCON port, so eager-connect-once would cache a dead client. + var rcon = new RconManager("127.0.0.1", config.RconPort, config.RconPassword); + Action srvLog = msg => AnsiConsole.MarkupLine($"[grey]{msg.EscapeMarkup()}[/]"); + var whitelistRequests = new WhitelistRequestService(config); + var broadcaster = new Broadcaster(serverProc); + var updater = new UpdaterService(config, configPath, serverProc, broadcaster, srvLog); + var backup = new BackupService(config, serverProc, broadcaster, srvLog); + var bluemap = new BlueMapService(config, srvLog); + var world = new WorldService(config, serverProc, backup, broadcaster, rcon, srvLog, bluemap); + var scheduler = new BackupScheduler(config, backup, srvLog); + scheduler.Start(); + + try + { + serverProc.Start(); + AnsiConsole.MarkupLine($"[green]✓[/] Started Minecraft (PID {serverProc.Pid})"); + } + catch (Exception ex) + { + AnsiConsole.MarkupLine($"[red]✗ Failed to start Minecraft:[/] {ex.Message.EscapeMarkup()}"); + return 1; + } + + serverProc.OnLogLine += line => + { + var ts = line.At.ToLocalTime().ToString("HH:mm:ss"); + var color = line.IsError ? "red" : "grey"; + AnsiConsole.MarkupLine($"[{color}][[{ts}]] {line.Text.EscapeMarkup()}[/]"); + }; + + // Build Kestrel host + var builder = WebApplication.CreateBuilder(); + builder.WebHost.ConfigureKestrel(opts => + { + if (IsLocalhostBind(config)) + opts.ListenLocalhost(config.WebPort); + else + opts.ListenAnyIP(config.WebPort); + }); + builder.Logging.ClearProviders(); + + // Per-IP rate limit on the login endpoint: 10 attempts / 60 s sliding window. + // Without this, a weak password is bruteforce-trivial. Keyed on remote IP so + // a single brute-forcer can't exhaust everyone's quota. + builder.Services.AddRateLimiter(rl => + { + rl.RejectionStatusCode = 429; + rl.AddPolicy("login", ctx => + System.Threading.RateLimiting.RateLimitPartition.GetFixedWindowLimiter( + ctx.Connection.RemoteIpAddress?.ToString() ?? "unknown", + _ => new System.Threading.RateLimiting.FixedWindowRateLimiterOptions + { + PermitLimit = 10, + Window = TimeSpan.FromMinutes(1), + QueueLimit = 0, + })); + // Public friend-side whitelist request: 5/hour per IP. Keeps spam manageable + // without making it annoying for friends who legitimately want to retry. + rl.AddPolicy("whitelist-request", ctx => + System.Threading.RateLimiting.RateLimitPartition.GetFixedWindowLimiter( + ctx.Connection.RemoteIpAddress?.ToString() ?? "unknown", + _ => new System.Threading.RateLimiting.FixedWindowRateLimiterOptions + { + PermitLimit = 5, + Window = TimeSpan.FromHours(1), + QueueLimit = 0, + })); + // Status check is the launcher's polling endpoint -- needs a looser limit + // so an open launcher polling status doesn't get throttled. 30/hour gives + // ~one check every 2 minutes, far more than the launcher actually needs. + rl.AddPolicy("whitelist-status", ctx => + System.Threading.RateLimiting.RateLimitPartition.GetFixedWindowLimiter( + ctx.Connection.RemoteIpAddress?.ToString() ?? "unknown", + _ => new System.Threading.RateLimiting.FixedWindowRateLimiterOptions + { + PermitLimit = 30, + Window = TimeSpan.FromHours(1), + QueueLimit = 0, + })); + }); + + // Trust X-Forwarded-For from loopback (a local reverse proxy like Caddy or nginx). + // Without this, the rate limiter would partition by Caddy's 127.0.0.1 connection + // and a single brute-forcer could exhaust everyone's quota. + builder.Services.Configure(o => + { + o.ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor + | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto; + o.KnownProxies.Add(System.Net.IPAddress.Loopback); + o.KnownProxies.Add(System.Net.IPAddress.IPv6Loopback); + }); + + var app = builder.Build(); + app.UseForwardedHeaders(); + app.UseRateLimiter(); + + // Static UI: prefer sidecar wwwroot/ for hot edits, fall back to embedded. + var sidecar = Path.Combine(AppContext.BaseDirectory, "wwwroot"); + IFileProvider uiProvider = Directory.Exists(sidecar) + ? new PhysicalFileProvider(sidecar) + : new ManifestEmbeddedFileProvider(typeof(RunCommand).Assembly, "wwwroot"); + app.UseDefaultFiles(new DefaultFilesOptions { FileProvider = uiProvider }); + app.UseStaticFiles(new StaticFileOptions { FileProvider = uiProvider }); + + // BlueMap output at /map/ -- register middleware unconditionally. We + // pre-create the directory so PhysicalFileProvider's constructor is happy + // even before the first render. + Directory.CreateDirectory(bluemap.WebDir); + var bluemapFp = new PhysicalFileProvider(Path.GetFullPath(bluemap.WebDir)); + + // (First-run admin setup happens early in ExecuteAsync, before the heavy + // install + MC start, so the interactive prompt isn't drowned by log output.) + + // Auth: enforced whenever a password is set, regardless of bind. Accepts either + // X-Brass-Sigil-Auth header (curl / scripts) or the brass-sigil-auth cookie + // (browsers -- works for SSE too since EventSource can't set custom headers). + // /api/auth/login is allowed through without auth (chicken-and-egg) but is + // separately rate-limited to throttle brute-force attempts. + // + // MUST be registered BEFORE the /map static-files handlers below -- otherwise + // those handlers short-circuit the pipeline and serve map tiles to anyone. + // The UI shell at / is intentionally above this (login page must be reachable + // unauthenticated); all sensitive operations go through /api/* which is gated. + if (!string.IsNullOrEmpty(config.WebPassword)) + { + app.Use(async (ctx, next) => + { + var path = ctx.Request.Path; + // Only gate /api/* and /map/* -- everything else is the public UI shell. + var gated = path.StartsWithSegments("/api") || path.StartsWithSegments("/map"); + if (!gated) { await next(); return; } + if (path.StartsWithSegments("/api/auth/login")) { await next(); return; } + // Friend-side whitelist request endpoints are public on purpose so the + // launcher can hit them without holding the admin password. Rate-limited + // separately to throttle abuse. + if (path.StartsWithSegments("/api/whitelist/request")) { await next(); return; } + if (path.StartsWithSegments("/api/whitelist/status")) { await next(); return; } + var pwBytes = System.Text.Encoding.UTF8.GetBytes(config.WebPassword); + var auth = ctx.Request.Headers["X-Brass-Sigil-Auth"].ToString(); + if (string.IsNullOrEmpty(auth)) + auth = ctx.Request.Cookies["brass-sigil-auth"] ?? ""; + var authBytes = System.Text.Encoding.UTF8.GetBytes(auth); + var ok = authBytes.Length == pwBytes.Length + && System.Security.Cryptography.CryptographicOperations.FixedTimeEquals(authBytes, pwBytes); + if (!ok) + { + ctx.Response.StatusCode = 401; + await ctx.Response.WriteAsync("Unauthorized"); + return; + } + await next(); + }); + } + + // /map/.../live/players.json is generated dynamically per-request from RCON + // -- pull-based, so RCON only fires while a browser tab is actually polling. + // No server-side timer, no idle-state to manage. Same model as /api/players. + // Must be registered BEFORE the /map static-files handler so it short-circuits + // even if a stale players.json exists on disk from an earlier daemon version. + const string PlayersJsonPath = "/map/maps/overworld/live/players.json"; + app.Use(async (ctx, next) => + { + if (ctx.Request.Path != PlayersJsonPath) { await next(); return; } + ctx.Response.ContentType = "application/json"; + try + { + var players = await BlueMapPlayers.SnapshotAsync(rcon, config.ServerDir, ctx.RequestAborted); + await ctx.Response.WriteAsync(JsonSerializer.Serialize(new { players }), ctx.RequestAborted); + } + catch (OperationCanceledException) { /* client gone */ } + catch + { + // Don't fail the request -- empty list is fine if RCON's having a moment. + await ctx.Response.WriteAsync("{\"players\":[]}"); + } + }); + + // /map/assets/playerheads/.png -- BlueMap's web UI requests these for + // player markers. The CLI distribution doesn't write them (only the in-server + // mod does), so on a CLI-only setup every marker falls back to assets/steve.png. + // We lazily fetch the head from crafatar.com on first request and cache to + // disk; subsequent requests hit static-files directly (zero outbound traffic). + // To force a skin refresh, delete the matching .png from + // /web/assets/playerheads/. + const string PlayerHeadPrefix = "/map/assets/playerheads/"; + var headHttp = new HttpClient { Timeout = TimeSpan.FromSeconds(8) }; + headHttp.DefaultRequestHeaders.UserAgent.ParseAdd("brass-sigil-server/1.0"); + app.Use(async (ctx, next) => + { + var p = ctx.Request.Path.Value; + if (p is null + || !p.StartsWith(PlayerHeadPrefix, StringComparison.Ordinal) + || !p.EndsWith(".png", StringComparison.Ordinal)) + { await next(); return; } + var uuidStr = p.Substring(PlayerHeadPrefix.Length, p.Length - PlayerHeadPrefix.Length - 4); + if (!Guid.TryParse(uuidStr, out _)) { await next(); return; } + var cachePath = Path.Combine(bluemap.WebDir, "assets", "playerheads", uuidStr + ".png"); + if (!File.Exists(cachePath)) + { + try + { + var bytes = await headHttp.GetByteArrayAsync( + $"https://crafatar.com/avatars/{uuidStr}?size=32&overlay", + ctx.RequestAborted); + Directory.CreateDirectory(Path.GetDirectoryName(cachePath)!); + await File.WriteAllBytesAsync(cachePath, bytes, ctx.RequestAborted); + } + catch (OperationCanceledException) { return; } + catch + { + // Fall through to static-files which 404s; BlueMap shows steve.png. + // Better UX than a 5xx -- the rest of the map keeps rendering. + } + } + await next(); + }); + + // BlueMap stores `.json` and `.prbm` files pre-compressed on disk as + // `.json.gz` / `.prbm.gz`, but its web client requests them WITHOUT the + // `.gz` suffix -- it expects the server to transparently serve the gzipped + // variant with Content-Encoding: gzip. This middleware does that rewrite + // BEFORE UseStaticFiles, so the existing OnPrepareResponse below handles + // the headers as it would for a direct .gz request. + app.Use(async (ctx, next) => + { + if (ctx.Request.Path.StartsWithSegments("/map", out var rest)) + { + var sub = rest.Value?.TrimStart('/'); + if (!string.IsNullOrEmpty(sub)) + { + var literal = bluemapFp.GetFileInfo(sub); + if (!literal.Exists) + { + var gz = bluemapFp.GetFileInfo(sub + ".gz"); + if (gz.Exists) + { + ctx.Request.Path = "/map/" + sub + ".gz"; + } + } + } + } + await next(); + }); + + app.UseDefaultFiles(new DefaultFilesOptions + { + FileProvider = bluemapFp, + RequestPath = "/map", + }); + app.UseStaticFiles(new StaticFileOptions + { + FileProvider = bluemapFp, + RequestPath = "/map", + ServeUnknownFileTypes = true, + DefaultContentType = "application/octet-stream", + OnPrepareResponse = ctx => + { + // Anything ending in .gz needs Content-Encoding: gzip and a content + // type derived from the extension BEFORE .gz (so .json.gz is JSON, + // .prbm.gz is binary). + var name = ctx.File.Name; + if (!name.EndsWith(".gz", StringComparison.Ordinal)) return; + ctx.Context.Response.Headers["Content-Encoding"] = "gzip"; + if (name.EndsWith(".json.gz", StringComparison.Ordinal)) ctx.Context.Response.Headers["Content-Type"] = "application/json"; + else if (name.EndsWith(".prbm.gz", StringComparison.Ordinal)) ctx.Context.Response.Headers["Content-Type"] = "application/octet-stream"; + }, + }); + + // ──────────────── API endpoints ──────────────── + + // ── auth endpoints ── + // /api/auth/login sets an HttpOnly cookie so JS can never read the value; + // this defeats cookie exfiltration via XSS. Rate-limited per IP. + app.MapPost("/api/auth/login", async (HttpContext ctx) => + { + using var sr = new StreamReader(ctx.Request.Body); + var payload = JsonSerializer.Deserialize(await sr.ReadToEndAsync(), JsonOpts.CaseInsensitive); + var supplied = payload?.Password ?? ""; + var pwBytes = System.Text.Encoding.UTF8.GetBytes(config.WebPassword ?? ""); + var supBytes = System.Text.Encoding.UTF8.GetBytes(supplied); + var ok = pwBytes.Length > 0 + && supBytes.Length == pwBytes.Length + && System.Security.Cryptography.CryptographicOperations.FixedTimeEquals(supBytes, pwBytes); + if (!ok) + { + ctx.Response.StatusCode = 401; + await ctx.Response.WriteAsync("Wrong password"); + return; + } + ctx.Response.Cookies.Append("brass-sigil-auth", config.WebPassword!, new CookieOptions + { + HttpOnly = true, + Secure = ctx.Request.IsHttps, + SameSite = SameSiteMode.Strict, + Path = "/", + }); + await ctx.Response.WriteAsJsonAsync(new { ok = true }); + }).AllowAnonymous().RequireRateLimiting("login"); + + app.MapPost("/api/auth/logout", (HttpContext ctx) => + { + ctx.Response.Cookies.Delete("brass-sigil-auth"); + return Results.Json(new { ok = true }); + }); + + app.MapPost("/api/auth/change-password", async (HttpContext ctx) => + { + using var sr = new StreamReader(ctx.Request.Body); + var payload = JsonSerializer.Deserialize(await sr.ReadToEndAsync(), JsonOpts.CaseInsensitive); + var current = payload?.Current ?? ""; + var next = payload?.Next ?? ""; + var pwBytes = System.Text.Encoding.UTF8.GetBytes(config.WebPassword ?? ""); + var curBytes = System.Text.Encoding.UTF8.GetBytes(current); + var ok = pwBytes.Length > 0 + && curBytes.Length == pwBytes.Length + && System.Security.Cryptography.CryptographicOperations.FixedTimeEquals(curBytes, pwBytes); + if (!ok) return Results.Json(new { ok = false, error = "Current password is wrong" }, statusCode: 401); + if (next.Length < 8) return Results.Json(new { ok = false, error = "New password must be at least 8 characters" }, statusCode: 400); + config.WebPassword = next; + config.Save(configPath); + // Re-issue the cookie with the new password so the current session stays logged in. + ctx.Response.Cookies.Append("brass-sigil-auth", next, new CookieOptions + { + HttpOnly = true, + Secure = ctx.Request.IsHttps, + SameSite = SameSiteMode.Strict, + Path = "/", + }); + return Results.Json(new { ok = true }); + }); + + app.MapGet("/api/status", () => Results.Json(new + { + running = serverProc.IsRunning, + pid = serverProc.Pid, + startedAt = serverProc.StartedAt, + uptime = serverProc.StartedAt is { } s ? (DateTime.UtcNow - s).TotalSeconds : (double?)null, + packVersion = ReadPackVersion(config.ServerDir), + memoryBytes = serverProc.MemoryBytes, + memoryMaxMB = config.MemoryMB, + cpu = serverProc.CpuMetrics is { } m + ? new { current = m.Current, max = m.Max, avg = m.Avg } + : null, + worldSizeBytes = world.GetWorldSizeBytes(), + })); + + app.MapGet("/api/logs", (int? since) => + { + var logs = serverProc.RecentLogs(); + if (since.HasValue) logs = logs.Skip(since.Value).ToArray(); + return Results.Json(new + { + total = serverProc.RecentLogs().Count, + lines = logs.Select(l => new { t = l.At, e = l.IsError, m = l.Text }) + }); + }); + + // Server-Sent Events: instant push of new log lines + a replay of the recent buffer + // on connect. Browsers (EventSource) reconnect automatically if the stream drops. + app.MapGet("/api/logs/stream", async (HttpContext ctx, CancellationToken ct) => + { + ctx.Response.Headers.ContentType = "text/event-stream"; + ctx.Response.Headers.CacheControl = "no-cache"; + ctx.Response.Headers["X-Accel-Buffering"] = "no"; // disable nginx response buffering + await ctx.Response.Body.FlushAsync(ct); + + var channel = System.Threading.Channels.Channel.CreateUnbounded( + new System.Threading.Channels.UnboundedChannelOptions { SingleReader = true, SingleWriter = false }); + + void OnLine(ServerProcess.LogLine line) => channel.Writer.TryWrite(line); + serverProc.OnLogLine += OnLine; + + try + { + // Replay the ring buffer first so reconnecting clients get the recent context. + foreach (var l in serverProc.RecentLogs()) + { + await WriteSseLogAsync(ctx.Response, l, ct); + } + + // Then live-stream new lines. Heartbeat every 25 s so the connection isn't + // killed by intermediaries (nginx, browser idle timeouts). + using var heartbeatTimer = new PeriodicTimer(TimeSpan.FromSeconds(25)); + var heartbeatTask = Task.Run(async () => + { + try { while (await heartbeatTimer.WaitForNextTickAsync(ct)) await ctx.Response.WriteAsync(": ping\n\n", ct); } + catch { } + }, ct); + + while (!ct.IsCancellationRequested) + { + var line = await channel.Reader.ReadAsync(ct); + await WriteSseLogAsync(ctx.Response, line, ct); + } + } + catch (OperationCanceledException) { /* client disconnected */ } + finally + { + serverProc.OnLogLine -= OnLine; + channel.Writer.TryComplete(); + } + }); + + app.MapPost("/api/command", async (HttpContext ctx) => + { + using var sr = new StreamReader(ctx.Request.Body); + var body = await sr.ReadToEndAsync(); + var payload = JsonSerializer.Deserialize(body, JsonOpts.CaseInsensitive); + var cmd = payload?.Command?.Trim(); + if (string.IsNullOrEmpty(cmd)) return Results.BadRequest("empty command"); + await serverProc.SendInputAsync(cmd); + return Results.Json(new { ok = true }); + }); + + app.MapGet("/api/whitelist", () => + { + var path = Path.Combine(Path.GetFullPath(config.ServerDir), "whitelist.json"); + if (!File.Exists(path)) return Results.Json(new { players = Array.Empty() }); + try + { + using var doc = JsonDocument.Parse(File.ReadAllText(path)); + var names = doc.RootElement.EnumerateArray() + .Select(e => e.TryGetProperty("name", out var n) ? n.GetString() : null) + .Where(n => !string.IsNullOrWhiteSpace(n)) + .ToArray(); + return Results.Json(new { players = names }); + } + catch (Exception ex) + { + return Results.Json(new { players = Array.Empty(), error = ex.Message }); + } + }); + + // ── Public whitelist request flow (friend-side, no auth) ── + // Friends post their MC username; admin sees the queue in the panel and + // approves/denies. The /whitelist add command itself still goes through the + // normal admin-gated endpoint below. + app.MapPost("/api/whitelist/request", async (HttpContext ctx) => + { + using var sr = new StreamReader(ctx.Request.Body); + var payload = JsonSerializer.Deserialize( + await sr.ReadToEndAsync(), JsonOpts.CaseInsensitive); + var name = payload?.Username?.Trim(); + if (string.IsNullOrEmpty(name) || name.Length > 16 + || !System.Text.RegularExpressions.Regex.IsMatch(name, @"^[A-Za-z0-9_]{3,16}$")) + { + return Results.BadRequest(new { ok = false, error = "Username must be 3-16 letters/digits/underscore." }); + } + var ip = ctx.Connection.RemoteIpAddress?.ToString(); + var req = whitelistRequests.Submit(name, payload?.Message, ip); + return Results.Json(new { ok = true, status = req.Status }); + }).AllowAnonymous().RequireRateLimiting("whitelist-request"); + + // Same per-IP throttle as the request endpoint -- prevents trivial enumeration + // while still letting the launcher's polling work fine. + app.MapGet("/api/whitelist/status", (string username) => + { + var name = (username ?? "").Trim(); + if (string.IsNullOrEmpty(name)) return Results.BadRequest(new { ok = false, error = "Missing username." }); + var status = whitelistRequests.StatusFor(name); + return Results.Json(new { ok = true, status }); + }).AllowAnonymous().RequireRateLimiting("whitelist-status"); + + // ── Admin-side: list/approve/deny (auth required via global middleware) ── + app.MapGet("/api/whitelist/requests", () => + Results.Json(new { requests = whitelistRequests.ListPending() })); + + app.MapPost("/api/whitelist/requests/approve", async (HttpContext ctx) => + { + using var sr = new StreamReader(ctx.Request.Body); + var payload = JsonSerializer.Deserialize( + await sr.ReadToEndAsync(), JsonOpts.CaseInsensitive); + var name = payload?.Name?.Trim(); + if (string.IsNullOrEmpty(name)) return Results.BadRequest(new { ok = false, error = "Missing username." }); + // Mark approved + actually add to MC's whitelist via stdin command. + whitelistRequests.MarkApproved(name); + await serverProc.SendInputAsync($"whitelist add {name}"); + // Remove from the pending file once it's actually in the whitelist. + whitelistRequests.Remove(name); + return Results.Json(new { ok = true }); + }); + + app.MapPost("/api/whitelist/requests/deny", async (HttpContext ctx) => + { + using var sr = new StreamReader(ctx.Request.Body); + var payload = JsonSerializer.Deserialize( + await sr.ReadToEndAsync(), JsonOpts.CaseInsensitive); + var name = payload?.Name?.Trim(); + if (string.IsNullOrEmpty(name)) return Results.BadRequest(new { ok = false, error = "Missing username." }); + whitelistRequests.MarkDenied(name); + return Results.Json(new { ok = true }); + }); + + app.MapPost("/api/whitelist/add", async (HttpContext ctx) => + { + using var sr = new StreamReader(ctx.Request.Body); + var payload = JsonSerializer.Deserialize(await sr.ReadToEndAsync(), JsonOpts.CaseInsensitive); + var name = payload?.Name?.Trim(); + if (string.IsNullOrEmpty(name)) return Results.BadRequest("empty name"); + await serverProc.SendInputAsync($"whitelist add {name}"); + return Results.Json(new { ok = true }); + }); + + app.MapPost("/api/whitelist/remove", async (HttpContext ctx) => + { + using var sr = new StreamReader(ctx.Request.Body); + var payload = JsonSerializer.Deserialize(await sr.ReadToEndAsync(), JsonOpts.CaseInsensitive); + var name = payload?.Name?.Trim(); + if (string.IsNullOrEmpty(name)) return Results.BadRequest("empty name"); + await serverProc.SendInputAsync($"whitelist remove {name}"); + return Results.Json(new { ok = true }); + }); + + app.MapGet("/api/players", async () => + { + try + { + var resp = await rcon.SendCommandAsync("list"); + var (count, names) = ParsePlayerList(resp); + return Results.Json(new { online = count, players = names }); + } + catch (Exception ex) + { + return Results.Json(new { online = -1, players = Array.Empty(), error = ex.Message }); + } + }); + + app.MapPost("/api/server/stop", async () => + { + await serverProc.StopAsync(); + return Results.Json(new { ok = true }); + }); + + app.MapPost("/api/server/start", () => + { + var started = serverProc.Start(); + return Results.Json(new { ok = started }); + }); + + // ── Server settings (server.properties bridge) ── + app.MapGet("/api/server/settings", () => + { + var svc = new ServerPropertiesService(config); + return Results.Json(new + { + values = svc.ReadEditable(), + editableKeys = ServerPropertiesService.EditableKeys.ToArray(), + running = serverProc.IsRunning, + }); + }); + + app.MapPost("/api/server/settings", async (HttpContext ctx) => + { + using var sr = new StreamReader(ctx.Request.Body); + var payload = JsonSerializer.Deserialize>( + await sr.ReadToEndAsync(), JsonOpts.CaseInsensitive); + if (payload is null || payload.Count == 0) + return Results.BadRequest(new { ok = false, error = "Empty payload." }); + var svc = new ServerPropertiesService(config); + svc.Update(payload); + return Results.Json(new { ok = true, restartRequired = serverProc.IsRunning }); + }); + + // ── BlueMap (manual render) ── + app.MapGet("/api/map/status", () => Results.Json(new + { + inProgress = bluemap.State.InProgress, + phase = bluemap.State.Phase, + error = bluemap.State.Error, + startedAt = bluemap.State.StartedAt, + finishedAt = bluemap.State.FinishedAt, + exitCode = bluemap.State.ExitCode, + lastLogLine = bluemap.State.LastLogLine, + hasOutput = bluemap.HasRendered, + })); + + app.MapPost("/api/map/render", () => + { + var started = bluemap.StartRender(); + return Results.Json(new { ok = started, error = started ? null : "Render already in progress." }); + }); + + app.MapPost("/api/map/cancel", () => + { + var cancelled = bluemap.CancelRender(); + return Results.Json(new { ok = cancelled, error = cancelled ? null : "No render in progress." }); + }); + + // Convenience: stop+start as one call so the panel can do it from a button. + app.MapPost("/api/server/restart", async () => + { + if (serverProc.IsRunning) await serverProc.StopAsync(); + // Brief delay so OS has time to release file handles before relaunch. + await Task.Delay(1500); + var ok = serverProc.Start(); + return Results.Json(new { ok }); + }); + + // ── Updater ── + app.MapGet("/api/update/status", async () => + { + // Quick check (refreshes State.CurrentVersion / AvailableVersion as side-effect). + var check = await updater.CheckAsync(); + return Results.Json(new + { + inProgress = updater.State.InProgress, + phase = updater.State.Phase, + countdownTotal = updater.State.CountdownTotal, + countdownRemaining = updater.State.CountdownRemaining, + current = check.Current, + available = check.Available, + needsUpdate = check.NeedsUpdate, + error = updater.State.Error ?? check.Error, + }); + }); + + app.MapPost("/api/update/start", async (HttpContext ctx) => + { + using var sr = new StreamReader(ctx.Request.Body); + var payload = JsonSerializer.Deserialize( + await sr.ReadToEndAsync(), JsonOpts.CaseInsensitive); + var delay = Math.Clamp(payload?.DelaySeconds ?? 300, 0, 3600); + + // Run the update in the background -- don't block the HTTP response on the + // 5-minute countdown. The panel polls /api/update/status for progress. + _ = Task.Run(() => updater.StartAsync(delay)); + + return Results.Accepted("/api/update/status", new { ok = true, delaySeconds = delay }); + }); + + app.MapPost("/api/update/cancel", () => + { + var cancelled = updater.TryCancel(); + return Results.Json(new { ok = cancelled }); + }); + + // On-demand seed fetch -- not part of /api/status polling because the + // seed only changes on wipe, no need to re-query RCON every poll. + app.MapGet("/api/world/seed", async (CancellationToken ct) => + { + var seed = await world.GetCurrentSeedAsync(ct); + return Results.Json(new { seed }); + }); + + app.MapPost("/api/world/wipe", async (HttpContext ctx) => + { + using var sr = new StreamReader(ctx.Request.Body); + var payload = JsonSerializer.Deserialize( + await sr.ReadToEndAsync(), JsonOpts.CaseInsensitive); + if (!string.Equals(payload?.Confirm, "WIPE", StringComparison.Ordinal)) + return Results.BadRequest(new { ok = false, error = "Type WIPE to confirm." }); + var doBackup = payload!.Backup ?? true; + var seedMode = (payload.SeedMode ?? "random").ToLowerInvariant() switch + { + "keep" => WorldService.SeedMode.Keep, + "custom" => WorldService.SeedMode.Custom, + _ => WorldService.SeedMode.Random, + }; + var opts = new WorldService.WipeOptions(doBackup, seedMode, payload.CustomSeed); + var result = await world.WipeWorldAsync(opts); + return Results.Json(new { ok = result.Ok, backupName = result.BackupName, seedUsed = result.SeedUsed, error = result.Error }); + }); + + // ── Backups ── + app.MapGet("/api/backup/list", () => + { + var list = backup.List(); + return Results.Json(new + { + dir = backup.BackupDir, + backups = list, + schedule = config.BackupSchedule, + description = scheduler.Describe(), + keep = config.BackupKeep, + nextRun = scheduler.NextRun(), + }); + }); + + app.MapPost("/api/backup/schedule", async (HttpContext ctx) => + { + using var sr = new StreamReader(ctx.Request.Body); + var payload = JsonSerializer.Deserialize( + await sr.ReadToEndAsync(), JsonOpts.CaseInsensitive); + // Empty string clears the schedule (disables). Otherwise the BackupScheduler + // accepts: "HH:mm", comma-separated "HH:mm,HH:mm,...", or "every Nh"/"every Nm". + var newSchedule = payload?.Schedule; + if (!string.IsNullOrWhiteSpace(newSchedule)) + { + // Probe by parsing -- the scheduler's Describe will return "Disabled" for invalid. + var trial = newSchedule.Trim().ToLowerInvariant(); + bool ok; + if (System.Text.RegularExpressions.Regex.IsMatch(trial, + @"^every\s+(\d+)\s*(h|hr|hrs|hour|hours|m|min|mins|minute|minutes)$")) + { + ok = true; + } + else + { + ok = trial.Split(',', StringSplitOptions.RemoveEmptyEntries) + .All(tok => TimeOnly.TryParse(tok.Trim(), out _)); + } + if (!ok) + return Results.BadRequest(new { ok = false, error = "Schedule must be HH:mm, HH:mm,HH:mm, 'every Nh', or 'every Nm' (or empty to disable)." }); + } + if (payload?.Keep is { } k && k < 1) + return Results.BadRequest(new { ok = false, error = "keep must be >= 1." }); + + if (newSchedule != null) config.BackupSchedule = string.IsNullOrWhiteSpace(newSchedule) ? null : newSchedule; + if (payload?.Keep is { } kk) config.BackupKeep = kk; + config.Save(configPath); + scheduler.Reload(); + return Results.Json(new { ok = true, schedule = config.BackupSchedule, keep = config.BackupKeep, nextRun = scheduler.NextRun() }); + }); + + app.MapPost("/api/backup/create", async (HttpContext ctx) => + { + using var sr = new StreamReader(ctx.Request.Body); + var payload = JsonSerializer.Deserialize( + await sr.ReadToEndAsync(), JsonOpts.CaseInsensitive); + var result = await backup.CreateAsync(payload?.Reason); + return Results.Json(new { ok = result.Ok, name = result.Name, sizeBytes = result.SizeBytes, error = result.Error }); + }); + + app.MapPost("/api/backup/restore", async (HttpContext ctx) => + { + using var sr = new StreamReader(ctx.Request.Body); + var payload = JsonSerializer.Deserialize( + await sr.ReadToEndAsync(), JsonOpts.CaseInsensitive); + var name = payload?.Name?.Trim(); + if (string.IsNullOrEmpty(name)) return Results.BadRequest(new { ok = false, error = "Missing backup name." }); + var (ok, error) = await backup.RestoreAsync(name); + return Results.Json(new { ok, error }); + }); + + app.MapPost("/api/backup/delete", async (HttpContext ctx) => + { + using var sr = new StreamReader(ctx.Request.Body); + var payload = JsonSerializer.Deserialize( + await sr.ReadToEndAsync(), JsonOpts.CaseInsensitive); + var name = payload?.Name?.Trim(); + if (string.IsNullOrEmpty(name)) return Results.BadRequest(new { ok = false, error = "Missing backup name." }); + var (ok, error) = backup.Delete(name); + return Results.Json(new { ok, error }); + }); + + AnsiConsole.MarkupLine($"[green]✓[/] Web UI: [blue]http://{config.WebHost}:{config.WebPort}/[/]"); + + // Intercept Ctrl+C / SIGTERM so the Java subprocess is stopped cleanly + // before we exit. The Windows Job Object is a last-resort safety net for + // the cases this can't catch (Task Manager kill, BSOD). + Console.CancelKeyPress += (_, e) => + { + e.Cancel = true; // we'll exit ourselves after stopping MC + AnsiConsole.MarkupLine("[yellow]Shutting down...[/]"); + // 60 s headroom matches the systemd unit's TimeoutStopSec -- populated + // worlds with terrain mods + DH LOD writes + C2ME chunk flushes can take + // 30-50 s to finish saving cleanly. Tight timeout = risk of force-kill + // mid-flush. If MC's done sooner, this returns sooner. + try { bluemap.Dispose(); } catch { } // kill any in-flight render before MC stop + try { serverProc.StopAsync(TimeSpan.FromSeconds(60)).GetAwaiter().GetResult(); } catch { } + try { app.StopAsync(TimeSpan.FromSeconds(5)).GetAwaiter().GetResult(); } catch { } + }; + AppDomain.CurrentDomain.ProcessExit += (_, _) => + { + try { bluemap.Dispose(); } catch { } + try { serverProc.StopAsync(TimeSpan.FromSeconds(10)).GetAwaiter().GetResult(); } catch { } + }; + + // Auto-open browser for Windows interactive launches (double-click experience). + if (OperatingSystem.IsWindows() && !Console.IsInputRedirected) + { + _ = Task.Run(async () => + { + await Task.Delay(2500); + try { Process.Start(new ProcessStartInfo { FileName = $"http://{config.WebHost}:{config.WebPort}/", UseShellExecute = true }); } + catch { /* user can browse manually */ } + }); + } + + await app.RunAsync(); + await serverProc.StopAsync(); + scheduler.Dispose(); + bluemap.Dispose(); + rcon.Dispose(); + return 0; + } + + ///