Public/Uninstall-BATCRelayBot.ps1
|
#Requires -Version 5.1 function Uninstall-BATCRelayBot { <# .SYNOPSIS Removes a BATCRelayBot installation. .DESCRIPTION Five phases: 1. Inspect the installation 2. Show what will be removed 3. Ask about optional components (Python, FFmpeg, PowerShell module) 4. Final confirmation 5. Remove, then report what actually happened A running bot is stopped automatically, cleanly where possible - it leaves the voice channel before exiting. Python and FFmpeg are removed only if you confirm each of them; you may be using them for other things. VoiceMeeter is never removed: it installs audio drivers and needs VB-Audio's own uninstaller. .PARAMETER InstallPath Installation directory. Defaults to $env:LOCALAPPDATA\BATCRelayBot. .PARAMETER Force Skip the final confirmation. For unattended cleanup; optional components are still only removed when explicitly chosen. .EXAMPLE Uninstall-BATCRelayBot .EXAMPLE Uninstall-BATCRelayBot -InstallPath "D:\MyBot" .OUTPUTS Hashtable with Success, DeletedFiles, RemovedDependencies, Errors, LogPath. #> [CmdletBinding()] [OutputType([hashtable])] param( [string]$InstallPath = (Join-Path $env:LOCALAPPDATA "BATCRelayBot"), [switch]$Force ) $version = Get-ModuleVersion Write-Host "" Write-Host "=====================================" -ForegroundColor Cyan Write-Host " BATCRelayBot Uninstaller (v$version)" -ForegroundColor Cyan Write-Host "=====================================" -ForegroundColor Cyan Write-Host "" # ---- Phase 1: inspect ---------------------------------------------- Write-Host "[1/5] Checking the installation" -ForegroundColor Cyan $prerequisites = Confirm-UninstallPrerequisites -BotPath $InstallPath foreach ($warning in $prerequisites.Warnings) { Write-Host " Note: $warning" -ForegroundColor Yellow } if (-not $prerequisites.Valid) { Write-Host "" foreach ($problem in $prerequisites.Errors) { Write-Host " $problem" -ForegroundColor Red } Write-Host "" Write-Host "Nothing was changed." -ForegroundColor Yellow Write-Host "" return @{ Success = $false; Errors = $prerequisites.Errors } } Write-Host " Installation found at $($prerequisites.InstallPath)" -ForegroundColor Green Write-Host "" # ---- Phase 2: what will go ----------------------------------------- Write-Host "[2/5] What will be removed" -ForegroundColor Cyan Show-RemovalSummary -BotPath $prerequisites.InstallPath | Out-Null # ---- Phase 3: optional components ---------------------------------- Write-Host "[3/5] Optional components" -ForegroundColor Cyan $dependencyChoices = Get-DependencyChoices -Prerequisites $prerequisites # ---- Phase 4: confirm ---------------------------------------------- if ($Force) { Write-Host "[4/5] Confirmation skipped (-Force)" -ForegroundColor Yellow Write-Host "" } else { Write-Host "[4/5] Confirmation" -ForegroundColor Cyan $confirmation = Show-UninstallConfirmation ` -RemovalPlan @{ InstallPath = $prerequisites.InstallPath } ` -DependencyChoices $dependencyChoices if (-not $confirmation.Confirmed) { Write-Host "Nothing was changed." -ForegroundColor Yellow Write-Host "" return @{ Success = $false; Errors = @("Cancelled by the user") } } } # ---- Phase 5: remove ------------------------------------------------- Write-Host "[5/5] Removing" -ForegroundColor Cyan $removalResult = Invoke-SecureUninstall ` -BotPath $prerequisites.InstallPath ` -DependencyChoices $dependencyChoices Show-PostRemovalSummary -RemovalResult $removalResult return $removalResult } Export-ModuleMember -Function Uninstall-BATCRelayBot |