reworked water script to add filling bottle and a pop up in tmux
This commit is contained in:
parent
8a61bf7af2
commit
2232aa2108
3
.gitignore
vendored
3
.gitignore
vendored
@ -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
|
||||
|
@ -1,23 +1,45 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# this script enables water tracking in tmux status bar via a simple command
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
usage: $0 [-c|r|s|u|h] [WATER]
|
||||
usage: $0 [-chr][-s|S][-u|U QTY] [WATER]
|
||||
|
||||
Options:
|
||||
-c, --colorize enables tmux color options
|
||||
-s, --symbol enables nerdfont compaitable symbol
|
||||
-r, --reset reset the days water to 0
|
||||
-s, --symbol enables static nerdfont compaitable symbol
|
||||
-S enables dynamic nf symbol
|
||||
-u, --undo removes the last entry
|
||||
can be done repeatedly
|
||||
-U removes the last QTY entries.
|
||||
use all as QTY to remove all entries
|
||||
-r, --reminder creates a tmux pop up to remind you to hydrate
|
||||
-h, --help display this message
|
||||
|
||||
The reminder works based on specified water goals
|
||||
Defaults to 32 ounces by 10 am, 64 by 1 pm, 96 by 5 pm, and 128 by 8 pm
|
||||
Goals are defined in the script itself.
|
||||
If a sub goal is not reached, the reminder will trigger
|
||||
Reminders have a dismiss option as well as an entry box to enter the water drank
|
||||
Reminders will pop up every 30 minutes until the goal is reached
|
||||
|
||||
The WATER arguement is an integer and will be added to the current total.
|
||||
If a mistake is made, -u can remove the faulty entry.
|
||||
EOF
|
||||
exit $1
|
||||
}
|
||||
|
||||
# Hydration thresholds for reminders, all in fl. oz.
|
||||
# Triggers reminder if you aren't at GOAL#/INTAKE by the assocaited time
|
||||
# so in this example, if I don't drink 32 ounces by 10 am, I will get an alert
|
||||
# 64 ounces by 1 pm, etc.
|
||||
|
||||
####################################
|
||||
GOAL_AMT=128
|
||||
GOALS=( "10:00" "13:00" "16:00" "20:00" )
|
||||
SNOOZE=$((30 * 60)) # time between reminders (s)
|
||||
####################################
|
||||
|
||||
DATE=$(date +%b_%d_%y)
|
||||
TIME=$(date +%H:%M:%S)
|
||||
|
||||
@ -29,6 +51,51 @@ if [[ ! -d "${WATER_DIR}/archive" ]] ; then
|
||||
mkdir -p "${WATER_DIR}/archive"
|
||||
fi
|
||||
|
||||
check_reminder() {
|
||||
# checks for reminder
|
||||
# uses tmux to push reminder
|
||||
|
||||
if [[ -z "$TMUX" ]] ; then
|
||||
echo "TMUX required for reminder!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# this will round up
|
||||
goal_incr=$((($GOAL_AMT + ${#GOALS[@]}-1) / ${#GOALS[@]}))
|
||||
|
||||
# based on water drank, time to check
|
||||
cur_indx=$(($CURRENT_WATER / $goal_incr))
|
||||
|
||||
if [[ $CURRENT_WATER -lt $GOAL_AMT ]] ; then
|
||||
# goals not finished, check pace
|
||||
time_unix=$(date -d "$TIME" +%s)
|
||||
expired=$(( $(date -d "${GOALS[$cur_indx]}" +%s) - $time_unix))
|
||||
|
||||
if [[ $expired -lt 0 ]] ; then
|
||||
# goal missed, check snooze
|
||||
source "$WATER_DIR/.reminder" 2>/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
|
||||
;;
|
||||
'?' )
|
||||
usage
|
||||
exit 1
|
||||
usage 1 >&2
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# perform undo
|
||||
if [[ ! -z "$UNDO" ]] ; then
|
||||
undo_changes "$UNDO"
|
||||
fi
|
||||
|
||||
shift $(($OPTIND - 1))
|
||||
|
||||
WATER_CHANGE=$1
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user