+#! /bin/bash
+
+set -e
+
+BIN=$HOME/bin
+STATUS_DIR=$HOME/var/run/status
+STATUS_FILE__WIFI=$STATUS_DIR/wifi
+STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF=$STATUS_DIR/notified_energy_bellow_half
+
+#load=$(cat /proc/loadavg | awk '{printf "%4.2f %4.2f %4.2f", $1, $2, $3}')
+
+fan=$(awk '/^speed:/ {printf "%4d", $2}' /proc/acpi/ibm/fan)
+
+cpu=$($BIN/khatus_cpu_usage_from_proc_since_last_check)
+
+memory=$(
+ free \
+ | awk '
+ function round(n) {return int(n + 0.5)}
+
+ $1 == "Mem:" {
+ total=$2;
+ used=$3;
+ cache=$6;
+ file = "/home/siraaj/var/run/status/memory_used_percentage";
+ curr = round(used / total * 100);
+ getline prev < file;
+ print curr > file;
+ if (curr > prev) {
+ direction = ">";
+ } else if (curr < prev) {
+ direction = "<";
+ } else {
+ direction = "=";
+ }
+ printf("%s%d%%", direction, curr);
+ }')
+
+temp=$(awk 'NR == 1 {print $1 / 1000}' /sys/class/thermal/thermal_zone0/temp)
+
+disk=$(
+ df \
+ | awk '
+ function round(n) {return int(n + 0.5)}
+
+ $1 == "/dev/mapper/kubuntu--vg-root" {
+ total = $2;
+ used = $3;
+ file = "/home/siraaj/var/run/status/disk_space_used_percentage";
+ curr = round(used / total * 100);
+ getline prev < file;
+ print curr > file;
+ if (curr > prev) {
+ direction = ">";
+ } else if (curr < prev) {
+ direction = "<";
+ } else {
+ direction = "=";
+ }
+ printf("%s%d%%", direction, curr);
+ }')
+
+energy=$(
+ upower -e \
+ | grep battery \
+ | xargs upower -i \
+ | awk '
+ /^ +percentage: +/ {percentage=$2}
+ /^ +state: +/ {state=$2}
+ END {
+ if (state == "discharging") {
+ direction_of_change = "<"
+ } else if (state == "charging") {
+ direction_of_change = ">"
+ } else {
+ direction_of_change = "="
+ };
+ printf("%s%s", direction_of_change, percentage)
+ }')
+
+datetime=$(date +'%a, %b %d, %H:%M:%S')
+
+#volume_amixer=$(
+# amixer get Master \
+# | tail -1 \
+# | awk '
+# {
+# level = $4;
+# sub("^\\[", "", level);
+# sub("\\]$", "", level);
+# print level;
+# }' \
+# )
+
+#volume_amixer=$(
+# amixer get Master \
+# | tail -n 1 \
+# | awk '{print $4}' \
+# | tr -d '[]'
+#)
+
+volume_pactl=$(
+ pactl list sinks \
+ | awk '
+ /^\tMute:/ {
+ printf("%s,", $0);
+ }
+ /^\tVolume:/ {
+ for (i=2; i<=NF; i++) printf(" %s", $i);
+ }' \
+ | awk -v RS=',' '
+ /^[ \t]*Mute:/ {mute = $2}
+ /^[ \t]*front-left:/ {left = $4}
+ /^[ \t]*front-right:/ {right = $4}
+ END {
+ if (mute == "yes") {
+ printf("x")
+ } else {
+ printf("%s %s", left, right)
+ }
+ }
+ '
+)
+
+volume="[$volume_pactl]"
+
+wifi=$(cat $STATUS_FILE__WIFI)
+
+screen_brightness=$(
+ max=$(cat /sys/class/backlight/acpi_video0/max_brightness)
+ cur=$(cat /sys/class/backlight/acpi_video0/brightness)
+ awk -v max=$max -v cur=$cur 'BEGIN {printf("%d%%", cur/max*100)}'
+)
+
+#bluetooth_status=$(
+# grep '^status:' /proc/acpi/ibm/bluetooth \
+# | awk '
+# $2 == "disabled" {printf "off"}
+# $2 == "enabled" {printf "on"}
+# '
+#)
+
+bluetooth_power=$(
+ echo -e 'show \n quit' \
+ | bluetoothctl \
+ | awk '
+ /^Controller / {
+ controller = $2;
+ controllers[++ctrl_count] = controller;
+ }
+ /^\t[A-Z][A-Za-z]+:/ {
+ key = $1;
+ sub(":$", "", key);
+ val = $2;
+ for (i=3; i<=NF; i++) {
+ val = val " " $i};
+ data[controller, key] = val;
+ }
+ END {
+ # Using the 1st seen controller. Should we select specific instead?
+ power_status = data[controllers[1], "Powered"];
+ if (ctrl_count > 0) {
+ if (power_status == "no") {
+ power_status = "off"
+ } else if (power_status == "yes") {
+ power_status = "on"
+ } else {
+ printf("Unexpected bluetooth power status: %s\n", power_status)\
+ > "/dev/stderr";
+ power_status = "ERROR"
+ }
+ } else {
+ power_status = "off" # TODO: Perhaps use differentiated marker?
+ }
+ printf("%s", power_status);
+ }'
+)
+
+#touchpad_status=$(
+# xinput list-props 12 \
+# | awk '
+# /^\tDevice Enabled \([0-9]+\):/ {
+# status = $4;
+# printf("%s", status);
+# }'
+#)
+
+#color_off='\033[0m'
+#color_on_bg_gray='\033[m\033[40m'
+
+energy_direction=$(echo "$energy" | cut -b 1)
+energy_percentage=$(echo "$energy" | tr -d '<>=%')
+if [[ "$energy_direction" = '<' ]]
+then
+ if [[ $energy_percentage -le 5 ]]
+ then
+ DISPLAY=:0.0 notify-send \
+ -u critical \
+ "Energy CRITICALLY low: $energy" \
+ 'CHARGE NOW!!! GO GO GO!!!'
+ elif [[ $energy_percentage -le 10 ]]
+ then
+ DISPLAY=:0.0 notify-send \
+ -u critical \
+ "Energy VERY low: $energy" \
+ 'Plug it in ASAP.'
+ elif [[ $energy_percentage -le 15 ]]
+ then
+ DISPLAY=:0.0 notify-send \
+ -u critical \
+ "Energy low: $energy" \
+ 'Get the charger.'
+ elif [[ $energy_percentage -le 50 ]]
+ then
+ if [[ ! -a "$STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF" ]]
+ then
+ DISPLAY=:0.0 notify-send \
+ -u normal \
+ "Energy bellow half: $energy" \
+ 'Where is the charger?'
+ touch "$STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF"
+ fi
+ fi
+else
+ rm -f "$STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF"
+fi
+
+weather="$(cat ~/var/run/metar-KJFK-decoded-temp-fahrenheit)°F"
+
+signal_last_msg_age=$(
+ ls -lt --time-style=+%s $HOME/var/lib/signal/latest_message.json \
+ | awk -v now_seconds=$(date +%s) \
+ '{
+ mtime_seconds = $6;
+ seconds = now_seconds - mtime_seconds;
+ minutes = seconds / 60;
+ hours = minutes / 60;
+ days = hours / 24;
+ weeks = days / 7;
+ months = days / 30;
+ #fmt = "%.1f";
+ fmt = "%d";
+ #printf(fmt " s\n", seconds);
+ printf(fmt " m\n", minutes);
+ printf(fmt " h\n", hours);
+ printf(fmt " d\n", days);
+ printf(fmt " w\n", weeks);
+ printf(fmt " mo\n", months);
+ }' \
+ | awk '$1 >= 1' \
+ | sort -n -k 1 \
+ | head -1 \
+ | tr -d ' '
+)
+
+echo \
+"\
+ E$energy\
+ M$memory\
+ D$disk\
+ C=[$cpu ${temp}°C ${fan}rpm]\
+ |\
+ S=$screen_brightness\
+ V=$volume\
+ B:$bluetooth_power\
+ W:$wifi\
+ |\
+ $weather\
+ \
+ $datetime \
+"