com.start-automating.windowsscriptdeck.sdPlugin/Start-Process.@.ps1

if (-not $event.MessageData.payload.settings) { return }

$invokeError = $null

# WillAppear and WillDisappear are both settings that will run a script.
foreach ($settingName in 'WillAppear', 'WillDisappear') {
    if ($event.SourceIdentifier -match $settingName -and
    $event.MessageData.payload.settings.$settingName) {
        $settingScript = $event.MessageData.payload.settings.$settingName
        Invoke-Expression $settingScript -ErrorAction Continue -ErrorVariable $invokeError
        if ($invokeError) {
            $invokeError | Out-string | Add-Content -Path $global:STREAMDECK_PLUGINLOGPATH
            Send-StreamDeck -ShowAlert -Context $event.MessageData.Context
        } else {
            Send-StreamDeck -ShowOK -Context $event.MessageData.Context
        }
    }
}

# Keydown will run differently:
if ($event.SourceIdentifier -match 'KeyDown') {

    $settingsSplat = @{}
    $command = $ExecutionContext.SessionState.InvokeCommand.GetCommand('Start-Process', 'Cmdlet')
    foreach ($prop in $event.MessageData.payload.settings.psobject.properties) {
        if ($prop.Name -match '(?<n>.+)Script$' -and 
            $command.Parameters.($Matches.n)
            ) {
            $sb = try { [ScriptBlock]::Create($prop.Value) } catch { }

            if ($sb) {
                $settingsSplat[$command.Parameters[$Matches.n]] = & $sb
            }
        }
        elseif ($command.parameters[$prop.Name]) {
            $settingsSplat[$prop.Name] = $prop.Value
        }
    }

    foreach ($k in @($settingsSplat.Keys)) {
        if (-not $settingsSplat[$k]) {
            $settingsSplat.Remove($k)
        }
    }

    try {
        & $command @settingsSplat
        Send-StreamDeck -ShowOK -Context $event.MessageData.Context
    } catch {
        Send-StreamDeck -ShowAlert -Context $event.MessageData.Context
        $_ | Out-GridView
    }
}