[int] $schedule = $ENV:SCHEDULE [string] $gluetunForwardedPortFile = $ENV:GLUETUNFORWARDEDPORTFILE [string] $qbtHost = $ENV:QBTHOST [string] $qbtPort = $ENV:QBTPORT [string] $qbtUser = $ENV:QBTUSER [string] $qbtPassword = $ENV:QBTPASSWORD [string] $notificationWebhookURL = $ENV:NOTIFICATIONWEBHOOKURL [string] $discordWebhookURL = $ENV:DISCORDWEBHOOKURL [string] $appriseWebhookURL = $ENV:APPRISEWEBHOOKURL [string] $appriseWebhookTag = $ENV:APPRISEWEBHOOKTAG function Send-Notification { param( # Content of the notification [Parameter(Mandatory=$true)] [string] $content ) if ($notificationWebhookURL -or $discordWebhookURL) { if ($discordWebhookURL) { $notificationWebhookURL = $discordWebhookURL } $headers = @{ "Content-Type"="application/json" } $body = @{ content=$content # content="QBitTorrent Listening Port updated to $gluetunForwardedPort" } $json = $body | ConvertTo-Json try { Invoke-WebRequest -URI $notificationWebhookURL -Method post -Body $json -Headers $headers } catch { Write-Host "Notification Error Encountered: $($global:Error[0])" } } elseif ($appriseWebhookURL) { $headers = @{ "Content-Type"="application/json" } $body = @{ title="QBitTorrent Port Manager" body=$content # body="QBitTorrent Listening Port updated to $gluetunForwardedPort" tags="$appriseWebhookTag" } $json = $body | ConvertTo-Json try { Invoke-WebRequest -URI $appriseWebhookURL -Method post -Body $json -Headers $headers } catch { Write-Host "Notification Error Encountered: $($global:Error[0])" } } } while ($true) { $gluetunForwardedPort = Get-Content $gluetunForwardedPortFile Write-Host "Current forwarded port: $gluetunForwardedPort" $qbtHeaders = @{ Referer = "http://$($qbtHost):$($qbtPort)" } $qbtBody = @{ username = $qbtUser password = $qbtPassword } try { $qbtSession = [Microsoft.PowerShell.Commands.WebRequestSession]::new() $qbtResponse = Invoke-WebRequest -Uri "http://$($qbtHost):$($qbtPort)/api/v2/auth/login" -WebSession $qbtSession -Method POST -Headers $qbtHeaders -Body $qbtBody $qbtQueryResponse = Invoke-WebRequest -Uri "http://$($qbtHost):$($qbtPort)/api/v2/app/preferences" -WebSession $qbtSession -Method GET $qbtListenPort = (ConvertFrom-Json $qbtQueryResponse.Content).listen_port Write-Host "Current QBT Listening port: $qbtListenPort" if ($gluetunForwardedPort -eq $qbtListenPort) { Write-Host "Ports match!" } else { $qbtPortChangeBody = 'json={"listen_port":' + $gluetunForwardedPort + '}' $qbtPortChangeResponse = Invoke-WebRequest -Uri "http://$($qbtHost):$($qbtPort)/api/v2/app/setPreferences" -WebSession $qbtSession -Method POST -Headers $qbtHeaders -Body $qbtPortChangeBody Send-Notification -content "QBitTorrent Listening Port updated to $gluetunForwardedPort" } } catch { Write-Host "Error encountered: $($global:Error[0])" Send-Notification -content "Error encountered: $($global:Error[0])" } Write-Host "Sleeping for $schedule minutes..." Start-Sleep ($schedule * 60) }