summaryrefslogtreecommitdiffstats
path: root/web/install.ps1
blob: 92eef83365ec124f84bc24afe689f9baff5e0d69 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# Zagan-Bet installer for Windows.
#
# Asks the site which build is newest, verifies its SHA-256, installs it for
# the current user and adds a Start-menu shortcut. Point it at a staging site
# with -Site http://127.0.0.1:8899; add -NoPause for automation.
#
# Run it with:
#   powershell -ExecutionPolicy Bypass -File .\install.ps1
param(
    [string]$Site = "https://zagan.2137697.xyz",
    [switch]$NoPause
)

$ErrorActionPreference = "Stop"

function Finish([int]$Code) {
    if (-not $NoPause) {
        Read-Host "Press Enter to close" | Out-Null
    }
    exit $Code
}

function Stop-Install([string]$Message) {
    Write-Host "install: $Message" -ForegroundColor Red
    Finish 1
}

try {
    $latest = (Invoke-WebRequest -Uri "$Site/latest.php" -UseBasicParsing).Content
} catch {
    Stop-Install "could not read $Site/latest.php: $_"
}

$line = ($latest -split "`r?`n") |
    Where-Object { $_ -match '^gui windows x86_64 ' } |
    Select-Object -First 1
if (-not $line) {
    Stop-Install "no Windows build is published yet"
}

$parts = $line.Trim() -split '\s+'
if ($parts.Count -lt 6) {
    Stop-Install "the latest-build file is malformed"
}
$Version = $parts[3]
$Binary = $parts[4]
$Sha256 = $parts[5]
$Url = "$Site/bin/gui/$Binary"

Write-Host "Newest Zagan-Bet is $Version."

$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$candidates = @(
    (Join-Path $here $Binary),
    (Join-Path (Get-Location) $Binary),
    (Join-Path $env:USERPROFILE "Downloads\$Binary")
)
$sourceFile = $null
foreach ($candidate in $candidates) {
    if (Test-Path -LiteralPath $candidate) {
        $sourceFile = $candidate
        break
    }
}

$temporary = $null
if (-not $sourceFile) {
    $temporary = Join-Path ([System.IO.Path]::GetTempPath()) $Binary
    Write-Host "Downloading $Binary..."
    try {
        Invoke-WebRequest -Uri $Url -OutFile $temporary -UseBasicParsing
    } catch {
        Stop-Install "download failed: $_"
    }
    $sourceFile = $temporary
}

try {
    $actual = (Get-FileHash -LiteralPath $sourceFile -Algorithm SHA256).Hash.ToLowerInvariant()
    if ($actual -ne $Sha256.ToLowerInvariant()) {
        Stop-Install "checksum mismatch: expected $Sha256, got $actual"
    }

    $installDir = Join-Path $env:LOCALAPPDATA "Programs\Zagan-Bet"
    New-Item -ItemType Directory -Force -Path $installDir | Out-Null
    $target = Join-Path $installDir "zagan-bet-gui.exe"
    Copy-Item -LiteralPath $sourceFile -Destination $target -Force

    $startMenu = Join-Path $env:APPDATA "Microsoft\Windows\Start Menu\Programs"
    New-Item -ItemType Directory -Force -Path $startMenu | Out-Null
    $shortcutPath = Join-Path $startMenu "Zagan-Bet.lnk"
    $shell = New-Object -ComObject WScript.Shell
    $shortcut = $shell.CreateShortcut($shortcutPath)
    $shortcut.TargetPath = $target
    $shortcut.WorkingDirectory = $installDir
    $shortcut.IconLocation = "$target,0"
    $shortcut.Description = "Slots, roulette, blackjack and crash"
    $shortcut.Save()

    Write-Host "Installed Zagan-Bet $Version to $target"
    Write-Host "A Start-menu shortcut was created."
} finally {
    if ($temporary -and (Test-Path -LiteralPath $temporary)) {
        Remove-Item -LiteralPath $temporary -Force
    }
}

Finish 0