Files
NubNix/home-manager/20_waybar/03_scripts.nix
2025-11-13 14:15:48 +00:00

301 lines
12 KiB
Nix
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ config, pkgs, ... }:
{
home.file.".config/waybar/scripts/asus-profile.sh".text = ''
#!/bin/bash
# asus-profile.sh
# Description: Display current ASUS power profile with color
# Usage: Called by Waybar `custom/asus-profile`
# Dependencies: asusctl, awk
#
profile=$(asusctl profile -p | awk '/Active profile/ {print $NF}')
case "$profile" in
Performance)
text="RAZGON"
fg="#bf616a"
;;
Balanced)
text="STABILIZATION"
fg="#fab387"
;;
Quiet)
text="REACTOR SLEEP"
fg="#56b6c2"
;;
*)
text="ASUS ??"
fg="#ffffff"
;;
esac
echo "<span foreground='$fg'>$text</span>"
'';
home.file.".config/waybar/scripts/battery.sh".text = ''
#!/bin/bash
# battery.sh
# Description: Shows battery % with ASCII bar + dynamic tooltip
# Usage: Waybar `custom/battery` every 10s
# Dependencies: upower, awk, seq, printf
#
capacity=$(cat /sys/class/power_supply/BAT0/capacity)
status=$(cat /sys/class/power_supply/BAT0/status)
# Get detailed info from upower
time_to_empty=$(upower -i /org/freedesktop/UPower/devices/battery_BAT0 | awk -F: '/time to empty/ {print $2}' | xargs)
time_to_full=$(upower -i /org/freedesktop/UPower/devices/battery_BAT0 | awk -F: '/time to full/ {print $2}' | xargs)
# Icons
charging_icons=(󰢜 󰂆 󰂇 󰂈 󰢝 󰂉 󰢞 󰂊 󰂋 󰂅)
default_icons=(󰁺 󰁻 󰁼 󰁽 󰁾 󰁿 󰂀 󰂁 󰂂 󰁹)
index=$((capacity / 10))
[ $index -ge 10 ] && index=9
if [[ "$status" == "Charging" ]]; then
icon=${charging_icons[$index]}
elif [[ "$status" == "Full" ]]; then
icon="󰂅"
else
icon=${default_icons[$index]}
fi
# ASCII bar
filled=$((capacity / 10))
empty=$((10 - filled))
bar=$(printf '%.0s' $(seq 1 $filled))
pad=$(printf '%.0s' $(seq 1 $empty))
ascii_bar="[$bar$pad]"
# Color thresholds
if [ "$capacity" -lt 20 ]; then
fg="#bf616a" # red
elif [ "$capacity" -lt 55 ]; then
fg="#fab387" # orange
else
fg="#56b6c2" # cyan
fi
# JSON output
echo "{\"text\":\"<span foreground='$fg'>$icon $ascii_bar $capacity%</span>\",\"tooltip\":\"$tooltip\"}"
'';
home.file.".config/waybar/scripts/bluetooth-toggle.sh".text = ''
#!/bin/bash
# bluetooth-toggle.sh
# Toggle Bluetooth on/off using rfkill.
# Usage: Waybar `bluetooth` module :on-click
# Output: (changes state only)
#
if rfkill list bluetooth | grep -q "Soft blocked: yes"; then
rfkill unblock bluetooth
else
rfkill block bluetooth
fi
'';
home.file.".config/waybar/scripts/brightness.sh".text = ''
#!/bin/bash
# brightness.sh
# Description: Shows current brightness with ASCII bar + tooltip
# Usage: Waybar `custom/brightness` every 2s
# Dependencies: brightnessctl, seq, printf, awk
#
# Get brightness percentage
brightness=$(brightnessctl get)
max_brightness=$(brightnessctl max)
percent=$((brightness * 100 / max_brightness))
# Build ASCII bar
filled=$((percent / 10))
empty=$((10 - filled))
bar=$(printf '%.0s' $(seq 1 $filled))
pad=$(printf '%.0s' $(seq 1 $empty))
ascii_bar="[$bar$pad]"
# Icon
icon="󰛨"
# Color thresholds
if [ "$percent" -lt 20 ]; then
fg="#bf616a" # red
elif [ "$percent" -lt 55 ]; then
fg="#fab387" # orange
else
fg="#56b6c2" # cyan
fi
# Device name (first column from brightnessctl --machine-readable)
device=$(brightnessctl --machine-readable | awk -F, 'NR==1 {print $1}')
# Tooltip text
tooltip="Brightness: $percent%\nDevice: $device"
# JSON output
echo "{\"text\":\"<span foreground='$fg'>$icon $ascii_bar $percent%</span>\",\"tooltip\":\"$tooltip\"}"
'';
home.file.".config/waybar/scripts/brightness-toggle.sh".text = ''
#!/bin/bash
# brightness-toggle.sh
# Description: Cycle screen brightness between 30%, 60%, and 100%
# Usage: Waybar `custom/brightness` on-click
# Dependencies: brightnessctl
#
current=$(brightnessctl get)
max=$(brightnessctl max)
percent=$((current * 100 / max))
if [ "$percent" -lt 45 ]; then
brightnessctl set 60%
elif [ "$percent" -lt 85 ]; then
brightnessctl set 100%
else
brightnessctl set 30%
fi
'';
home.file.".config/waybar/scripts/mic.sh".text = ''
#!/bin/bash
# mic.sh
# Description: Shows microphone mute/unmute status with icon
# Usage: Called by Waybar `custom/microphone` module every 1s
# Dependencies: pactl (PulseAudio / PipeWire)
#
if pactl get-source-mute @DEFAULT_SOURCE@ | grep -q 'yes'; then
# Muted mic-off icon
echo "<span foreground='#fab387'>[ ]</span>"
else
# Active mic-on icon
echo "<span foreground='#56b6c2'>[ ]</span>"
fi
'';
home.file.".config/waybar/scripts/nordvpn-toggle.sh".text = ''
#!/bin/bash
# vpn-toggle.sh
# Description: Toggle VPN on/off via systemd service
# Usage: Called by Waybar `custom/vpn` on click
# Dependencies: systemctl, ip
#
if ip a | grep -q "10\.6\.0\."; then
# VPN active stop service (disconnect)
systemctl stop nordvpn-retry.service
systemctl stop nordvpnd.service
else
# VPN inactive start service (connect)
systemctl start nordvpn-retry.service
fi
'';
home.file.".config/waybar/scripts/nordvpn-status.sh".text = ''
#!/bin/bash
# nordvpn-status.sh
# Description: Checks if VPN interface is active via IP range
# Usage: Called by Waybar `custom/vpn` every 5s
# Dependencies: ip, curl (optional, for country lookup)
# Output: Pango markup [ФАНТОМ]: Country or KAPUTT
# Example: <span foreground='#fab387'>[ФАНТОМ]: Japan</span>
# <span foreground='#bf616a'>[ФАНТОМ]: KAPUTT</span>
#
#!/bin/bash
if sudo ipsec statusall 2>/dev/null | grep -q "ESTABLISHED"; then
country=$(curl -s ifconfig.co/country 2>/dev/null)
[[ -z "$country" ]] && country="UNKNOWN"
echo "<span foreground='#fab387'>[УЗЕЛ]: $country</span>"
else
echo "<span foreground='#bf616a'>[НЕТ СВЯЗИ]</span>"
fi
'';
home.file.".config/waybar/scripts/powermenu.sh".text = ''
#!/usr/bin/env bash
#
# Rofi Power Menu
# Provides a simple system power menu integrated with Waybar.
# Example:
# ./powermenu.sh
# # Opens a Rofi menu with power options
#
rofi_command="rofi -dmenu -p Power"
options="Shutdown\nReboot\nLogout\nSuspend\nLock"
chosen="$(echo -e "$options" | $rofi_command)"
case $chosen in
Shutdown) systemctl poweroff ;;
Reboot) systemctl reboot ;;
Logout) hyprctl dispatch exit ;;
Suspend) systemctl suspend ;;
Lock) ~/.config/hyprlock/lock.sh ;;
esac
'';
home.file.".config/waybar/scripts/volume.sh".text = ''
#!/bin/bash
# volume.sh
# Description: Shows current audio volume with ASCII bar + tooltip
# Usage: Waybar `custom/volume` every 1s
# Dependencies: wpctl, awk, bc, seq, printf
#
# Get raw volume and convert to int
vol_raw=$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{ print $2 }')
vol_int=$(echo "$vol_raw * 100" | bc | awk '{ print int($1) }')
# Check mute status
is_muted=$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | grep -q MUTED && echo true || echo false)
# Get default sink description (human-readable)
sink=$(wpctl status | awk '/Sinks:/,/Sources:/' | grep '\*' | cut -d'.' -f2- | sed 's/^\s*//; s/\[.*//')
# Icon logic
if [ "$is_muted" = true ]; then
icon=""
vol_int=0
elif [ "$vol_int" -lt 50 ]; then
icon=""
else
icon=""
fi
# ASCII bar
filled=$((vol_int / 10))
empty=$((10 - filled))
bar=$(printf '%.0s' $(seq 1 $filled))
pad=$(printf '%.0s' $(seq 1 $empty))
ascii_bar="[$bar$pad]"
# Color logic
if [ "$is_muted" = true ] || [ "$vol_int" -lt 10 ]; then
fg="#bf616a" # red
elif [ "$vol_int" -lt 50 ]; then
fg="#fab387" # orange
else
fg="#56b6c2" # cyan
fi
# Tooltip text
if [ "$is_muted" = true ]; then
tooltip="Audio: Muted\nOutput: $sink"
else
tooltip="Audio: $vol_int%\nOutput: $sink"
fi
# Final JSON output
echo "{\"text\":\"<span foreground='$fg'>$icon $ascii_bar $vol_int%</span>\",\"tooltip\":\"$tooltip\"}"
'';
}