TfL.psm1
|
# TfL line colours for terminal display $script:LineColours = @{ 'Bakerloo' = 'DarkRed' 'Central' = 'Red' 'Circle' = 'Yellow' 'District' = 'Green' 'Hammersmith & City' = 'Magenta' 'Jubilee' = 'DarkGray' 'Metropolitan' = 'DarkMagenta' 'Northern' = 'DarkGray' 'Piccadilly' = 'DarkBlue' 'Victoria' = 'Cyan' 'Waterloo & City' = 'DarkCyan' 'Elizabeth line' = 'DarkMagenta' 'London Overground' = 'DarkYellow' 'DLR' = 'DarkCyan' } function Get-TflStatus { <# .SYNOPSIS Fetches and displays current London Underground line statuses from TfL. #> $uri = 'https://api.tfl.gov.uk/Line/Mode/tube,elizabeth-line,overground,dlr/Status' try { $params = @{ Uri = $uri UseBasicParsing = $true ErrorAction = 'Stop' } # On Windows, pass through the system proxy with default credentials (e.g. corporate proxy) if ($IsWindows -or $env:OS -eq 'Windows_NT') { $proxy = [System.Net.WebRequest]::GetSystemWebProxy().GetProxy($uri) $params['Proxy'] = $proxy $params['ProxyUseDefaultCredentials'] = $true } $lines = Invoke-RestMethod @params } catch { Write-Host " Failed to fetch TfL data: $($_.Exception.Message)" -ForegroundColor Red return } Write-Host "" Write-Host " London Transport Status" -ForegroundColor White Write-Host " $((Get-Date).ToString('HH:mm, dd MMM yyyy'))" -ForegroundColor DarkGray Write-Host " $('─' * 45)" -ForegroundColor DarkGray Write-Host "" foreach ($line in ($lines | Sort-Object name)) { $topStatus = $line.lineStatuses | Sort-Object statusSeverity | Select-Object -First 1 $severity = $topStatus.statusSeverity $description = $topStatus.statusSeverityDescription $name = $line.name # Severity 10 = Good Service; lower = worse $statusColour = switch ($true) { ($severity -ge 10) { 'Green' } ($severity -ge 6) { 'Yellow' } default { 'Red' } } $lineColour = if ($script:LineColours.ContainsKey($name)) { $script:LineColours[$name] } else { 'White' } $paddedName = $name.PadRight(22) Write-Host " " -NoNewline Write-Host $paddedName -ForegroundColor $lineColour -NoNewline Write-Host " $description" -ForegroundColor $statusColour # Show disruption reason if available and not good service if ($severity -lt 10 -and $topStatus.reason) { $reason = $topStatus.reason -replace '\s+', ' ' Write-Host " $(' ' * 22) $reason" -ForegroundColor DarkGray } } Write-Host "" } function tfl { <# .SYNOPSIS TfL command-line tool. .EXAMPLE tfl status # Show current tube/Elizabeth line/Overground/DLR status #> param( [Parameter(Position = 0)] [string]$Command = 'help' ) switch ($Command.ToLower()) { 'status' { Get-TflStatus } default { Write-Host "" Write-Host " Usage: tfl <command>" -ForegroundColor Yellow Write-Host "" Write-Host " Commands:" -ForegroundColor DarkGray Write-Host " status Show current line statuses" -ForegroundColor White Write-Host "" } } } Export-ModuleMember -Function tfl, Get-TflStatus |