Create ElvUI_Beta_Updater.ps1

This commit is contained in:
Nighthawk
2024-07-01 15:02:25 -04:00
parent 37a8fdcd30
commit f639020fba
+176
View File
@@ -0,0 +1,176 @@
# ASCII Art, Author, License, Versioning.
Write-Host @"
by Kyrina - Dalaran - v1.0
This script is released under the following license.
MIT License: https://opensource.org/licenses/MIT
-----------------------------------------------------------------------------------------------
"@
# Define the path for the configuration file
$configFilePath = "$env:LOCALAPPDATA\ElvUIUpdater\config.txt"
# Function to get WoW installation path from the registry
function Get-WowPathFromRegistry {
$regPath = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\World of Warcraft Beta"
$valueName = "DisplayIcon"
if (Test-Path -Path $regPath) {
$wowExePath = (Get-ItemProperty -Path $regPath -Name $valueName).$valueName
$wowPath = [System.IO.Path]::GetDirectoryName($wowExePath)
return $wowPath
} else {
return $null
}
}
# Function to get or set WoW installation path
function Get-WowPath {
$wowPath = Get-WowPathFromRegistry
if (-not $wowPath) {
if (Test-Path -Path $configFilePath) {
$wowPath = Get-Content -Path $configFilePath -Raw
} else {
$wowPath = Read-Host "Enter the path to your WoW installation (e.g., C:\Program Files (x86)\World of Warcraft)"
if (-not (Test-Path -Path $wowPath)) {
Write-Host "Invalid path. Please ensure the path is correct."
exit 1
}
# Ensure the directory for the config file exists
$configDir = [System.IO.Path]::GetDirectoryName($configFilePath)
if (-not (Test-Path -Path $configDir)) {
New-Item -ItemType Directory -Path $configDir -Force
}
# Save the path to the configuration file
$wowPath | Out-File -FilePath $configFilePath
}
}
return $wowPath
}
# Function to compute the hash of a folder
function Get-FolderHash {
param (
[string]$folderPath
)
$hashAlgorithm = [System.Security.Cryptography.SHA256]::Create()
$hash = [System.Text.StringBuilder]::new()
Get-ChildItem -Path $folderPath -Recurse | Where-Object { -not $_.PSIsContainer } | ForEach-Object {
$fileBytes = [System.IO.File]::ReadAllBytes($_.FullName)
$fileHash = $hashAlgorithm.ComputeHash($fileBytes)
$fileHashString = [BitConverter]::ToString($fileHash) -replace '-', ''
$hash.Append($fileHashString) | Out-Null
}
$overallHashBytes = $hashAlgorithm.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($hash.ToString()))
return [BitConverter]::ToString($overallHashBytes) -replace '-', ''
}
# Get the WoW installation path
$wowPath = Get-WowPath
$addonsPath = Join-Path -Path $wowPath -ChildPath "Interface\AddOns"
# Define the URL for the API
$url = "https://api.tukui.org/v1/download/dev/elvui/beta"
# Define the path for the downloaded zip file
$zipPath = "$env:TEMP\elvui-beta.zip"
$tempExtractPath = "$env:TEMP\ElvUI"
# Create the destination directory if it doesn't exist
if (-not (Test-Path -Path $addonsPath)) {
New-Item -ItemType Directory -Path $addonsPath -Force
}
# Download the ZIP file
Invoke-WebRequest -Uri $url -OutFile $zipPath
# Unzip the file to a temporary location
Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::ExtractToDirectory($zipPath, $tempExtractPath)
# Check if the three folders exist
$elvuiExists = Test-Path -Path (Join-Path -Path $addonsPath -ChildPath "ElvUI")
$elvuiLibrariesExists = Test-Path -Path (Join-Path -Path $addonsPath -ChildPath "ElvUI_Libraries")
$elvuiOptionsExists = Test-Path -Path (Join-Path -Path $addonsPath -ChildPath "ElvUI_Options")
# Handle first time installation if any folder does not exist
if (-not ($elvuiExists -and $elvuiLibrariesExists -and $elvuiOptionsExists)) {
Write-Host "First time installation detected."
# Move the new version to the destination path
Move-Item -Path (Join-Path -Path $tempExtractPath -ChildPath "ElvUI") -Destination $addonsPath
Move-Item -Path (Join-Path -Path $tempExtractPath -ChildPath "ElvUI_Libraries") -Destination $addonsPath
Move-Item -Path (Join-Path -Path $tempExtractPath -ChildPath "ElvUI_Options") -Destination $addonsPath
Write-Host "ElvUI has been installed."
} else {
Write-Host "Computing hashes for existing ElvUI installation..."
# Compute the hash of the existing folders
$installedElvuiHash = Get-FolderHash -folderPath (Join-Path -Path $addonsPath -ChildPath "ElvUI")
$installedElvuiLibrariesHash = Get-FolderHash -folderPath (Join-Path -Path $addonsPath -ChildPath "ElvUI_Libraries")
$installedElvuiOptionsHash = Get-FolderHash -folderPath (Join-Path -Path $addonsPath -ChildPath "ElvUI_Options")
$installedHash = $installedElvuiHash + $installedElvuiLibrariesHash + $installedElvuiOptionsHash
Write-Host "Existing ElvUI hashes:"
Write-Host "ElvUI: $installedElvuiHash"
Write-Host "ElvUI_Libraries: $installedElvuiLibrariesHash"
Write-Host "ElvUI_Options: $installedElvuiOptionsHash"
Write-Host "Computing hashes for new ElvUI files..."
# Compute the hash of the new folders
$newElvuiHash = Get-FolderHash -folderPath (Join-Path -Path $tempExtractPath -ChildPath "ElvUI")
$newElvuiLibrariesHash = Get-FolderHash -folderPath (Join-Path -Path $tempExtractPath -ChildPath "ElvUI_Libraries")
$newElvuiOptionsHash = Get-FolderHash -folderPath (Join-Path -Path $tempExtractPath -ChildPath "ElvUI_Options")
$newHash = $newElvuiHash + $newElvuiLibrariesHash + $newElvuiOptionsHash
Write-Host "New ElvUI hashes:"
Write-Host "ElvUI: $newElvuiHash"
Write-Host "ElvUI_Libraries: $newElvuiLibrariesHash"
Write-Host "ElvUI_Options: $newElvuiOptionsHash"
# Compare the hashes
if ($installedHash -eq $newHash) {
Write-Host "You already have the latest version installed."
} else {
Write-Host "Updating ElvUI..."
# Remove the old version
Remove-Item -Path (Join-Path -Path $addonsPath -ChildPath "ElvUI") -Recurse -Force
Remove-Item -Path (Join-Path -Path $addonsPath -ChildPath "ElvUI_Libraries") -Recurse -Force
Remove-Item -Path (Join-Path -Path $addonsPath -ChildPath "ElvUI_Options") -Recurse -Force
# Move the new version to the destination path
Move-Item -Path (Join-Path -Path $tempExtractPath -ChildPath "ElvUI") -Destination $addonsPath
Move-Item -Path (Join-Path -Path $tempExtractPath -ChildPath "ElvUI_Libraries") -Destination $addonsPath
Move-Item -Path (Join-Path -Path $tempExtractPath -ChildPath "ElvUI_Options") -Destination $addonsPath
Write-Host "ElvUI has been updated."
}
}
# Cleanup
Remove-Item -Path $zipPath
Remove-Item -Path $tempExtractPath -Recurse -Force
# Pause to wait for any key
Write-Host "Press any key to continue..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")