#!/bin/bash # Copyright (C) 2019 Ian Kelling # SPDX-License-Identifier: AGPL-3.0-or-later # usage: # * left click seconds to reset main timer # * right click seconds to disable minutes & half hours of main timer # * left click minutes to reset 2nd timer. # * right click minutes to disable 2nd timer if [ -z "$BASH_VERSION" ]; then echo "error: shell is not bash" >&2; exit 1; fi source /a/bin/errhandle/err shopt -s nullglob shopt -s dotglob mins=0 half_hours=0 fast_blocks=30 start=$EPOCHSECONDS domins=true day_tmp=$(cat /b/data/daystart) day_start_hour=${day_tmp%??} day_start_min=${day_tmp: -2} echo $day_start_hour > /b/data/daystart-generated echo $day_start_min >> /b/data/daystart-generated day_start=$(date -d $day_start_hour:$day_start_min +%s) # for after midnight but before the day start. if (( day_start > EPOCHSECONDS )); then day_start=$(date -d "$day_start_hour:$day_start_min yesterday" +%s) fi main() { ## debug # if [[ $line ]]; then # echo "line=$line" >>/tmp/t # fi case $line in ""|"[") : ;; *) json="${line#,}" case $(echo "$json" | jq -r .name) in seconds) case $(echo "$json" | jq -r .button) in 1) start=$EPOCHSECONDS domins=true ;; 3) domins=false ;; esac ;; mins) case $(echo "$json" | jq -r .button) in 1) start2=$EPOCHSECONDS ;; 3) start2= ;; esac ;; esac esac time=$((EPOCHSECONDS - start)) total_mins=$(( time / 60 )) mins=$(( total_mins % 30 )) half_hours=$(( total_mins / 30 )) printf '[' if [[ $start2 ]]; then time2=$((EPOCHSECONDS - start2)) total_mins2=$(( time2 / 60 )) mins2=$(( total_mins2 % 30 )) half_hours2=$(( total_mins2 / 30 )) # this is duplicate of mins and half hours except for different # colors and looking at vars above. # begin half hours printf '{ "color": "#EFC93E", "full_text": "' for ((i=half_hours2-1; i >= 0 ; i--)); do printf ▉ if (( i > 0 && i % 2 == 0 )); then printf " " fi done printf '"},' # begin minutes printf '{ "name":"mins2", "color":"#ED297D", "full_text": "' for ((i=29; i >= 0 ; i--)); do if (( i < mins2 )); then printf ▉ else printf " " fi if (( i > 0 && i % 5 == 0 )); then printf " " fi done printf '"},' fi if $domins; then # begin half hours printf '{ "color": "#FFB542", "full_text": "' for ((i=half_hours-1; i >= 0 ; i--)); do printf ▉ if (( i > 0 && i % 2 == 0 )); then printf " " fi done printf '"},' # begin minutes printf '{ "name":"mins", "color":"#0D6BDD", "full_text": "' for ((i=29; i >= 0 ; i--)); do if (( i < mins )); then printf ▉ else printf " " fi if (( i > 0 && i % 5 == 0 )); then printf " " fi done printf '"},' fi # begin seconds printf '{ "name": "seconds", "full_text": "' for ((i=0; i < 20; i++)); do # This first condition is to make the transition from full to empty # be less jarring. We are filling a bucket of space with ticks of # time, we would have to choose to show full or empty, but never # both. Or we could have a half/tick to show full then empty real # quick. I decided to try having it work like a snake, empty out the # 1st quarter as we fill up the last quarter. if (( i > 0 && i % 5 == 0 )); then printf " " fi i_end=$(( time % 60 / 3 + 1 )) if (( i_end - i > 15 )); then printf " " elif (( i < i_end )); then printf ▉ else printf " " fi done printf '"},' ## begin day percent, in thousandths, plus a spark block for ten_thousandth. printf '{ "name": "day_percent", "full_text": "' # after 24 hours, reset the day start if (( day_start + 24 * 60 * 60 < EPOCHSECONDS )); then day_start=$(date -d $day_start_hour:$day_start_min +%s) fi spark_index="$(( (100000 -($EPOCHSECONDS - $day_start)*100000 / (16*60*60) ) % 100 / 11 ))" spark=" ▁▂▃▄▅▆▇█" # note: 960 minutes, so 10 minutes is about 1% day_thousandth=$(( 1000 - (EPOCHSECONDS - day_start)*1000 / (16*60*60) )) printf %s "$day_thousandth${spark:spark_index:1} $(date "+%l:%M")" # .1% of a waking year is ~5.75 hours, or 365 thousandths of a day. # 1% of a waking year is 3.7 days # A spark line of a thousandth of a waking year is 39 minutes. year_start=$(date +%s -d 'january 1 6am') year_days=$(( (EPOCHSECONDS - year_start) / (24*60*60) )) year_start=$(( year_start + year_days * 8*60*60 )) year_spark_index=$(( ( 100000 - (EPOCHSECONDS - year_start)*100000 / (365*16*60*60) ) % 100 / 11 )) year_tenthousandth=$(( 10000 - (EPOCHSECONDS - year_start)*10000 / (365*16*60*60) )) printf %s " $year_tenthousandth${spark:year_spark_index:1}" echo '"} ], ' } # pass any arg and we just run once. mainly for debugging if (( $# )); then main # debug #echo date -d $day_start_hour:$day_start_min +%s #echo day_start=$day_start now=$EPOCHSECONDS else printf '{ "version": 1, "click_events": true }\n[' while true; do main line= read -r -t 3 line ||: done fi