moved from dotfiles
This commit is contained in:
commit
1fbec25996
0
.gitignore
vendored
Normal file
0
.gitignore
vendored
Normal file
3
Jan_13_23.csv
Normal file
3
Jan_13_23.csv
Normal file
@ -0,0 +1,3 @@
|
||||
Time, Change, Running Total
|
||||
13:02:53, 0, 0
|
||||
13:03:30, 32, 32
|
|
2
archive/Jan_11_23.csv
Normal file
2
archive/Jan_11_23.csv
Normal file
@ -0,0 +1,2 @@
|
||||
Time, Change, Running Total
|
||||
16:04:25, 0, 0
|
|
4
archive/Jan_12_23.csv
Normal file
4
archive/Jan_12_23.csv
Normal file
@ -0,0 +1,4 @@
|
||||
Time, Change, Running Total
|
||||
10:36:16, 0, 0
|
||||
13:31:58, 32, 32
|
||||
16:17:41, 32, 64
|
|
2
archive/Jan_13_23.csv
Normal file
2
archive/Jan_13_23.csv
Normal file
@ -0,0 +1,2 @@
|
||||
Time, Change, Running Total
|
||||
11:41:16, 0, 0
|
|
1
archive/test_archive/01-06
Normal file
1
archive/test_archive/01-06
Normal file
@ -0,0 +1 @@
|
||||
14:48:42: 0
|
1
archive/test_archive/01-09
Normal file
1
archive/test_archive/01-09
Normal file
@ -0,0 +1 @@
|
||||
12:43:47: 0
|
1
archive/test_archive/01-10
Normal file
1
archive/test_archive/01-10
Normal file
@ -0,0 +1 @@
|
||||
10:46:21: 0
|
1
archive/test_archive/01-11
Normal file
1
archive/test_archive/01-11
Normal file
@ -0,0 +1 @@
|
||||
11:34:07: 0
|
1
archive/test_archive/10-12
Normal file
1
archive/test_archive/10-12
Normal file
@ -0,0 +1 @@
|
||||
09:48:45: 0
|
1
archive/test_archive/10-16
Normal file
1
archive/test_archive/10-16
Normal file
@ -0,0 +1 @@
|
||||
15:12:03: 0
|
1
archive/test_archive/10-17
Normal file
1
archive/test_archive/10-17
Normal file
@ -0,0 +1 @@
|
||||
11:09:29: 0
|
1
archive/test_archive/10-19
Normal file
1
archive/test_archive/10-19
Normal file
@ -0,0 +1 @@
|
||||
13:34:58: 0
|
1
archive/test_archive/10-26
Normal file
1
archive/test_archive/10-26
Normal file
@ -0,0 +1 @@
|
||||
14:45:14: 0
|
1
archive/test_archive/10-27
Normal file
1
archive/test_archive/10-27
Normal file
@ -0,0 +1 @@
|
||||
19:43:32: 0
|
1
archive/test_archive/11-02
Normal file
1
archive/test_archive/11-02
Normal file
@ -0,0 +1 @@
|
||||
13:25:32: 0
|
1
archive/test_archive/11-03
Normal file
1
archive/test_archive/11-03
Normal file
@ -0,0 +1 @@
|
||||
14:25:37: 0
|
1
archive/test_archive/11-17
Normal file
1
archive/test_archive/11-17
Normal file
@ -0,0 +1 @@
|
||||
15:14:26: 0
|
1
archive/test_archive/11-18
Normal file
1
archive/test_archive/11-18
Normal file
@ -0,0 +1 @@
|
||||
17:04:05: 0
|
1
archive/test_archive/11-20
Normal file
1
archive/test_archive/11-20
Normal file
@ -0,0 +1 @@
|
||||
15:58:36: 0
|
1
archive/test_archive/11-21
Normal file
1
archive/test_archive/11-21
Normal file
@ -0,0 +1 @@
|
||||
15:11:15: 0
|
1
archive/test_archive/11-28
Normal file
1
archive/test_archive/11-28
Normal file
@ -0,0 +1 @@
|
||||
13:18:08: 0
|
1
archive/test_archive/11-29
Normal file
1
archive/test_archive/11-29
Normal file
@ -0,0 +1 @@
|
||||
13:46:08: 0
|
1
archive/test_archive/11-30
Normal file
1
archive/test_archive/11-30
Normal file
@ -0,0 +1 @@
|
||||
15:21:34: 0
|
1
archive/test_archive/12-01
Normal file
1
archive/test_archive/12-01
Normal file
@ -0,0 +1 @@
|
||||
13:38:08: 0
|
1
archive/test_archive/12-02
Normal file
1
archive/test_archive/12-02
Normal file
@ -0,0 +1 @@
|
||||
17:23:39: 0
|
1
archive/test_archive/12-05
Normal file
1
archive/test_archive/12-05
Normal file
@ -0,0 +1 @@
|
||||
15:03:18: 0
|
1
archive/test_archive/12-06
Normal file
1
archive/test_archive/12-06
Normal file
@ -0,0 +1 @@
|
||||
16:31:28: 0
|
1
archive/test_archive/12-07
Normal file
1
archive/test_archive/12-07
Normal file
@ -0,0 +1 @@
|
||||
15:48:24: 0
|
1
archive/test_archive/12-08
Normal file
1
archive/test_archive/12-08
Normal file
@ -0,0 +1 @@
|
||||
11:13:31: 0
|
1
archive/test_archive/12-09
Normal file
1
archive/test_archive/12-09
Normal file
@ -0,0 +1 @@
|
||||
11:57:37: 0
|
324
water.sh
Executable file
324
water.sh
Executable file
@ -0,0 +1,324 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# this script enables water tracking in tmux status bar via a simple command
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
usage: $0 [-chr][-s|S][-u|U QTY] [WATER]
|
||||
|
||||
Options:
|
||||
-c, --colorize enables tmux color options
|
||||
-s, --symbol enables static nerdfont compaitable symbol
|
||||
-S enables dynamic nf symbol
|
||||
-u, --undo removes the last entry
|
||||
-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
|
||||
}
|
||||
|
||||
DATE=$(date +%b_%d_%y)
|
||||
TIME=$(date +%H:%M:%S)
|
||||
|
||||
WATER_DIR="$HOME/.dotfiles/bin/water"
|
||||
WATERFILE="${WATER_DIR}/${DATE}.csv" # makes it easy to reset on each new day
|
||||
|
||||
|
||||
# customize goal amt and timings.
|
||||
# checks based on current input and then cross references with goals
|
||||
# linear calc so in this example 32 by 10, 64 by 13 etc.
|
||||
####################################
|
||||
GOAL_AMT=128 # fl. oz.
|
||||
GOALS=( "10:00" "13:00" "16:00" "20:00" )
|
||||
SNOOZE=30 # time between reminders (minutes)
|
||||
####################################
|
||||
|
||||
# Colors
|
||||
RED='#[fg=color1]'
|
||||
YELLOW='#[fg=color3]'
|
||||
LIGHT_YELLOW='#[fg=color226]'
|
||||
LIGHT_GREEN='#[fg=color112]'
|
||||
GREEN='#[fg=color21]'
|
||||
BLUE='#[fg=color33]'
|
||||
|
||||
# Symbols to use
|
||||
STATIC_SYMBOL='\uf6aa'
|
||||
# from empty -> full
|
||||
DYNAMIC_SYMBOL=( '\uf58d' '\uf579' '\uf57a' '\uf57b' '\uf57c' '\uf57d' '\uf57e' '\uf57f' '\uf580' '\uf581' '\uf578' )
|
||||
|
||||
get_current_amt() {
|
||||
# gets the current water intake
|
||||
|
||||
if [[ ! -f "$WATERFILE" ]] ; then
|
||||
# no waterfile
|
||||
|
||||
# archiving old file
|
||||
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"
|
||||
else
|
||||
# waterfile exists
|
||||
CURRENT_WATER=$(cat $WATERFILE | tail -n 1 | awk '{print $3}')
|
||||
fi
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
reminder() {
|
||||
# checks and creates a reminder
|
||||
|
||||
if [[ -z "$TMUX" ]] ; then
|
||||
echo "TMUX required for reminder!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# this will round up
|
||||
goal_incr=$((($GOAL_AMT + ${#GOALS[@]}-1) / ${#GOALS[@]}))
|
||||
|
||||
# index of the time to check in $GOALS
|
||||
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 is goaltime - current time
|
||||
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!\n\nOptionally, mute this reminder until tomorrow' $CURRENT_WATER $goal "$fmt_time" $SNOOZE)
|
||||
tmux display-popup -E\
|
||||
dialog\
|
||||
--title 'DEHYDRATION ALERT'\
|
||||
--yes-label 'Dismiss'\
|
||||
--no-label 'Mute'\
|
||||
--yesno \
|
||||
"$rem_info" 0 0
|
||||
|
||||
# check for mute
|
||||
if [[ $? == 1 ]] ; then
|
||||
# muted until tomorrow
|
||||
TTS=$(date -d "tomorrow 00:00:00" +%s)
|
||||
else
|
||||
TTS=$(date -d "+ $SNOOZE minutes" +%s)
|
||||
fi
|
||||
|
||||
# update last_reminder
|
||||
printf 'REMINDER_SNOOZE=%d\n' $TTS > "$WATER_DIR/.reminder"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
update_water() {
|
||||
# updates water based on $WATER_CHANGE
|
||||
|
||||
CURRENT_WATER=$(($CURRENT_WATER + $WATER_CHANGE))
|
||||
|
||||
# putting in file
|
||||
printf '%s, %d, %d\n' "$TIME" $WATER_CHANGE $CURRENT_WATER >> "$WATERFILE"
|
||||
}
|
||||
|
||||
undo_changes() {
|
||||
# removes specifed entries
|
||||
|
||||
# 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
|
||||
if [[ $1 -gt $WATER_LINES ]] ; then
|
||||
printf 'Only %d entries\n' $WATER_LINES
|
||||
REMOVAL=$WATER_LINES
|
||||
else
|
||||
REMOVAL=$1
|
||||
fi
|
||||
else
|
||||
printf 'Arguement %s not recognized\n' "$1"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
choice=$(bash -c "read -p 'Are you sure you want to remove $REMOVAL entries? (y/n)' -n 1 -r c; echo \$c")
|
||||
echo ""
|
||||
|
||||
if [[ $choice =~ ^[Yy]$ ]] ; then
|
||||
# remove
|
||||
if [[ $WATER_LINES -gt $REMOVAL ]] ; then
|
||||
# removing specified lines
|
||||
last_line=$(($WATER_LINES - $REMOVAL + 3)) # 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
|
||||
|
||||
# updating amount
|
||||
get_current_amt
|
||||
fi
|
||||
echo "Removed $REMOVAL entries!"
|
||||
else
|
||||
echo "Nothing to remove!"
|
||||
fi
|
||||
}
|
||||
|
||||
colorize() {
|
||||
# sends water intake level through conditionals to be colorized
|
||||
|
||||
if [[ $1 -lt 32 ]] ; then
|
||||
color="$RED"
|
||||
elif [[ $1 -lt 64 ]] ; then
|
||||
color="$YELLOW"
|
||||
elif [[ $1 -lt 96 ]] ; then
|
||||
color="$LIGHT_YELLOW"
|
||||
elif [[ $1 -lt 128 ]] ; then
|
||||
color="$LIGHT_GREEN"
|
||||
else
|
||||
color="$GREEN"
|
||||
fi
|
||||
|
||||
# avoids newlines
|
||||
printf '%s' "$color"
|
||||
}
|
||||
|
||||
print_water() {
|
||||
# formats and prints $CURRENT_WATER
|
||||
|
||||
if [ "$SYMBOL" == "dynamic" ] ; then
|
||||
# getting dynamic symbol
|
||||
|
||||
# rounding down
|
||||
symb_indx=$(echo "scale=1; indx=($CURRENT_WATER / $GOAL_AMT) * ${#DYNAMIC_SYMBOL[@]}; scale=0; indx/1" | bc)
|
||||
|
||||
if [[ $symb_indx -ge ${#DYNAMIC_SYMBOL[@]} ]] ; then
|
||||
# trimming
|
||||
symb_indx=$((${#DYNAMIC_SYMBOL[@]}-1))
|
||||
fi
|
||||
|
||||
# if colors are enabled, colorize the symbol
|
||||
if [ "$COLORIZE" = true ] ; then
|
||||
clr="$BLUE"
|
||||
fi
|
||||
printf '%s%s ' "$clr" $(echo -e "${DYNAMIC_SYMBOL[$symb_indx]}")
|
||||
|
||||
elif [[ "$SYMBOL" == "static" ]] ; then
|
||||
# space for double wide
|
||||
|
||||
printf '%s ' "$STATIC_SYMBOL"
|
||||
fi
|
||||
|
||||
if [ "$COLORIZE" = true ] ; then
|
||||
dflt="#[default]"
|
||||
printf '%s' "$(colorize $CURRENT_WATER)"
|
||||
fi
|
||||
|
||||
printf '%d%s\n' $CURRENT_WATER "$dflt"
|
||||
|
||||
# checks for a reminder
|
||||
if [[ "$REMINDER" = true ]] ; then
|
||||
# reminders enabled
|
||||
reminder
|
||||
fi
|
||||
}
|
||||
|
||||
# make dir on fresh installs
|
||||
if [[ ! -d "${WATER_DIR}/archive" ]] ; then
|
||||
mkdir -p "${WATER_DIR}/archive"
|
||||
fi
|
||||
|
||||
# get the current amount
|
||||
get_current_amt
|
||||
|
||||
# transform long form args
|
||||
for arg in "$@"; do
|
||||
shift
|
||||
case "$arg" in
|
||||
'--help') set -- "$@" "-h" ;;
|
||||
'--colorize') set -- "$@" "-c" ;;
|
||||
'--reminder') set -- "$@" "-r" ;;
|
||||
'--undo') set -- "$@" "-u" ;;
|
||||
'--symbol') set -- "$@" "-s" ;;
|
||||
*) set -- "$@" "$arg" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# parsing args
|
||||
while getopts "hcrsSuU:" opt ; do
|
||||
case "$opt" in
|
||||
'c' )
|
||||
COLORIZE=true
|
||||
;;
|
||||
's' )
|
||||
[ -n "$SYMBOL" ] && usage 1 || SYMBOL="static"
|
||||
;;
|
||||
'S' )
|
||||
[ -n "$SYMBOL" ] && usage 1 || SYMBOL="dynamic"
|
||||
;;
|
||||
'u' )
|
||||
[ -n "$UNDO" ] && usage 1 || UNDO=1
|
||||
;;
|
||||
'U' )
|
||||
[ -n "$UNDO" ] && usage 1 || UNDO="$OPTARG"
|
||||
;;
|
||||
'r' )
|
||||
REMINDER=true
|
||||
;;
|
||||
'h' )
|
||||
usage
|
||||
;;
|
||||
'?' )
|
||||
usage 1 >&2
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# check for undo first
|
||||
if [[ ! -z "$UNDO" ]] ; then
|
||||
undo_changes "$UNDO"
|
||||
fi
|
||||
|
||||
# get the change (if any)
|
||||
shift $(($OPTIND - 1))
|
||||
WATER_CHANGE=$1
|
||||
|
||||
# update totals
|
||||
if [[ ! -z "$WATER_CHANGE" ]] ; then
|
||||
# prevent empty/0 updates
|
||||
update_water
|
||||
fi
|
||||
|
||||
# return the new total
|
||||
# Could make this an opt, but it seems to be a good default behavior
|
||||
print_water
|
Loading…
x
Reference in New Issue
Block a user