dotfiles/bin/rice-status
Sarthak 7f41cf7a82 replace the old dotfiles with the sakura line rice
The bare $HOME repo is gone. This is now the rice: install.sh, rice-*
scripts in bin/, configs in home/ linked into $HOME, theme templates, st
and the particle wallpaper. Clone to ~/rice and run install.sh.
2026-09-14 19:44:44 +05:30

102 lines
3.5 KiB
Bash
Executable file

#!/usr/bin/env bash
# rice-status <module> - live text for polybar's rice modules (tail = true).
# Modules: net bt vol notif indicators media. Each prints a line whenever its
# state changes, in the same "LABEL value" style as the cpu/ram/gpu modules.
set -uo pipefail
run="${XDG_RUNTIME_DIR:-/tmp}/rice"
mkdir -p "$run"
accent=$(rice-theme get accent) dim=$(rice-theme get dim)
urgent=$(rice-theme get urgent) green=$(rice-theme get green)
yellow=$(rice-theme get yellow) magenta=$(rice-theme get magenta)
# label <colour> <LABEL> <value>
label() { printf '%%{F%s}%s%%{F-} %s\n' "$1" "$2" "$3"; }
short() { local s="$1" n="$2"; (( ${#s} > n )) && s="${s:0:n-1}"; printf '%s' "$s"; }
# wait for anything under $run to change, or give up after $1 seconds
settle() { inotifywait -qq -t "$1" -e close_write,create,delete "$run" 2>/dev/null; return 0; }
net() {
show() {
local type conn
IFS=: read -r type conn < <(nmcli -t -f TYPE,STATE,CONNECTION device status 2>/dev/null |
awk -F: '$2 == "connected" && ($1 == "wifi" || $1 == "ethernet") { print $1 ":" $3; exit }')
case "${type:-}" in
wifi) label "$accent" NET "$(short "$conn" 16)" ;;
ethernet) label "$accent" NET eth ;;
*) label "$urgent" NET off ;;
esac
}
show
nmcli monitor 2>/dev/null | while read -r _; do show; done
}
bt() {
while :; do
if ! bluetoothctl show 2>/dev/null | grep -q 'Powered: yes'; then
label "$dim" BT off
else
local dev
dev=$(bluetoothctl devices Connected 2>/dev/null | head -n1 | cut -d' ' -f3-)
label "$accent" BT "$(short "${dev:-on}" 14)"
fi
settle 10
done
}
vol() {
show() {
local v m
read -r _ v m < <(wpctl get-volume @DEFAULT_AUDIO_SINK@ 2>/dev/null)
if [[ -n ${m:-} ]]; then label "$urgent" VOL muted
else label "$green" VOL "$(awk -v v="${v:-0}" 'BEGIN { printf "%d%%", v * 100 + 0.5 }')"; fi
}
show
pactl subscribe 2>/dev/null | grep --line-buffered -E "'change' on (sink|server)" | while read -r _; do show; done
}
notif() {
while :; do
local n level
n=$(dunstctl count history 2>/dev/null || echo 0)
level=$(dunstctl get-pause-level 2>/dev/null || echo 0)
if (( level > 0 )); then printf '%%{F%s}󰂛%%{F-}\n' "$yellow"
elif (( n > 0 )); then printf '%%{F%s}󰂚%%{F-} %s\n' "$accent" "$n"
else printf '%%{F%s}󰂚%%{F-}\n' "$dim"; fi
settle 5
done
}
indicators() {
while :; do
local out="" r
[[ -f $run/stay-awake ]] && out+="%{A1:rice-idle toggle:}%{F$yellow}󰅶%{F-}%{A} "
pgrep -x gpu-screen-reco >/dev/null && out+="%{A1:rice-capture record:}%{F$urgent}󰑊 REC%{F-}%{A} "
pgrep -f 'nerd-dictation begin' >/dev/null && out+="%{A1:rice-dictate toggle:}%{F$magenta}󰍬%{F-}%{A} "
r=$(systemctl --user list-timers 'rice-reminder-*' --no-legend 2>/dev/null | grep -c .)
(( r > 0 )) && out+="%{A1:rice-reminder list:}%{F$accent}󰢌 $r%{F-}%{A} "
printf '%s\n' "${out% }"
settle 5
done
}
media() {
while :; do
echo ""
playerctl --follow metadata --format '{{status}}|{{artist}}|{{title}}' 2>/dev/null |
while IFS='|' read -r status artist title; do
case "$status" in
Playing) printf '%%{F%s}󰎆%%{F-} %s\n' "$magenta" "$(short "${artist:+$artist - }$title" 40)" ;;
Paused) printf '%%{F%s}󰏤 %s%%{F-}\n' "$dim" "$(short "$title" 30)" ;;
*) echo "" ;;
esac
done
sleep 2
done
}
case "${1:-}" in
net|bt|vol|notif|indicators|media) "$1" ;;
*) echo "usage: rice-status net|bt|vol|notif|indicators|media" >&2; exit 2 ;;
esac