Private/Get-BridgeStatusFromHtml.ps1
|
function Get-BridgeStatusFromHtml { [CmdletBinding()] <# .SYNOPSIS Αναλύει HTML και επιστρέφει καταστάσεις γέφυρας. .DESCRIPTION Η Get-BridgeStatusFromHtml αναλύει HTML περιεχόμενο και επιστρέφει την τρέχουσα κατάσταση για κάθε γέφυρα που ανιχνεύεται. .PARAMETER Html Το HTML περιεχόμενο σε μορφή string. .PARAMETER Timestamp Η χρονική στιγμή συλλογής του HTML. .OUTPUTS [pscustomobject[]] - Καταστάσεις γέφυρας με ονόματα και timestamps. .EXAMPLE Get-BridgeStatusFromHtml -Html $htmlContent -Timestamp (Get-Date) .NOTES Χρησιμοποιεί regex και structured parsing για ανάλυση. #> [OutputType([pscustomobject[]])] param ( [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string]$Html, [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string]$Timestamp, [Parameter()] [PSCustomObject]$Configuration ) # Use configuration or fallback if (-not $Configuration) { try { $Configuration = New-BridgeConfiguration } catch { # Fallback if configuration fails $Configuration = $null } } $baseUrl = if ($Configuration -and $Configuration.BaseImageUrl) { $Configuration.BaseImageUrl } else { 'https://www.topvision.gr/dioriga/' } $patterns = @{ 'poseidonia' = @{ 'Κλειστή για συντήρηση' = 'image-bridge-close-for-maintenance\.php(\?\d+)?' 'Κλειστή με πρόγραμμα' = 'image-bridge-open-with-schedule-posidonia\.php(\?\d+)?' 'Μόνιμα κλειστή' = 'image-bridge-always-close\.php(\?\d+)?' 'Ανοιχτή' = 'image-bridge-open-no-schedule\.php\?\d+' } 'isthmia' = @{ 'Κλειστή για συντήρηση' = 'image-bridge-close-for-maintenance\.php(\?\d+)?' 'Κλειστή με πρόγραμμα' = 'image-bridge-open-with-schedule-isthmia\.php(\?\d+)?' 'Μόνιμα κλειστή' = 'image-bridge-always-close\.php(\?\d+)?' 'Ανοιχτή' = 'image-bridge-open-no-schedule\.php\?\d+' } } $result = @() foreach ($location in $patterns.Keys) { $writeBridgeLogSplat = @{ Stage = 'Ανάλυση' Message = "➤ Επεξεργασία: $location" Level = 'Debug' } Write-BridgeLog @writeBridgeLogSplat $getBridgeImagesSplat = @{ HtmlContent = $Html Location = $location } # Add configuration only if it's available and not null if ($Configuration) { $getBridgeImagesSplat.Configuration = $Configuration } $bridgeImages = Get-BridgeImage @getBridgeImagesSplat if (-not $bridgeImages -or $bridgeImages.Count -eq 0) { $writeBridgeLogSplat = @{ Stage = 'Σφάλμα' Message = "❌ Δεν εντοπίστηκαν εικόνες για $location" Level = 'Warning' } Write-BridgeLog @writeBridgeLogSplat $errorRecord = [System.Management.Automation.ErrorRecord]::new( ([System.Exception]::new("Δεν βρέθηκαν εικόνες για το $location.")), 'BridgeImagesNotFound', [System.Management.Automation.ErrorCategory]::ObjectNotFound, $location ) $PSCmdlet.ThrowTerminatingError($errorRecord) } $writeBridgeLogSplat = @{ Stage = 'Ανάλυση' Message = '✔ Εικόνες:' Level = 'Debug' } Write-BridgeLog @writeBridgeLogSplat $imageList = ($bridgeImages | ForEach-Object { " • $($_.src)" }) -join "`n" $writeBridgeLogSplat = @{ Stage = 'Ανάλυση' Message = $imageList Level = 'Debug' } Write-BridgeLog @writeBridgeLogSplat foreach ($statusEntry in $patterns[$location].GetEnumerator()) { $status = $statusEntry.Key $pattern = $statusEntry.Value $resolveBridgeStatusSplat = @{ Location = $location Status = $status Pattern = $pattern BridgeImages = $bridgeImages RequireInfoImage = ($status -eq 'Ανοιχτή') } $image = Resolve-BridgeStatus @resolveBridgeStatusSplat if ($image) { $writeBridgeLogSplat = @{ Stage = 'Ανάλυση' Message = "✅ Εντοπίστηκε: Γέφυρα: $location Κατάσταση: $status" Level = 'Debug' } Write-BridgeLog @writeBridgeLogSplat $newBridgeStatusObjectSplat = @{ Location = $location Status = $status Timestamp = $Timestamp ImageSrc = $image.src BaseUrl = $baseUrl } # Add configuration only if it's available and not null if ($Configuration) { $newBridgeStatusObjectSplat.Configuration = $Configuration } $object = Get-BridgeStatusObject @newBridgeStatusObjectSplat $result += $object break } } } return $result } |