dotfiles/.local/bin/sbar
2024-10-22 17:00:36 +07:00

126 lines
3.3 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")"
{ grep -qv Discharging "$dir/status" && bat="$cap%"; } ||
{ [ "$cap" -gt 80 ] && bat="$cap%"; } ||
{ [ "$cap" -gt 60 ] && bat="$cap%"; } ||
{ [ "$cap" -gt 40 ] && bat="$cap%"; } ||
{ [ "$cap" -gt 20 ] && bat="$cap%"; } ||
{ bat="$cap%"; }
}
function update_sink_vol() {
local sink vol
sink="$(wpctl get-volume '@DEFAULT_AUDIO_SINK@')"
if grep -q MUTED <<< "$sink"; then
sink_vol='🔇'
return
fi
vol="$(awk '{printf "%.0f", $2 * 100}' <<< "$sink")"
{ [ "$vol" -gt 67 ] && sink_vol="$vol"; } ||
{ [ "$vol" -gt 33 ] && sink_vol="$vol"; } ||
{ sink_vol="$vol"; }
}
function update_source_vol() {
local source vol
source="$(wpctl get-volume '@DEFAULT_AUDIO_SOURCE@')"
if grep -q MUTED <<< "$source"; then
source_vol=''
return
fi
source_vol="$(awk '{printf "%.0f", $2 * 100}' <<< "$source")"
}
function update_net() {
local dev j ssid sig
dev="$(ip route show default | sed -n 's/.*dev\s\+\(\w\+\).*/\1/p;q')"
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)"
{ [ "$sig" -gt 56 ] && net="▂▄▆█ $ssid"; } ||
{ [ "$sig" -gt 38 ] && net="▂▄▆_ $ssid"; } ||
{ [ "$sig" -gt 21 ] && net="▂▄__ $ssid"; } ||
{ [ "$sig" -gt 3 ] && net="▂___ $ssid"; } ||
{ net="____ $ssid"; }
;;
*)
net='⚠'
;;
esac
}
function update_time() {
time="$(date '+%a %m-%d %R')"
}
function reload() {
sec=0
}
function display() {
"${DISPLAYCMD[@]}" "$crypto | $cpu | $memory | $sink_vol $source_vol | $net | $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'
# to update it from external commands
## kill -m "$(cat ~/.cache/pidofbar)"
# where m = 34 + n
echo "$$" > "$HOME/.cache/pidofbar"
sec=0
while true; do
[ "$((sec % 300))" -eq 5 ] && update_crypto
[ "$((sec % 5))" -eq 0 ] && {
update_cpu
update_memory
update_sink_vol
update_source_vol
update_net
update_bat
update_time
display
}
((sec += 5))
awk "@load \"time\"; BEGIN {d=5; s=$(date '+%S.%N'); sleep(d - s % d)}" &
wait
done