From d2e3d05e294ed062f0114b8290c120ecfe184702 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 25 Sep 2022 18:32:10 +0200 Subject: [PATCH] pastebin --- configuration.nix | 1 + kakoune.nix | 27 ++++-- pastebin.nix | 234 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 253 insertions(+), 9 deletions(-) create mode 100644 pastebin.nix diff --git a/configuration.nix b/configuration.nix index 10fe35d..1a101ff 100644 --- a/configuration.nix +++ b/configuration.nix @@ -8,6 +8,7 @@ imports = [ ./kakoune.nix + ./pastebin.nix ]; nix = { diff --git a/kakoune.nix b/kakoune.nix index 2936a3c..ac9e10a 100644 --- a/kakoune.nix +++ b/kakoune.nix @@ -192,17 +192,26 @@ let name = "edit"; runtimeInputs = [ myKakoune ]; text = '' - BUFFER_NAME=''$(echo -n "''$PWD" | xxd -ps -c 200 | tr -d '\n' | shasum | head -c -4) + CMND=$(cat <<'END' + BUFFER_NAME=''$(echo -n "''$PWD" | xxd -ps -c 200 | tr -d '\n' | shasum | head -c -4) - tmux -L "$BUFFER_NAME" has-session -t "$BUFFER_NAME" || { - tmux -L "$BUFFER_NAME" new-session -d -s "$BUFFER_NAME" "kak -e 'kaktree-enable; kaktree-toggle'" - tmux -L "$BUFFER_NAME" set -g status off - tmux -L "$BUFFER_NAME" set -g pane-border-style fg=#0c0c0c - tmux -L "$BUFFER_NAME" set -g pane-active-border-style "bg=default fg=#0c0c0c" - } + tmux -L "$BUFFER_NAME" has-session -t "$BUFFER_NAME" || { + tmux -L "$BUFFER_NAME" new-session -d -s "$BUFFER_NAME" "kak -e 'kaktree-enable; kaktree-toggle'" + tmux -L "$BUFFER_NAME" set -g status off + tmux -L "$BUFFER_NAME" set -g pane-border-style fg=#0c0c0c + tmux -L "$BUFFER_NAME" set -g pane-active-border-style "bg=default fg=#0c0c0c" + } - tmux -L "$BUFFER_NAME" attach -t "$BUFFER_NAME" -''; + tmux -L "$BUFFER_NAME" attach -t "$BUFFER_NAME" + END + ) + + if [ -f "shell.nix" ] && [ -z ''${IN_NIX_SHELL+x} ]; then + nix-shell --command "$CMND" + else + eval "$CMND" + fi + ''; }); diff --git a/pastebin.nix b/pastebin.nix new file mode 100644 index 0000000..2c8ea27 --- /dev/null +++ b/pastebin.nix @@ -0,0 +1,234 @@ +{ pkgs, lib, config, specialArgs, options, modulesPath }: + +with pkgs; + +let + + pastebin = (writeShellApplication { + name = "pb"; + runtimeInputs = [ curl ]; + text = '' + #!/bin/sh + + # init variables + version="v2020.10.27" + ENDPOINT="https://stp.cx" + flag_options=":hvcufe:s::" + flag_version=0 + flag_help=0 + flag_file=0 + flag_url=0 + flag_colors=0 + flag_ext=0 + data="" + EXT="" + + # help message available via func + show_help() { + cat > /dev/stdout << END + pb [options] filename + or + (command-with-stdout) | pb + + Uploads a file or data to steph's 0x0 paste bin + + OPTIONAL FLAGS: + -h Show this help + -v Show current version number + -f Explicitly interpret stdin as filename + -c Pretty color output + -u Shorten URL + -s server_address Use alternative pastebin server address + -e bin_extension Specify a binary file extension used in the upload + END + } + + show_usage() { + cat > /dev/stdout << END + usage: pb [-hfvcux] [-s server_address] filename + END + } + + # helper for program exit, supports error codes and messages + die () { + msg="$1" + code="$2" + # exit code defaults to 1 + if printf "%s" "''${code}" | grep -q '^[0-9]+$'; then + code=1 + fi + # output message to stdout or stderr based on code + if [ -n "''${msg}" ]; then + if [ "''${code}" -eq 0 ]; then + printf "%s\\n" "''${msg}" + else + printf "%s%s%s\\n" "$ERROR" "''${msg}" "$RESET" >&2 + fi + fi + exit "''${code}" + } + + # attempt to parse options or die + if ! parsed=$(getopt ''${flag_options} "$@"); then + printf "pb: unknown option\\n" + show_usage + exit 2 + fi + + # handle options + eval set -- "''${parsed}" + while true; do + case "$1" in + -h|?) + flag_help=1 + ;; + -v) + flag_version=1 + ;; + -c) + flag_colors=1 + ;; + -f) + flag_file=1 + ;; + -e) + shift + flag_ext=1 + EXT="$1" + ;; + -s) + shift + ENDPOINT="$1" + ;; + -u) + flag_url=1 + ;; + --) + shift + break + ;; + *) + die "Internal error: $1" 3 + ;; + esac + shift + done + + # display current version + if [ ''${flag_version} -gt 0 ]; then + printf "%s\\n" "''${version}" + die "" 0 + fi + + # display help + if [ ''${flag_help} -gt 0 ]; then + show_help + die "" 0 + fi + + # is not interactive shell, use stdin + if [ -t 0 ]; then + flag_file=1 + else + if [ ''${flag_ext} -gt 0 ]; then + # short-circuit stdin access to ensure binary data is transferred to curl + curl -sF"file=@-;filename=null.''${EXT}" "''${ENDPOINT}" < /dev/stdin + exit 0 + else + data="$(cat < /dev/stdin )" + fi + fi + + # if data variable is empty (not a pipe) use params as fallback + if [ -z "$data" ]; then + data="$*" + fi + + # Colors + if [ ''${flag_colors} -gt 0 ]; then + SUCCESS=$(tput setaf 190) + ERROR=$(tput setaf 196) + RESET=$(tput sgr0) + else + SUCCESS="" + ERROR="" + RESET="" + fi + + # URL shortening reference + + # If URL mode detected, process URL shortener and end processing without + # checking for a file to upload to the pastebin + if [ ''${flag_url} -gt 0 ]; then + + if [ -z "''${data}" ]; then + # if no data + # print error message + printf "%sProvide URL to shorten%s\\n" "$ERROR" "$RESET" + else + # shorten URL and print results + result=$(curl -sF"shorten=''${data}" "''${ENDPOINT}") + printf "%s%s%s\\n" "$SUCCESS" "$result" "$RESET" + fi + die "" 0 + fi + + if [ ''${flag_file} -gt 0 ]; then + # file mode + if [ -z "''${data}" ]; then + # if no data + # print error message + printf "%sProvide data to upload%s\\n" "$ERROR" "$RESET" + elif [ ! -f "''${data}" ]; then + # file not found with name provided + # print error messagse + printf "%s%s%s\\tFile not found.%s\\n" "$RESET" "''${data}" "$ERROR" "$RESET" + # attempt to split data string (multi-line?) and upload each string as file + for f in ''${data}; do + # if there's nothing to parse, skip this loop + if [ "$f" = "$data" ]; then + break; + fi + # check if file exists + if [ -f "''${f}" ]; then + if [ ''${flag_ext} -gt 0 ]; then + # send file to endpoint masked with new extension + result=$(curl -sF"file=@''${f};filename=null.''${EXT}" "''${ENDPOINT}") + else + # send file to endpoint + result=$(curl -sF"file=@''${f}" "''${ENDPOINT}") + fi + printf "%s%s%s\\n" "$SUCCESS" "$result" "$RESET" + else + # print error message + printf "%sFile not found.%s\\n" "$ERROR" "$RESET" + fi + done + else + # data available in file + # send file to endpoint + result=$(curl -sF"file=@''${data}" "''${ENDPOINT}") + printf "%s%s%s\\n" "$SUCCESS" "$result" "$RESET" + fi + else + # non-file mode + if [ -z "''${data}" ]; then + # if no data + # print error message + printf "%sNo data found for upload. Please try again.%s\\n" "$ERROR" "$RESET" + else + # data available + # send data to endpoint + result=$(printf "%s" "''${data}" | curl -sF"file=@-;filename=null.txt" "''${ENDPOINT}") + printf "%s%s%s\\n" "$SUCCESS" "$result" "$RESET" + fi + fi + + + ''; + }); + +in +{ + environment.systemPackages = [ pastebin ]; +}