#!/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 ';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