# 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
-shopt -s nullglob
-for p in ~/.gem/ruby/*/bin; do
- PATH="$PATH:$p"
-done
-
-todaycache=/tmp/timetraptoday
-newer() {
- if [[ ! -e $todaycache ]]; then
- return 1
- fi
- ! find $todaycache -mmin $1 -type f -exec false {} + &>/dev/null
-}
-td() { /a/opt/timetrap/bin/t d -ftotal all -m '^w|x$' "$@"; }
+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() {
- ps_char=
- if [[ -e /dev/shm/iank-status ]]; then
- eval $(< /dev/shm/iank-status)
+ ## 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
- # clocked in or out?
- cursheet=$(sqlite3 /p/.timetrap.db "select sheet from entries where end is NULL;")
+ 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 '"},'
- if [[ $cursheet ]]; then
- if i3-msg -t get_bar_config bar-0 | grep '"mode":"dock"' &>/dev/null; then
- i3-msg -q 'bar mode hide'
+
+ # 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
- else
- if i3-msg -t get_bar_config bar-0 | grep '"mode":"hide"' &>/dev/null; then
- i3-msg -q 'bar mode dock'
+ i_end=$(( time % 60 / 3 + 1 ))
+ if (( i_end - i > 15 )); then
+ printf " "
+ elif (( i < i_end )); then
+ printf ▉
+ else
+ printf " "
fi
- cursheet=out
- fi
+ done
+ printf '"},'
- # maybe sometime show work and x separate
- if newer 3; then
- today=$(< /tmp/timetraptoday)
- elif newer 10; then
- today=$(< /tmp/timetraptoday)
- td -s today >/tmp/timetraptoday &
- else
- today=$(td -s today)
- echo "$today" >/tmp/timetraptoday
- fi
+ ## begin day percent, in thousandths, plus a spark block for ten_thousandth.
+ printf '{ "name": "day_percent", "full_text": "'
- # hours remaining in the day:
-
- # work+study in the last week, not counting today.
- # no arg to printf for the intentional behavior of no arg
- # shellcheck disable=SC2183
- cache=/tmp/timetrap$(printf '%(%F)T')
- if [[ -e $cache ]]; then
- eval $(<$cache)
- else
- week=$(td -s '8 days ago' -e 'yesterday')
- printf 'week="%s"\n' "$week" >$cache
- week4=$(td -s '29 days ago' -e 'yesterday')
- printf 'week4="%s"\n' "$week4" >>$cache
- fi
- # weekly work+study in the last 4 weeks, not counting today.
- # todo later:
- # 4 weeks
- # ($x4week + $w4week + .05) /4
- #weekly work+study in the last 16 weeks, not counting today.
- #weekly work+study in the last 52 weeks, not counting today.
-
- unixtime=$EPOCHSECONDS
- midnight=$(date +%s -d 'tomorrow 00:00')
- tmp=($(echo "scale=1; today_left=($midnight-$unixtime) / 60 / 60;
-today_left;
-done_today=($today + .05) /1;
-/* hours I could do today by working 80% of the remainder time */
-today_left * .8 + done_today;
-done_today;
-($week + .05) /1;
-($week4 + .05) /4"|bc))
- printf "[ { \"full_text\": \""
- if [[ $ps_char ]]; then
- printf "%s| " "$ps_char"
+
+ # 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
- printf "%s | left today %s %s | today %s | week %s | 4weeks %s | %s\" } ],\n" "$cursheet" "${tmp[@]}" "$(date "+%A, %B %d, %r")"
+
+ 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
+
+# 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 }\n['
+ printf '{ "version": 1, "click_events": true }\n['
while true; do
main
- sleep 5
+ line=
+ read -r -t 3 line ||:
done
fi