#!/usr/bin/env bash # # TTYverse Extension Manager # Simple XDG-compliant extension management for ~/.local/share/ttyverse/extensions/ # # XDG data directory for TTYverse DATA_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/ttyverse" EXT_DIR="$DATA_DIR/extensions" BUNDLED_DIR="$(dirname "$0")" # Colors for output (only if stdout is a terminal) if [[ -t 1 ]]; then GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' else GREEN='' YELLOW='' RED='' NC='' fi # Ensure extension directory exists mkdir -p "$EXT_DIR" show_help() { cat << EOF TTYverse Extension Manager Usage: $0 [extension_name] Commands: list Show available and enabled extensions enable Enable an extension (symlink to XDG extensions directory) disable Disable an extension (remove from XDG extensions directory) status Show status of specific extension help Show this help Examples: $0 list # Show all extensions $0 enable soundpack # Enable soundpack extension $0 disable soundpack # Disable soundpack extension $0 status soundpack # Check if soundpack is enabled XDG Extensions Directory: $EXT_DIR Bundled Extensions: $BUNDLED_DIR Note: TTYverse only loads extensions from the XDG directory. Use this script to enable/disable bundled extensions or install your own. EOF } list_extensions() { echo -e "${GREEN}Available Extensions:${NC}" for ext in "$BUNDLED_DIR"/*.pl; do if [[ -f "$ext" ]]; then basename="${ext##*/}" name="${basename%.pl}" if [[ -L "$EXT_DIR/$basename" || -f "$EXT_DIR/$basename" ]]; then echo -e " ${GREEN}✓${NC} $name (enabled)" else echo -e " ${YELLOW}○${NC} $name (available)" fi fi done echo -e "\n${GREEN}User Extensions:${NC}" for ext in "$EXT_DIR"/*.pl; do if [[ -f "$ext" && ! -L "$ext" ]]; then basename="${ext##*/}" name="${basename%.pl}" echo -e " ${GREEN}●${NC} $name (user-installed)" fi done } enable_extension() { local name="$1" local ext_file="$name.pl" local bundled_path="$BUNDLED_DIR/$ext_file" local user_path="$EXT_DIR/$ext_file" if [[ ! -f "$bundled_path" ]]; then echo -e "${RED}Error:${NC} Extension '$name' not found in bundled extensions" echo "Available extensions:" for ext in "$BUNDLED_DIR"/*.pl; do if [[ -f "$ext" ]]; then basename="${ext##*/}" echo " ${basename%.pl}" fi done return 1 fi if [[ -L "$user_path" ]]; then echo -e "${YELLOW}Warning:${NC} Extension '$name' is already enabled" return 0 elif [[ -f "$user_path" ]]; then echo -e "${YELLOW}Warning:${NC} User-installed extension '$name' already exists" return 0 fi ln -s "$(realpath "$bundled_path")" "$user_path" echo -e "${GREEN}✓${NC} Enabled extension: $name" echo " Linked: $bundled_path -> $user_path" # Special handling for soundpack extension - copy default sounds and configure RC if [[ "$name" == "soundpack" ]]; then local sounds_src="$BUNDLED_DIR/sounds" local sounds_dst="$DATA_DIR/sounds" local config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/ttyverse" local rc_file="$config_dir/ttyverserc" # Copy sound files if [[ -d "$sounds_src" ]]; then echo " Copying bundled sound files..." cp -r "$sounds_src"/* "$sounds_dst/" 2>/dev/null || true echo -e "${GREEN}✓${NC} Copied default sound pack to $sounds_dst/" fi # Auto-configure RC file mkdir -p "$config_dir" local needs_config=false # Check if soundpack extension is already configured # Need to check for exts, notifytype, and notifies all being properly set local has_exts=false local has_notifytype=false local has_notifies=false if [[ -f "$rc_file" ]]; then grep -q "^exts.*soundpack" "$rc_file" 2>/dev/null && has_exts=true grep -q "^notifytype=.*soundpack" "$rc_file" 2>/dev/null && has_notifytype=true grep -q "^notifies=.*mention.*boost.*favourite" "$rc_file" 2>/dev/null && has_notifies=true fi if [[ "$has_exts" == "false" ]] || [[ "$has_notifytype" == "false" ]] || [[ "$has_notifies" == "false" ]]; then needs_config=true fi if [[ "$needs_config" == "true" ]]; then echo " Configuring TTYverse for sound notifications..." # Create backup if RC file exists [[ -f "$rc_file" ]] && cp "$rc_file" "$rc_file.backup.$(date +%s)" # Update or create exts line if [[ -f "$rc_file" ]] && grep -q "^exts=" "$rc_file"; then # Check if soundpack is already in exts line if ! grep -q "^exts=.*soundpack" "$rc_file"; then sed -i 's/^exts=\(.*\)/exts=\1,soundpack/' "$rc_file" echo " Added soundpack to existing exts line" fi else # Add new exts line echo "exts=soundpack" >> "$rc_file" echo " Added exts=soundpack" fi # Add or update notifytype if [[ -f "$rc_file" ]] && grep -q "^notifytype=" "$rc_file"; then sed -i 's/^notifytype=.*/notifytype=soundpack/' "$rc_file" echo " Updated notifytype to soundpack" else echo "notifytype=soundpack" >> "$rc_file" echo " Added notifytype=soundpack" fi # Add or update notifies parameter for sound events if [[ -f "$rc_file" ]] && grep -q "^notifies=" "$rc_file"; then # Update existing notifies line to include fediverse sound types sed -i 's/^notifies=.*/notifies=default,mention,dm,me,follow,boost,favourite/' "$rc_file" echo " Updated existing notifies configuration" else # Add new notifies line echo "notifies=default,mention,dm,me,follow,boost,favourite" >> "$rc_file" echo " Added notifies configuration" fi # Add extension preferences { echo "" echo "# Sound notifications (added by extension manager)" echo "extpref_sound_command=paplay" echo "extpref_soundpack=default" echo "" echo "# Fediverse sound types: default, mention, dm, me, follow, boost, favourite, poll, announcement" } >> "$rc_file" echo -e "${GREEN}✓${NC} Configured TTYverse RC file for sound notifications" echo " Restart TTYverse to enable sounds automatically" else echo -e "${YELLOW}Note:${NC} Soundpack already configured in RC file" fi fi } disable_extension() { local name="$1" local ext_file="$name.pl" local user_path="$EXT_DIR/$ext_file" if [[ ! -e "$user_path" ]]; then echo -e "${YELLOW}Warning:${NC} Extension '$name' is not enabled" return 0 fi if [[ -L "$user_path" ]]; then rm "$user_path" echo -e "${GREEN}✓${NC} Disabled extension: $name" # Special handling for soundpack - offer to remove from RC file if [[ "$name" == "soundpack" ]]; then local config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/ttyverse" local rc_file="$config_dir/ttyverserc" if [[ -f "$rc_file" ]] && grep -q "soundpack" "$rc_file"; then echo -e "${YELLOW}Note:${NC} Soundpack is still configured in $rc_file" echo " You may want to remove the soundpack lines to fully disable" echo " Or run TTYverse without -exts=soundpack to override" fi fi elif [[ -f "$user_path" ]]; then echo -e "${YELLOW}Warning:${NC} '$name' is a user-installed extension (not a symlink)" echo "Remove manually if needed: $user_path" fi } show_status() { local name="$1" local ext_file="$name.pl" local bundled_path="$BUNDLED_DIR/$ext_file" local user_path="$EXT_DIR/$ext_file" echo "Extension: $name" echo "Bundled: $([[ -f "$bundled_path" ]] && echo "Available" || echo "Not found")" if [[ -L "$user_path" ]]; then echo -e "Status: ${GREEN}Enabled${NC} (symlinked)" echo "Target: $(readlink "$user_path")" elif [[ -f "$user_path" ]]; then echo -e "Status: ${GREEN}Enabled${NC} (user-installed)" else echo -e "Status: ${YELLOW}Disabled${NC}" fi } # Main command handling case "${1:-help}" in list|ls) list_extensions ;; enable) if [[ -z "$2" ]]; then echo -e "${RED}Error:${NC} Extension name required" echo "Usage: $0 enable " exit 1 fi enable_extension "$2" ;; disable) if [[ -z "$2" ]]; then echo -e "${RED}Error:${NC} Extension name required" echo "Usage: $0 disable " exit 1 fi disable_extension "$2" ;; status) if [[ -z "$2" ]]; then echo -e "${RED}Error:${NC} Extension name required" echo "Usage: $0 status " exit 1 fi show_status "$2" ;; help|--help|-h) show_help ;; *) echo -e "${RED}Error:${NC} Unknown command: $1" echo "Run '$0 help' for usage information" exit 1 ;; esac