From 3318d2d14ba58709baa9a83dfffb9079b8f0d8c6 Mon Sep 17 00:00:00 2001 From: lightly-toasted Date: Fri, 26 Sep 2025 15:52:53 +0900 Subject: [PATCH] feat: add hyprshot-save script - Added hyprshot-save shell script with --no-upload option - Updated keybindings to use the new hyprshot-save script - Refactored the zipline secret in secrets.yaml into zipline/env and zipline/token - Updated zipline.nix on host vps to use the new zipline/env secret path --- home/modules/graphical/hyprland.nix | 27 +++++++------- home/modules/graphical/hyprshot-save.nix | 46 ++++++++++++++++++++++++ hosts/vps/modules/services/zipline.nix | 4 +-- secrets/secrets.yaml | 8 +++-- 4 files changed, 65 insertions(+), 20 deletions(-) create mode 100755 home/modules/graphical/hyprshot-save.nix diff --git a/home/modules/graphical/hyprland.nix b/home/modules/graphical/hyprland.nix index e37429a..35cab29 100644 --- a/home/modules/graphical/hyprland.nix +++ b/home/modules/graphical/hyprland.nix @@ -1,10 +1,6 @@ -{ pkgs, ... }: { - home.packages = [ - pkgs.playerctl - pkgs.hyprshot - pkgs.tofi - ]; +{ pkgs, ... }: +{ programs.mouse-actions.enable = true; wayland.windowManager.hyprland = { enable = true; @@ -15,7 +11,7 @@ "$terminal" = "uwsm app -- kitty"; "$fileManager" = "uwsm app -- thunar"; - "$menu" = "uwsm app -- $(tofi-drun)"; + "$menu" = "uwsm app -- $(${pkgs.tofi}/bin/tofi-drun)"; "$mod" = "SUPER"; env = [ @@ -72,10 +68,11 @@ "$mod SHIFT, 8, movetoworkspace, 8" "$mod SHIFT, 9, movetoworkspace, 9" "$mod SHIFT, 0, movetoworkspace, 10" - - "$mod SHIFT, S, exec, env HYPRSHOT_DIR=/data/Backup/Screenshots hyprshot -m region" + + "$mod, S, exec, hyprshot-save --no-upload" + "$mod SHIFT, S, exec, hyprshot-save" "$mod SHIFT, E, exec, powermenu" - "$mod, V, exec, cliphist list | tofi | cliphist decode | wl-copy" + "$mod, V, exec, cliphist list | ${pkgs.tofi}/bin/tofi | cliphist decode | wl-copy" "$mod, mouse:277, exec, cycle-mouse-action" ", mouse:277, exec, run-mouse-action" @@ -89,11 +86,11 @@ ]; bindl = [ - ", XF86AudioNext, exec, playerctl next" - ", XF86AudioPause, exec, playerctl play-pause" - ", XF86AudioPlay, exec, playerctl play-pause" - ", XF86AudioPrev, exec, playerctl previous" - ", XF86Tools, exec, playerctl play-pause" + ", XF86AudioNext, exec, ${pkgs.playerctl}/bin/playerctl next" + ", XF86AudioPause, exec, ${pkgs.playerctl}/bin/playerctl play-pause" + ", XF86AudioPlay, exec, ${pkgs.playerctl}/bin/playerctl play-pause" + ", XF86AudioPrev, exec, ${pkgs.playerctl}/bin/playerctl previous" + ", XF86Tools, exec, ${pkgs.playerctl}/bin/playerctl play-pause" ]; bindm = [ diff --git a/home/modules/graphical/hyprshot-save.nix b/home/modules/graphical/hyprshot-save.nix new file mode 100755 index 0000000..cd6248d --- /dev/null +++ b/home/modules/graphical/hyprshot-save.nix @@ -0,0 +1,46 @@ +{ config, pkgs, ... }: + +{ + sops.secrets."zipline/token" = { }; + home.packages = [ + (pkgs.writeShellScriptBin "hyprshot-save" '' + export HYPRSHOT_DIR=/data/Backup/Screenshots/ + + NO_UPLOAD=false + DELETE=false + + for arg in "$@"; do + case "$arg" in + --no-upload) NO_UPLOAD=true ;; + --delete) DELETE=true ;; + esac + done + + if [ "$NO_UPLOAD" = true ]; then + ${pkgs.hyprshot}/bin/hyprshot -m region + exit 0 + fi + + tmpfile=$(mktemp --suffix=".png") + ${pkgs.hyprshot}/bin/hyprshot -m region -o "$(dirname "$tmpfile")" -f "$(basename "$tmpfile")" + + token=$(cat ${config.sops.secrets."zipline/token".path}) + + url=$(curl -s \ + -H "authorization: $token" \ + -H "content-type: multipart/form-data" \ + -F "file=@$tmpfile;type=image/png" \ + https://i.toast.name/api/upload \ + | ${pkgs.jq}/bin/jq -r '.files[0].url') + + wl-copy <<< "$url" + notify-send "hyprshot-save" "URL copied to clipboard:\n$url" + + if [ "$DELETE" = true ]; then + rm -f "$tmpfile" + echo "Deleted temporary screenshot: $tmpfile" + fi + '') + ]; +} + diff --git a/hosts/vps/modules/services/zipline.nix b/hosts/vps/modules/services/zipline.nix index 998a582..1cdbf31 100644 --- a/hosts/vps/modules/services/zipline.nix +++ b/hosts/vps/modules/services/zipline.nix @@ -1,13 +1,13 @@ { config, ... }: { - sops.secrets."zipline" = { }; + sops.secrets."zipline/env" = { }; services.zipline = { enable = true; settings = { CORE_HOSTNAME = "127.0.0.1"; CORE_PORT = 3000; }; - environmentFiles = [ config.sops.secrets."zipline".path ]; + environmentFiles = [ config.sops.secrets."zipline/env".path ]; }; } diff --git a/secrets/secrets.yaml b/secrets/secrets.yaml index 87363f1..dd0ab4c 100644 --- a/secrets/secrets.yaml +++ b/secrets/secrets.yaml @@ -4,7 +4,9 @@ github_token: ENC[AES256_GCM,data:3LoIlgJTmCfMwPcTz1Q+exe8QV8XaYuYu6pAQp6yKq0aSs restic: password: ENC[AES256_GCM,data:CaWwS1Pm2LoeLHWtZv7fahpyJu4vgGgNo5E88tDXK767UH39naxcJuejq1l2Bb2OM5x8+zsIUPz8mPYAJD/Yaw==,iv:zJSZKliRzGdTlBMXk6wG9aVeR3xFQP2chcHm3LrNfjk=,tag:z90vqLU29EPgczL4X/XG4g==,type:str] rclone-config: ENC[AES256_GCM,data:HAuuawWALDQzsn6wJxQIbh57OaJnqwfm4tfhVJJ61wUgC3Kg3a/butjTCX6Q9DVQ7ygK2KH/29p4/lzSeQTGpMx7evOYi8qHQmvW+XMepx0+DEN6+y8iMRw3HG2/cctWoLDcf1RPw+eQdhDPSd/TnU26gNNdxEfTkEKPxQ5ctlLMmyGmUy2UCMarG5I6F88M2y608syTMDfbF22YHpLCBcofKbpvN9rOvqmrM8KxZ8m4JVDcbA23/X36dVkWYKrBuTW8Y2Wuo1o7dAesHIXsxW0KstnJomn/2bDNVjbsiaAlT7Vt4WVm0Gmg8ost2IrAqOeQdevw3V2SYhfCtCEJSmtpvR7KFO0e/Jsj0kF1xFdVQR7QyYO2IsyAyAozpD9pILVNOrfZ6LT8TYI+p1RnR504lumo1VPXKoRE6nnyaZWb1ABuSqXhiOVQcHN2Kg9WWEk6d3XhoIcVob1MFLvgoFttMn5dMUFqtpmpKm+E7/jxGP7wg19pmWanfr2lsbt/vnobkqKFLWFevfuK9u6atRXYo4PyONPo2KDwpI7+7WBBD49pbiklxyNUGYgYpIsLrvaG1fVnCxgdGKI7vdtBK9uLVIEP2t0cZqGs2SjEfBhJrGgU76vSTQrRm0RqA8B1WKXHOrqwaujhVzeaCf4tqRGR1StTtqTeMQ7rKi14oPFXOPTXElSVXvWlFi3yForFpUSptcGJEj5HyHwuzxOww6K2bvOltznOWO0OvI6yVMS0VfagcQBWkV7Gy6qPR98o5v18ZBfDIh8OpcnDwZ2SotTzQfkIUXWzzNTs71cWNCuQexufOzKYk/Afb8kZk1msa3q2jKZj9I3/B0siyE0X6pKgoKuV7t27PSXuDyaFSkd8+E2SLM/GPEBOXy22UwOMvcGbB+s=,iv:MXTKIls+iKS9zAm09acTBmh2imzrjIo5ojLiFW3nGuY=,tag:Z0sDuGYaz/3ZdvVqCY1m/g==,type:str] -zipline: ENC[AES256_GCM,data:YP9vpniqBDvIj3rBA25BXXtZBSjee7JMSoz2UF+yUs99Id0jYw6vcElhQGGsbjyONLqyfcFFmJJrzR0E6QBvH7LIeYVyswHP97o7F1kgIt4f8EBfJk09uQrtS9JLCNL97A==,iv:CLBjAnM68CXNmXtX79VhiyhZlOsIf2geQAfTRjwTd3I=,tag:00XyKw0H4vnp92V4bGvnoA==,type:str] +zipline: + env: ENC[AES256_GCM,data:HOcqrzXnu+BcpZYgv1yzPOTV4ydJiVa0oIXQWMUNt/X6q2TUGPOTwWg/dOgzoi6jGzFxm+wJzugO4lLQurUV0DiWIWLDSm/PK+zW34yLYwMrwK1bRaF9yl7usAN6BEmpLw==,iv:9IZDQRT2JoXNTuyPZrwRSr2m3SnXaLmJcafpkraCFWA=,tag:+7EoCTiY9f0/C5jgvPQknA==,type:str] + token: ENC[AES256_GCM,data:Ke+cJQ6Up5RUGqe/3tG7Nk40PoOQ1Vq1jN5QN4N5LXOFgclXpzN7sjx0bumFVEcgg4B7UkHmjHzjRAPtWheFu+1PaN02aQVLMGzYXgujqmccC+6roxYt4vdN0CLzf0Ii7k5KUwX3QdOV+lrVwyoBjgQyTD839YnODI7zavf+aDMlrE4+BlFjjV8MUQHsJ5G017xN0XLKOBIQsGpMl40YsvVXFrNwkZ+DkN7bXCZBiHI41W44snB1C3wkYOO+a0g4JzVjIhcHXalYgOW4Unuyyah8yDoXRxuSq7aZpQ+/AHRiuIuaHSrE5BUJu/9bJdjojNuk6VTsaLFtngViSjtyztcqMAIHFFq/KXAog8tg16dJH/V6PomrWXY=,iv:H/EcD/oNSw1mIwxsqyMeSRPsY7lnzEzTNJs6OPNfPw4=,tag:FgH9Nwxnq62uhCd/Av2kAA==,type:str] sops: age: - recipient: age1mggj0wsszz92kfpvq7pjlf0mthkljl9usu7u98jrmyxh85q4pecs6zz4ll @@ -16,7 +18,7 @@ sops: Z0crWElZcVFMVUd0VytoTHFqbkRDck0KY8nsRThk1hCA/yDNy5JJ0T6pTUwRZhYW j8grD6JYvauuYa+3tSIwqy2RPiKltx696n9nXy9iPnFUO0QY/rQGVg== -----END AGE ENCRYPTED FILE----- - lastmodified: "2025-09-24T09:39:53Z" - mac: ENC[AES256_GCM,data:wFAJKPFAL/WWlx+3jQRs/VV5vP5SbYOQ79pu8jPt4MzQhxVgccZwlZXcBPewZL5sUlBryCmOjf1CeUZ6wO7RaGS8Jo6XCeUXpa92sGaQubSDcEMJqv/kq13pq93EdQW7TZ8g6+jXPr10ew56torYmtadBrbKhPR5lhiW6EvNjTs=,iv:Mpyt5EHZ6cf1GQ5dPxteuL9wwQiGLZu7xt5vmhA35Fc=,tag:MuEiVi63UVxSuae/2puY2Q==,type:str] + lastmodified: "2025-09-25T08:59:38Z" + mac: ENC[AES256_GCM,data:BjdbNsicAIUBzztvYLFtyWpQKfAwAL6iYygr7RZsqeszRiNb2fjVC1m4LBgp9f+NWkb2QFXcHouFzeUq84ZMO1QZHGAXgbbV5mR2oHqPl32/Hi387T3lvVjQjSlwh8eMAj4/6e51jmaCuNevOTtZ8Lf7T0FRMNXUSMFL+EbffQo=,iv:A7dl71Zx81QtxiSK0ujYrtlUNhel/NmxfpFVRNsk6Aw=,tag:Y19XPnTaJ0wVa+avpDaUeQ==,type:str] unencrypted_suffix: _unencrypted version: 3.10.2