#!/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@') 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@') 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_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 | $bat | $time" } if [ "$XDG_SESSION_TYPE" = wayland ]; then DISPLAYCMD=(echo) else DISPLAYCMD=(xsetroot -name) fi # SIGNALING # trap ';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