diff --git a/.gitignore b/.gitignore index c6c0d97..7071286 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,11 @@ tmux/resurrect tmux/plugins !tmux/plugins/tpm + bin/water/archive bin/water/*.csv +bin/water/.reminder + bin/weather/.env* *.swp bin/startup/*.json diff --git a/bin/water/water.sh b/bin/water/water.sh index 3701f46..f89f2e9 100755 --- a/bin/water/water.sh +++ b/bin/water/water.sh @@ -1,23 +1,45 @@ #!/usr/bin/env bash # this script enables water tracking in tmux status bar via a simple command + usage() { cat </dev/null + # check elapsed + if [[ $time_unix -gt $REMINDER_SNOOZE ]] ; then + # trigger reminder + goal=$(( ($GOAL_AMT * ($cur_indx + 1)) / ${#GOALS[@]})) + + fmt_time=$(date -d "${GOALS[$cur_indx]}" "+%l:%M %P") + rem_info=$(printf 'You have only drank %d fl. oz. while your goal is to drink %d fl. oz. by %s!\n\nThis reminder will reappear in %d minutes unless you consume fluids!'\ + $CURRENT_WATER $goal "$fmt_time" $(($SNOOZE/60))) + tmux display-popup -E\ + dialog\ + --title 'DEHYDRATION ALERT'\ + --ok-label 'Dismiss'\ + --msgbox \ + "$rem_info" 0 0 + + # update last_reminder + printf 'REMINDER_SNOOZE=%d\n' $(($(date +%s) + $SNOOZE)) > "$WATER_DIR/.reminder" + fi + fi + fi +} + get_current_amt() { # gets the current water intake @@ -36,7 +103,7 @@ get_current_amt() { # no waterfile # archiving old file - mv *.csv ${WATER_DIR}/archive + mv ${WATER_DIR}/*.csv ${WATER_DIR}/archive # creating new file for the day printf 'Time, Change, Running Total\n' > "$WATERFILE" printf '%s, 0, 0\n' "$TIME" >> "$WATERFILE" @@ -44,6 +111,8 @@ get_current_amt() { # waterfile exists CURRENT_WATER=$(cat $WATERFILE | tail -n 1 | awk '{print $3}') fi + + } update_water() { @@ -54,26 +123,42 @@ update_water() { printf '%s, %d, %d\n' "$TIME" $WATER_CHANGE $CURRENT_WATER >> "$WATERFILE" } -undo_change() { - # removes the last entry up to the first +undo_changes() { + # removes specifed entries - if [[ $(wc -l < "$WATERFILE") -gt 2 ]] ; then - # removing last entry - lastentry=$(cat "$WATERFILE" | tail -n 1) - ts=$(echo "$lastentry" | awk -F , '{print $1}') - amt=$(echo "$lastentry" | awk -F , '{print $2}') - prompt=$(printf 'Are you sure you want to remove the %d fl oz added at %s?(y/n)\n' $amt "$ts") - read -p "$prompt" -n 1 -r + # gets the lines of entries + WATER_LINES=$(($(wc -l < "$WATERFILE") - 2)) + if [[ $WATER_LINES -gt 0 ]] ; then + # removing entries + if [[ "$1" == "all" || "$1" == "ALL" ]] ; then + # force a reset + REMOVAL=$WATER_LINES + elif [[ $1 =~ ^[0-9]+$ ]] ; then + # remove $1 changes + REMOVAL=$1 + else + printf 'Arguement %s not recognized\n' "$1" + usage + exit 1 + fi + + choice=$(bash -c "read -p 'Are you sure you want to remove the changes? (y/n)' -n 1 -r c; echo \$c") + echo "" if [[ $REPLY =~ ^[Yy]$ ]] ; then # remove - sed -i '$d' "$WATERFILE" + if [[ $WATER_LINES -gt $REMOVAL ]] ; then + # removing specified lines + last_line=$(($WATER_LINES - $1 + 1)) # account for offset + sed -i "$last_line ,$ d" "$WATERFILE" + else + # essentially a reset + printf 'Time, Change, Running Total\n' > "$WATERFILE" + printf '%s, 0, 0\n' "$TIME" >> "$WATERFILE" + fi fi - echo "" - get_current_amt - else - echo "No changes to undo!" fi + echo "Done!\n" } colorize() { @@ -96,16 +181,45 @@ colorize() { print_water() { # prints total + + # dynamic symbol, uses battery because close enough + # colors blue to avoid mistaking + if [ "$DYN_SYMBOL" = true ] ; then + lvl=$((($CURRENT_WATER * 10) / $GOAL_AMT)) # rounds down to nearst 10% + # base = full + SYM='\uf578' + + if [[ $lvl -eq 0 ]] ; then + SYM='\uf58d' + elif [[ $lvl -lt 9 ]] ; then + # leverage consecutive symbols + + SYM=$(printf 'f5%x' $((120+$lvl))) + SYM=$(echo -e "\u$SYM") + fi + if [ "$COLORIZE" = true ] ; then + clr="#[fg=color21]" + fi + printf '%s%s ' "$clr" "$SYM" + fi + if [ "$COLORIZE" = true ] ; then dflt="#[default]" printf '%s' "$(colorize $CURRENT_WATER)" fi + # static symbol if [ "$SYMBOL" = true ] ; then - printf '%s ' $(echo -e '\uf6aa') + printf '\uf6aa ' fi - + printf '%d%s\n' $CURRENT_WATER "$dflt" + + # checks for a reminder + if [[ "$REMINDER" = true ]] ; then + # reminders enabled + check_reminder + fi } # handle long forms @@ -114,7 +228,7 @@ for arg in "$@"; do case "$arg" in '--help') set -- "$@" "-h" ;; '--colorize') set -- "$@" "-c" ;; - '--reset') set -- "$@" "-r" ;; + '--reminder') set -- "$@" "-r" ;; '--undo') set -- "$@" "-u" ;; '--symbol') set -- "$@" "-s" ;; *) set -- "$@" "$arg" ;; @@ -124,31 +238,40 @@ done get_current_amt # parsing args -while getopts "hcrsu" opt ; do +while getopts "hcrsSuU:" opt ; do case "$opt" in - 'h' ) - usage - exit 0 - ;; 'c' ) COLORIZE=true ;; 's' ) - SYMBOL=true + [ -n "$DYN_SYMBOL" ] && usage 1 || SYMBOL=true + ;; + 'S' ) + [ -n "$SYMBOL" ] && usage 1 || DYN_SYMBOL=true ;; 'u' ) - undo_change + [ -n "$UNDO" ] && usage 1 || UNDO=1 + ;; + 'U' ) + [ -n "$UNDO" ] && usage 1 || UNDO="$optarg" ;; 'r' ) - reset_water + REMINDER=true ;; - '?' ) + 'h' ) usage - exit 1 + ;; + '?' ) + usage 1 >&2 ;; esac done +# perform undo +if [[ ! -z "$UNDO" ]] ; then + undo_changes "$UNDO" +fi + shift $(($OPTIND - 1)) WATER_CHANGE=$1 diff --git a/tmux.conf b/tmux.conf index 879eefd..935b911 100644 --- a/tmux.conf +++ b/tmux.conf @@ -27,7 +27,7 @@ set -g status-interval 10 set -g status-style "bg=black, fg=brightWhite" set -g status-right "#(~/.dotfiles/bin/docker.sh)| #(~/.dotfiles/bin/agent/checker.sh) | #(~/.tmux/plugins/tmux-mem-cpu-load/tmux-mem-cpu-load -p -i 1 -a 1) | #(~/.dotfiles/bin/up.sh) | %A, %b %d %l:%M %P " set -g status-right-length 100 -set -g status-left "#(~/.dotfiles/bin/weather/weather) | #(~/.dotfiles/bin/bluebikes/bb -c) | #(~/.dotfiles/bin/water/water.sh -sc) |" +set -g status-left "#(~/.dotfiles/bin/weather/weather) | #(~/.dotfiles/bin/bluebikes/bb -c) | #(~/.dotfiles/bin/water/water.sh -Scr) |" set -g status-left-length 100 # tmux auto start