dotfiles/.local/bin/sbar
2025-02-17 06:08:25 +00:00

137 lines
3.4 KiB
Bash
Executable File

#!/bin/bash
function update_crypto() {
local c
c="$(crypto 2> /dev/null)" && crypto="$c"
}
function update_cpu() {
cpu="$(awk '{print $1}' /proc/loadavg)"
}
function update_memory() {
memory="$(free -h | awk '/^Mem:/{print $3}')"
}
function update_bat() {
local dir cap
dir='/sys/class/power_supply/BAT0'
cap="$(cat "$dir/capacity")"
if grep -qv Discharging "$dir/status"; then
bat="$cap%"
elif [ "$cap" -gt 80 ]; then bat="$cap%"
elif [ "$cap" -gt 60 ]; then bat="$cap%"
elif [ "$cap" -gt 40 ]; then bat="$cap%"
elif [ "$cap" -gt 20 ]; then bat="$cap%"
else bat="$cap%"
fi
}
function update_sink_vol() {
local vol mute
read -r _ vol mute < <(wpctl get-volume '@DEFAULT_AUDIO_SINK@') || return
vol=$((10#${vol/./}))
if [ -n "$mute" ]; then sink_vol='🔇'
elif [ "$vol" -gt 67 ]; then sink_vol="$vol"
elif [ "$vol" -gt 33 ]; then sink_vol="$vol"
else sink_vol="$vol"
fi
}
function update_source_vol() {
local vol mute
read -r _ vol mute < <(wpctl get-volume '@DEFAULT_AUDIO_SOURCE@') || return
vol=$((10#${vol/./}))
if [ -n "$mute" ]; then source_vol='🔇'
else source_vol="$vol"
fi
}
function update_net() {
local dev j ssid sig
dev="$(ip route | grep -oP 'default.*dev\s+\K[^\s]+')"
j="$(networkctl status "$dev" --json=short)"
case "$(jq -r .Type <<< "$j")" in
ether)
net="🌐 $dev"
;;
wlan)
ssid="$(jq -r .SSID <<< "$j")"
sig="$(awk "/$dev/{printf \"%.0f\", \$3}" /proc/net/wireless)"
if [ "$sig" -gt 56 ]; then net="▂▄▆█ $ssid"
elif [ "$sig" -gt 38 ]; then net="▂▄▆_ $ssid"
elif [ "$sig" -gt 21 ]; then net="▂▄__ $ssid"
elif [ "$sig" -gt 3 ]; then net="▂___ $ssid"
else net="____ $ssid"
fi
;;
*)
net='⚠'
;;
esac
}
function update_vpn() {
local v; v="$(ip -br link show type wireguard | awk '{print $1}')"
if [ -n "$v" ]; then vpn=" 🔒 $v"
else vpn=
fi
}
function update_time() {
time="$(TZ=Asia/Makassar date '+%R %Z') - $(date -u '+%a %m-%d %R')"
}
function reload() {
sec=0
}
function display() {
"${DISPLAYCMD[@]}" "$crypto | $cpu | $memory | $sink_vol $source_vol | $net$vpn | $bat | $time"
}
if [ "$XDG_SESSION_TYPE" = wayland ]; then
DISPLAYCMD=(echo)
else
DISPLAYCMD=(xsetroot -name)
fi
# SIGNALING
# trap '<function>;display;wait' 'RTMIN+n'
trap 'reload' 'RTMIN'
trap 'update_sink_vol;display;wait' 'RTMIN+1'
trap 'update_source_vol;display;wait' 'RTMIN+2'
trap 'update_net;display;wait' 'RTMIN+3'
trap 'update_vpn;display;wait' 'RTMIN+4'
# to update it from external commands
## kill -m "$(cat "$XDG_CACHE_HOME/pidofbar")"
# where m = 34 + n
echo "$$" > "$XDG_CACHE_HOME/pidofbar"
sec=0
while true; do
if [ $((sec % 300)) -eq 5 ]; then
update_crypto
fi
if [ $((sec % 5)) -eq 0 ]; then
update_cpu
update_memory
update_sink_vol
update_source_vol
update_net
update_vpn
update_bat
update_time
display
fi
((sec += 5))
sleep $((5 - 10#$(date '+%S') % 5)) & wait
done