deicidus
2 years ago
8 changed files with 311 additions and 8 deletions
@ -0,0 +1,69 @@
|
||||
#!/bin/sh |
||||
|
||||
# This script displays a menu to install recommended free software. |
||||
|
||||
. colors |
||||
|
||||
# Catch Ctrl-C and exit |
||||
handle_ctrl_c() { |
||||
trap 'echo exiting; exit' INT |
||||
} |
||||
|
||||
handle_ctrl_c |
||||
|
||||
# Calculate the length of a string |
||||
strlen() { |
||||
echo -n "$1" | wc -c |
||||
} |
||||
|
||||
# Calculate maximum of two numbers |
||||
max() { |
||||
[ "$1" -gt "$2" ] && echo "$1" || echo "$2" |
||||
} |
||||
|
||||
script_dir="$(dirname "$0")" |
||||
|
||||
while true; do |
||||
max_name_length=0 |
||||
max_status_length=0 |
||||
formatted_items="" |
||||
|
||||
# First pass: calculate maximum lengths |
||||
for d in $(find "$script_dir" -maxdepth 1 -mindepth 1 -type d); do |
||||
name=$(basename "$d") |
||||
status=$(command -v "${name}-status" >/dev/null 2>&1 && eval "${name}-status" || echo "coming soon") |
||||
|
||||
# Update maximum lengths |
||||
max_name_length=$(max "$max_name_length" "$(strlen "$name")") |
||||
max_status_length=$(max "$max_status_length" "$(strlen "$status")") |
||||
done |
||||
|
||||
# Second pass: create menu items using the maximum lengths |
||||
for d in $(find "$script_dir" -maxdepth 1 -mindepth 1 -type d); do |
||||
name=$(basename "$d") |
||||
status=$(command -v "${name}-status" >/dev/null 2>&1 && eval "${name}-status" || echo "coming soon") |
||||
menu_command="${name}-menu" |
||||
|
||||
# Calculate padding for the name and status |
||||
name_padding=$(( max_name_length - $(strlen "$name") )) |
||||
status_length=$(strlen "$status") |
||||
total_padding=$(( max_status_length - status_length )) |
||||
left_padding=$(( total_padding / 2 )) |
||||
right_padding=$(( total_padding - left_padding )) |
||||
|
||||
# Build the formatted item string piece by piece |
||||
formatted_item="${name}$(printf "%${name_padding}s")" |
||||
formatted_item="${formatted_item}$(printf "%${left_padding}s")" |
||||
formatted_item="${formatted_item}${status}" |
||||
formatted_item="${formatted_item}$(printf "%${right_padding}s")" |
||||
|
||||
# Add formatted item to the list of menu items |
||||
formatted_items="${formatted_items} \"${formatted_item}%${menu_command}\"" |
||||
done |
||||
|
||||
# Add Exit command |
||||
formatted_items="${formatted_items} \"Exit%kill -2 $$\"" |
||||
|
||||
# Display the menu |
||||
eval "menu \"Install Menu:\" $formatted_items" |
||||
done |
@ -0,0 +1,26 @@
|
||||
#!/bin/sh |
||||
|
||||
# This spell displays the ao-mud main menu. |
||||
|
||||
. colors |
||||
|
||||
display_menu() { |
||||
mud="MUD menu%mud" |
||||
install="Install Free Software%install-menu" |
||||
update="Update all software%smart-update # Coming soon" |
||||
restart="Force restart%sudo shutdown -r now" |
||||
exit="Exit%kill -2 $$" # Commands are run with 'eval' by the menu script, so we can't simply say 'exit'. The keyword $$ gets this scripts PID and the -2 code is SIGINT aka Ctrl-C |
||||
|
||||
menu "Main Menu:" "$mud" "$install" "$update" "$restart" "$exit" |
||||
} |
||||
|
||||
# Catch Ctrl-C and exit |
||||
handle_ctrl_c() { |
||||
trap 'echo exiting; exit' INT |
||||
} |
||||
|
||||
handle_ctrl_c |
||||
|
||||
while true; do |
||||
display_menu |
||||
done |
@ -0,0 +1,86 @@
|
||||
#!/bin/sh |
||||
|
||||
# Initialize verbose flag to 0 |
||||
verbose=0 |
||||
|
||||
# Parse options |
||||
while getopts "v" opt; do |
||||
case $opt in |
||||
v) verbose=1 ;; # If -v is passed, set verbose to 1 |
||||
\?) echo "Invalid option: -$OPTARG" >&2 ;; # Invalid option |
||||
esac |
||||
done |
||||
shift $((OPTIND-1)) # Shift off the options and optional --. |
||||
|
||||
# Function to display priorities |
||||
display_priorities() { |
||||
# Get directory |
||||
DIR="${PWD}" |
||||
|
||||
# Get the current priorities of the directory |
||||
dir_priorities=$(read-magic "${DIR}" priorities) |
||||
|
||||
# If there are no priorities, print an error message and exit |
||||
if [ -z "${dir_priorities}" ] || [ "$dir_priorities" = "Error: The attribute does not exist." ]; then |
||||
echo "No priorities set in the current folder. Try 'prioritize <filename>'." |
||||
exit 1 |
||||
fi |
||||
|
||||
# Initialize variables |
||||
highest_priority="" |
||||
line_added=false |
||||
menu_command="menu Priorities:" |
||||
|
||||
# Loop through the priorities |
||||
dir_priorities=$(echo "${dir_priorities}" | tr ',' '\n') |
||||
|
||||
for priority_hash in $dir_priorities; do |
||||
# Get the priority file |
||||
priority_file=$(get-card "${priority_hash}") |
||||
|
||||
# Check if the file exists |
||||
if [ -n "${priority_file}" ]; then |
||||
# Get priority of the file |
||||
file_priority=$(read-magic "${priority_file}" priority 2>/dev/null) |
||||
|
||||
# If the file does not have a priority, set it to 0 |
||||
if [ -z "${file_priority}" ] || [ "$file_priority" = "Error: The attribute does not exist." ]; then |
||||
file_priority=0 |
||||
fi |
||||
|
||||
# If the priority of the file is a number |
||||
if [ "${file_priority}" -eq "${file_priority}" ] 2>/dev/null; then |
||||
# If the file's priority is not the highest priority, add a line |
||||
if [ -n "${highest_priority}" ] && [ "${file_priority}" -ne "${highest_priority}" ] && [ "${line_added}" = false ]; then |
||||
menu_command="${menu_command} \"─── %\"" |
||||
line_added=true |
||||
fi |
||||
|
||||
# Add the file to the menu command |
||||
menu_command="${menu_command} \"" |
||||
if [ $verbose -eq 1 ]; then |
||||
menu_command="${menu_command}${file_priority} " |
||||
fi |
||||
item_name=$(basename "$priority_file") |
||||
menu_command="${menu_command}$item_name%priority-menu \\\"${priority_file}\\\"\"" |
||||
|
||||
# Update the highest priority |
||||
highest_priority="${file_priority}" |
||||
fi |
||||
fi |
||||
done |
||||
|
||||
# Add exit command |
||||
menu_command="${menu_command} \"Exit%kill -2 $$\"" |
||||
|
||||
# Execute the constructed menu command |
||||
eval "${menu_command}" |
||||
} |
||||
|
||||
# This script displays a list of the prioritized cards in the current directory. |
||||
# Catch Ctrl-C |
||||
trap "exit" INT |
||||
|
||||
while true; do |
||||
display_priorities |
||||
done |
@ -0,0 +1,90 @@
|
||||
#!/bin/sh |
||||
|
||||
# Usage: prioritize [FILE] [OPTIONAL_DIRECTORY] |
||||
file_path=$1 |
||||
directory=$2 |
||||
|
||||
# Check if the target file exists |
||||
if [ ! -f "$file_path" ]; then |
||||
echo "Error: The file '$file_path' does not exist." |
||||
exit 1 |
||||
fi |
||||
|
||||
# Get the hash of the target file |
||||
hashchant "$file_path" > /dev/null |
||||
target_hash=$(read-magic "$file_path" hash 2>/dev/null) |
||||
|
||||
# Get the directory the file is in, if a target directory was not provided as the second optional argument |
||||
if [ -z "$directory" ]; then |
||||
directory=$(dirname "$file_path") |
||||
fi |
||||
|
||||
# Get the file's priority, or default to 0 |
||||
target_priority=$(read-magic "$file_path" priority 2>/dev/null || echo 0) |
||||
|
||||
# Retrieving the priority list from the directory's extended attributes |
||||
priorities=$(read-magic "$directory" priorities 2>/dev/null) |
||||
|
||||
# If there are no priorities, we add the target file as the only priority |
||||
if [ -z "$priorities" ] || [ "$priorities" = "Error: The attribute does not exist." ]; then |
||||
enchant "$directory" priorities "$target_hash" > /dev/null |
||||
enchant "$file_path" priority 1 > /dev/null |
||||
echo "Prioritized '$(basename "$file_path")' as the only priority." |
||||
exit 0 |
||||
fi |
||||
|
||||
# Get the priority of the first item in the current list of priorities |
||||
first_hash=$(echo "$priorities" | cut -d',' -f1) |
||||
first_file=$(get-card "$first_hash") |
||||
first_priority=$(read-magic "$first_file" priority 2>/dev/null || echo 0) |
||||
|
||||
# If the target file is already the first priority, we exit |
||||
if [ "$target_hash" = "$first_hash" ]; then |
||||
echo "'$(basename "$file_path")' is already the highest priority." |
||||
exit 0 |
||||
fi |
||||
|
||||
# Filter the target hash from the current priorities list, so it doesn't duplicate |
||||
priorities=$(echo "$priorities" | tr ',' '\n' | sed "/^$target_hash\$/d" | tr '\n' ',' | sed 's/,$//') |
||||
|
||||
# If the target file's priority is already equal the first item's priority, reprioritize it with a higher priority |
||||
if [ "$first_priority" -gt "0" ] && [ "$target_priority" = "$first_priority" ]; then |
||||
rebuilt_priorities="$target_hash,$priorities" |
||||
enchant "$file_path" priority $(($first_priority + 1)) > /dev/null |
||||
enchant "$directory" priorities "$rebuilt_priorities" > /dev/null |
||||
echo "Reprioritized '$(basename "$file_path")'." |
||||
exit 0 |
||||
fi |
||||
|
||||
# Loop through the comma-delimited string of hashes in a POSIX-compliant way |
||||
rebuilt_priorities="" |
||||
added=0 |
||||
for hash in $(echo "$priorities" | tr ',' ' '); do |
||||
file=$(get-card "$hash") |
||||
current_priority=$(read-magic "$file" priority 2>/dev/null || echo 0) |
||||
|
||||
# If the target file's priority is already higher than the current hash's priority |
||||
# or the current hash's priority is different from the first hash's priority |
||||
# we insert the target file's hash at this point |
||||
if [ ! $added ] && [ "$target_priority" -gt "$current_priority" ] || [ "$current_priority" != "$first_priority" ]; then |
||||
rebuilt_priorities="$rebuilt_priorities$target_hash," |
||||
added=1 |
||||
fi |
||||
rebuilt_priorities="$rebuilt_priorities$hash," |
||||
done |
||||
|
||||
# If we reached the end of the loop without adding the target hash, add it now |
||||
if [ "$added" -eq 0 ]; then |
||||
rebuilt_priorities="$rebuilt_priorities$target_hash" |
||||
fi |
||||
|
||||
# Trim trailing comma |
||||
rebuilt_priorities=$(echo "$rebuilt_priorities" | sed 's/,$//') |
||||
|
||||
# Setting the priority value of the target file to the value of the first item's priority |
||||
enchant "$file_path" priority "$first_priority" > /dev/null |
||||
|
||||
# Updating the directory's extended attributes with the new priorities list |
||||
enchant "$directory" priorities "$rebuilt_priorities" > /dev/null |
||||
|
||||
echo "Prioritized '$(basename "$file_path")'." |
@ -0,0 +1,33 @@
|
||||
#!/bin/sh |
||||
|
||||
# This spell displays a menu of commands for a prioritized file or folder. Use 'priorities' to easily select a priority with this menu. |
||||
# Usage: priority-menu [FILE] |
||||
|
||||
. colors |
||||
|
||||
FILE="${1}" |
||||
|
||||
display_menu() { |
||||
checked_state=$(read-magic "${FILE}" checked) |
||||
if [ "${checked_state}" = "Error: The attribute does not exist." ]; then |
||||
check_item="Check%echo 'Placeholder: Check command'" |
||||
else |
||||
check_item="Uncheck%echo 'Placeholder: Uncheck command'" |
||||
fi |
||||
|
||||
filename=$(basename "$FILE") |
||||
|
||||
menu "${GREEN}${BOLD}${filename}${RESET}" \ |
||||
"Prioritize (upboat)%prioritize \"$FILE\"; kill -2 $$" \ |
||||
"${check_item}" \ |
||||
"Discard from priorities (downboat)%echo 'Placeholder: Discard command'" \ |
||||
"Edit Card%echo 'Placeholder: Edit command'" \ |
||||
"Browse Within%echo 'Placeholder: Browse files within this file/folder'" \ |
||||
"Exit%kill -2 $$" |
||||
} |
||||
|
||||
trap 'exit' INT |
||||
|
||||
while true; do |
||||
display_menu |
||||
done |
Loading…
Reference in new issue