Skip to content

Instantly share code, notes, and snippets.

@focusaurus
Created November 25, 2018 18:22
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save focusaurus/506fff3d849bd167c5c809f2f12815e1 to your computer and use it in GitHub Desktop.
Save focusaurus/506fff3d849bd167c5c809f2f12815e1 to your computer and use it in GitHub Desktop.
Fuzzball desktop automation script
#!/usr/bin/env bash
# Please Use Google Shell Style: https://google.github.io/styleguide/shell.xml
# ---- Start unofficial bash strict mode boilerplate
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
set -o errexit # always exit on error
set -o errtrace # trap errors in functions as well
set -o pipefail # don't ignore exit codes when piping output
set -o posix # more strict failures in subshells
# set -x # enable debugging
IFS="$(printf "\n\t")"
# ---- End unofficial bash strict mode boilerplate
# https://stackoverflow.com/a/10660730/266795
rawurlencode() {
local string="${1}"
local strlen=${#string}
local encoded=""
local pos c o
for ((pos = 0; pos < strlen; pos++)); do
c=${string:$pos:1}
case "$c" in
[-_.~a-zA-Z0-9]) o="${c}" ;;
*) printf -v o '%%%02x' "'$c" ;;
esac
encoded+="${o}"
done
echo "${encoded}" # You can either set a return variable (FASTER)
REPLY="${encoded}" #+or echo the result (EASIER)... or both... :p
}
main() {
task_dir="$1"
cd "${task_dir}"
while true; do
task=$(fd --type=file --type=symlink . | hs)
if [[ "${task}" == "quit" ]]; then
return
fi
if [[ -z "${task}" ]]; then
continue
fi
if [[ -x "${task}" ]]; then
"./${task}"
continue
fi
if grep '%s' "${task}" >/dev/null; then
# Task has placeholders we'll replace with a prompt
query=$(~/bin/prompt-or-clipboard.sh)
query=$(rawurlencode "${query}")
args=$(cat "${task}" | sed "s/%s/${query}/g")
else
args=$(cat "${task}")
fi
if [[ "${args}" =~ ^#! ]]; then
echo "ERROR: ${task} looks like a script but is not executable" 1>&2
read -r -n 1 -p "Fix it? " fix_it
if [[ "${fix_it}" == "y" ]]; then
chmod 755 "${task}"
echo "Fixed. Running it now."
"./${task}"
continue
fi
fi
case $(uname) in
Linux)
echo "${args}" | xargs -n 1 xdg-open
;;
Darwin)
echo "${args}" | xargs open
;;
esac
sleep 1
done
}
main "$@"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment