about summary refs log tree commit diff
path: root/sh/sbar_mullvad_status
diff options
context:
space:
mode:
Diffstat (limited to 'sh/sbar_mullvad_status')
-rwxr-xr-xsh/sbar_mullvad_status112
1 files changed, 112 insertions, 0 deletions
diff --git a/sh/sbar_mullvad_status b/sh/sbar_mullvad_status
new file mode 100755
index 0000000..0a80dd4
--- /dev/null
+++ b/sh/sbar_mullvad_status
@@ -0,0 +1,112 @@
+#!/bin/sh
+# steal from pystardust, GPL3 license: https://github.com/pystardust/sbar
+# modified to fit my own need
+
+# INIT
+pid_file="$XDG_CACHE_HOME/pidofbar"
+vpn_fifo="$XDG_CACHE_HOME/sbar_vpn_fifo"
+sec=0
+
+# exit if sbar is already running, fix when startx in another tty, the other tty sbar not working
+# maybe try dwmblocks's approach of using `kill $(pidof -x sbar)`, so can run different sbar in different tty
+# but then vpn_fifo becomes a problem too, not sure how to solve
+if ! [ -e "$pid_file" ] || ! pidof -qsx sbar -o "$$"; then
+	printf '%s' "$$" > "$pid_file"
+else
+	exit
+fi
+if ! [ -e "$vpn_fifo" ]; then
+	mkfifo "$vpn_fifo"
+elif ! [ -p "$vpn_fifo" ]; then
+	exit 1
+fi
+
+bool () {
+	read str
+	if [ "$str" = "on" ] || [ "$str" = "up" ] || [ "$str" = "Connected" ]; then
+		echo 1
+	else
+		echo 0
+	fi
+}
+
+# MODULES
+update_time () { 
+	time="$(date '+%a %m/%d %H:%M') $(TZ=Asia/Shanghai date '+/%d %H:')"
+}
+
+update_cap () { 
+	cap="$(if xset q | grep -q "Caps Lock: *on"; then echo A; else echo a; fi)"
+}
+
+update_net () { 
+	net="$(bool < /sys/class/net/wlp6s0/operstate)"
+}
+
+update_vpn () {
+	vpn="$(awk '{print $3}' "$vpn_fifo" | bool)"
+}
+
+update_vol () { 
+	# $(NF-1) for both alsa and pulseaudio
+	vol="$(amixer get Master | awk -F'[][]' 'END{printf("%d %s",($(NF-1)=="on")?1:0,$2)}')"
+}
+
+update_mic () { 
+	# $(NF-1) for both alsa and pulseaudio
+	mic="$(amixer get Capture | awk -F'[][]' 'END{print $(NF-1)}' | bool)"
+}
+
+update_bat () { 
+	bat="$(cat /sys/class/power_supply/BAT1/capacity)%"
+}
+
+# For calcurse users, refer https://github.com/pystardust/automeet
+#update_event () { 
+#	event="$(calcurse -n | sed 1d | \
+#		sed -E "s_^ *\[(.*):(.*)\] ([^\t]*)\t?.*_[\1h \2m->\3]_")" 
+#	[ "[]" = "$event" ] && event=""
+#}
+
+display () {
+	xsetroot -name "$time | N $net V $vpn | M $vol C $mic | $cap | $bat"
+}
+
+# modules that don't update on their own need to be run at the start for getting their initial value
+update_vol
+update_mic
+
+# SIGNALLING
+# trap	"<function>;display"	"RTMIN+n"
+trap	"update_mic;display" 	"RTMIN"
+trap	"update_vol;display"	"RTMIN+1"
+# xev can't read my toggle internet keyboard key, don't know what key to use in sxhkd to send signal
+#trap	"update_net;display"	"RTMIN+2"
+trap	"update_cap;display"	"RTMIN+3"
+trap	"update_vpn;display"	"RTMIN+4"
+# to update it from external commands
+## kill -m "$(cat "$XDG_CACHE_HOME/pidofbar")"
+# where m = 34 + n
+
+# `mullvad status` write logs everytime it is called
+# so I use `mullvad status listen`, this implementation is kinda bloat, maybe there's better way
+# should be put after trap?
+sh -c '
+	mullvad status listen | while read -r line; do
+		kill -RTMIN+4 "$(cat "$1")"
+		echo "$line" > "$2"
+	done &
+' shell "$pid_file" "$vpn_fifo"
+
+while :; do
+	sleep 1 &
+	wait
+	[ $((sec % 5 )) -eq 0 ] && update_time 	# update time every 5 seconds
+	[ $((sec % 5 )) -eq 0 ] && update_net
+	update_cap
+	[ $((sec % 60)) -eq 0 ] && update_bat
+	#[ $((sec % 300)) -eq 1 ] && update_event
+	# how often the display updates ( 5 seconds )
+	[ $((sec % 5 )) -eq 0 ] && display
+	sec=$((sec + 1))
+done