Public/Invoke-BridgeStatusComparison.ps1
function Invoke-BridgeStatusComparison { <# .SYNOPSIS Συγκρίνει δύο λίστες καταστάσεων γεφυρών και ενεργοποιεί ειδοποιήσεις. .DESCRIPTION Η Invoke-BridgeStatusComparison συγκρίνει την προηγούμενη και την τρέχουσα κατάσταση γεφυρών και καλεί ειδικούς handlers για αλλαγές (άνοιγμα/κλείσιμο). .PARAMETER PreviousState Η προηγούμενη λίστα καταστάσεων. .PARAMETER CurrentState Η τρέχουσα λίστα καταστάσεων. .PARAMETER ApiKey Το API Key για OCR αν απαιτηθεί. .PARAMETER PoUserKey Το User Key για Pushover ειδοποίηση. .PARAMETER PoApiKey Το API Token για Pushover ειδοποίηση. .OUTPUTS None. .EXAMPLE Invoke-BridgeStatusComparison -PreviousState $prev -CurrentState $curr -ApiKey 'abc' -PoUserKey 'user' -PoApiKey 'token' .NOTES Καταγράφει αλλαγές και ενεργοποιεί κατάλληλες ειδοποιήσεις. #> [CmdletBinding()] param ( [Parameter(Mandatory)][ValidateNotNullOrEmpty()][object[]]$PreviousState, [Parameter(Mandatory)][ValidateNotNullOrEmpty()][object[]]$CurrentState, [Parameter(Mandatory)][string]$ApiKey, [Parameter(Mandatory)][string]$PoUserKey, [Parameter(Mandatory)][string]$PoApiKey ) Set-StrictMode -Version Latest try { $compareSplat = @{ ReferenceObject = $PreviousState DifferenceObject = $CurrentState Property = 'gefyraName', 'gefyraStatus' IncludeEqual = $true } $diff = Compare-Object @compareSplat if (-not $diff) { $writeBridgeStageSplat = @{ Level = 'Verbose' Stage = 'Ανάλυση' Message = '✅ Καμία αλλαγή στις γέφυρες.' } Write-BridgeStage @writeBridgeStageSplat return $false } $handlerMap = @{ 'Κλειστή με πρόγραμμα|=>' = { Send-BridgeNotification 'Closed' $CurrentState } 'Κλειστή με πρόγραμμα|<=' = { Send-BridgeNotification 'Closed' $CurrentState } 'Μόνιμα κλειστή|=>' = { Send-BridgeNotification 'Closed' $CurrentState } 'Μόνιμα κλειστή|<=' = { Send-BridgeNotification 'Closed' $CurrentState } 'Ανοιχτή|=>' = { Send-BridgeNotification 'Opened' $CurrentState } 'Ανοιχτή|<=' = { Send-BridgeNotification 'Opened' $CurrentState } } foreach ($change in $diff) { $writeBridgeStageSplat = @{ Level = 'Verbose' Stage = 'Ανάλυση' Message = "🌉 $($change.gefyraName) ➜ $($change.gefyraStatus) ($($change.SideIndicator))" } Write-BridgeStage @writeBridgeStageSplat $key = "$($change.gefyraStatus)|$($change.SideIndicator)" $handler = $handlerMap[$key] switch ($true) { { $handler } { & $handler; continue } { $change.SideIndicator -eq '==' } { $writeBridgeStageSplat = @{ Level = 'Verbose' Stage = 'Ανάλυση' Message = "Καμία ουσιαστική αλλαγή στο $($change.gefyraName)." } Write-BridgeStage @writeBridgeStageSplat continue } default { $writeBridgeStageSplat = @{ Stage = 'Σφάλμα' Message = "❓ Άγνωστο combo: $key" Level = 'Warning' } Write-BridgeStage @writeBridgeStageSplat } } } return $true } catch { $writeBridgeStageSplat = @{ Level = 'Warning' Stage = 'Σφάλμα' Message = "❌ $($_.Exception.Message)" } Write-BridgeStage @writeBridgeStageSplat throw } } function Write-BridgeStage { param( [ValidateSet('Ανάλυση','Σφάλμα')][string]$Stage, [string]$Message, [ValidateSet('Verbose','Warning','Error')][string]$Level = 'Verbose' ) $writeBridgeLogSplat = @{ Stage = $Stage Message = $Message Level = $Level } Write-BridgeLog @writeBridgeLogSplat } function Send-BridgeNotification { param( [ValidateSet('Closed','Opened')]$Type, [object[]]$State ) $splat = @{ CurrentState = $State PoUserKey = $PoUserKey PoApiKey = $PoApiKey } if ($Type -eq 'Closed') { $splat.ApiKey = $ApiKey; Invoke-BridgeClosedNotification @splat } else { Invoke-BridgeOpenedNotification @splat } } |