diff --git a/dotfiles/bin/.bin/nextcloud-screenshot.ps1 b/dotfiles/bin/.bin/nextcloud-screenshot.ps1 new file mode 100755 index 0000000..1e07566 --- /dev/null +++ b/dotfiles/bin/.bin/nextcloud-screenshot.ps1 @@ -0,0 +1,94 @@ +#!/usr/bin/env pwsh + +<# TODO +.SYNOPSIS + Takes a screenshot and puts the URL into the clipboard +.DESCRIPTION + Uses grim and slurp to create a screenshot and uploads it into a matrix content repository. + A GETable URL is placed into the clipboard via wl-copy and optionally sent to the specified room. +.NOTES + Example config at $HOME/.config/matrix-screenshot.ps1: + + ``` + $roomId = '!XpxHNLnPsnNEbScyeh:imninja.net' + $accessToken = 'NotaReALaCceSSTOk3n' + $homeserverUrl = 'https://imninja.net' + ``` +#> +[CmdletBinding()] +param ( + # Takes a fullscreen screenshot instead of selecting an area. + [switch] + $Fullscreen +) + +# import config +$config = Import-Clixml (Join-Path $env:HOME '.config/nextcloud-screenshot.xml') + + +$tmp = New-TemporaryFile +$tmpPath = $tmp.FullName +$webpPath = $tmpPath -replace 'tmp$','webp' + +if ($Fullscreen) { + grim $tmpPath +} else { + grim -g $(slurp) $tmpPath +} +if ((Get-Item $tmpPath).Length -eq 0) { + Remove-Item $tmpPath + throw ('Temp file "{0}" is empty' -f $tmpPath) +} + +magick $tmpPath $webpPath +if ((Get-Item $webpPath).Length -eq 0) { + Remove-Item $webpPath + throw ('WebP file "{0}" is empty' -f $webpPath) +} else { + Remove-Item $tmpPath +} + + +$webpName = (Split-Path -Leaf $webpPath) +$nextcloudPath = $config.Path + '/' + $webpName + +$uploadSplat = @{ + Authentication = 'Basic' + #Credential = New-Object System.Management.Automation.PSCredential (($config.Password | ConvertFrom-SecureString -AsPlainText), (New-Object System.Security.SecureString)) + Credential = $config.Credential + Method = 'Put' + Uri = '{0}/remote.php/dav/files/{1}/{2}' -f $config.BaseUrl,$config.Credential.UserName,$nextcloudPath + InFile = $webpPath +} +try { + Invoke-RestMethod @uploadSplat +} catch { + throw $_ + Remove-Item $webpPath +} + +$shareSplat = @{ + Authentication = 'Basic' + Credential = $config.Credential + Header = @{ + 'OCS-APIRequest' = 'true' # https://docs.nextcloud.com/server/27/admin_manual/configuration_user/user_provisioning_api.html + } + Method = 'Post' + Uri = $config.BaseUrl + '/ocs/v2.php/apps/files_sharing/api/v1/shares' + Body = @{ + path = $nextcloudPath + shareType = 3 # public link + permissions = 1 # read + } +} +try { + $share = Invoke-RestMethod @shareSplat +} catch { + throw $_ + Remove-Item $webpPath +} +$share.ocs.data.url | wl-copy --trim-newline +notify-send 'Screenshot URL in clipboard' --expire-time=1000 + +Remove-Item $webpPath +