#!/usr/bin/env bash # ANSI color codes RED='\033[0;31m' CYAN='\033[0;36m' YELLOW='\033[0;33m' LIGHT_GREEN='\033[0;92m' BOLD='\033[1m' NC='\033[0m' # No Color echo_error() { printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 } echo_info() { printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" } echo_warning() { printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" } echo_note() { printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" } # ─< Check if the given command exists silently >───────────────────────────────────────── command_exists() { command -v "$@" >/dev/null 2>&1 } # ─< Check if the user is root and set sudo variable if necessary >─────────────────────── check_root() { if ((EUID != 0)); then if command_exists sudo; then echo_info "User is not root. Using sudo for privileged operations." _sudo="sudo" else echo_error "No sudo found and you're not root! Can't install packages." return 1 fi else echo_info "Root access confirmed." _sudo="" fi } # ─< Distribution detection and installation >──────────────────────────────────────── get_packager() { pkger=( "apt" "pacman" "dnf" "apk" "zypper" ) for pkger in "${pkger[@]}"; do if command_exists "$pkger"; then echo_info "Found package manager: $pkger" case "$pkger" in "apt") $_sudo apt-get update _install() { $_sudo apt-get install --assume-yes "$@"; } ;; "pacman") $_sudo pacman -Syy _install() { $_sudo pacman -S --noconfirm "$@"; } ;; "dnf") $_sudo dnf update _install() { $_sudo dnf install -y "$@"; } ;; "apk") _install() { $_sudo apk add "$@"; } ;; "zypper") $_sudo zypper ref _install() { $_sudo zypper in -y "$@"; } ;; esac fi done } silentexec() { "$@" >/dev/null 2>&1 } __pre_stow__() { echo_note "__pre_stow__" conf="$HOME/.config" bak_dir="$HOME/.bak" dirs=( "btop" "gBar" "yazi" "fastfetch" "hypr" "tmux" "kitty" "neovide" "rofi" "waybar" "wlogout" "wob" ) if [ ! -d "$bak_dir" ]; then echo_info "backup dir created at $bak_dir" && silentexec mkdir "$bak_dir" else echo_info "Backup dir already present, clearing now" && rm -rf "${bak_dir:?}/*" fi for _dirs in "${dirs[@]}"; do if [ -d "$conf/$_dirs" ]; then mv -f "$conf/$_dirs" "$bak_dir" fi done h_files=( ".zshrc" ".zshenv" ".wezterm.lua" ) for _f in "${h_files[@]}"; do if [ -f "$HOME/$_f" ]; then mv -f "$HOME/$_f" "$bak_dir" && echo_info "Moved $_f to $bak_dir" fi done for _d in ".zsh .tmux"; do if [ -d "$HOME/$_d" ]; then mv -f "$HOME/$_d" "$bak_dir" && echo_info "Moved $_d to $bak_dir" fi done } askThings() { echo_info "Choose a menu - [r]ofi || [t]ofi" read -r askMenu "$HOME/.monitors.conf" fi } pkg_optional() { _ops=( "cowsay" "cmatrix" "trash-cli" ) case "$_ops" in Y | y) for _o_ in "${_ops[@]}"; do if command_exists "$_o_"; then echo_note "$_o_ - is already installed" else echo_info "Installing $_o_" _install "$_o_" fi done ;; *) echo default ;; esac } __stow__() { stow --verbose --target="$HOME" --defer=.gitmodules --restow */ } main() { check_root get_packager __validate__ __dep__ if ! command_exists stow; then echo_error "we couldn't find stow on the machine, do you want us to install it? (y/n): " read -r ask_stow case "$ask_stow" in Y | y) _install stow ;; *) echo_error "You cannot proceed without installing stow! Please install manually" exit 1 ;; esac else echo_info "stow was found, going on to prepare to stow your config" sleep 0.3 fi __pre_stow__ __stow__ sleep 2 [ "$__optional__" = "true" ] && pkg_optional __monitors__ echo_note "found resolution ${res}" } main