Progress Bar of Year, Month, and (Work) Day, the latter of which helps you keep track of your time as a resource and beat procrastination!
#!/bin/sh
# Progress Bar to Beat Procrastination!
#
# by jasonrwang (https://github.com/jasonrwang)
# forked from aurorabbit (https://github.com/aurorabbit) and Mucahit (http://github.com/mucahit)
#
# <xbar.title>Progress Bar to Beat Procrastination!</xbar.title>
# <xbar.version>v1.2</xbar.version>
# <xbar.author>jasonrwang</xbar.author>
# <xbar.author.github>jasonrwang</xbar.author.github>
# <xbar.desc>Progress Bar of Year, Month, and (Work) Day, the latter of which helps you keep track of your time as a resource and beat procrastination!</xbar.desc>
# <xbar.image>https://user-images.githubusercontent.com/6628281/62536640-f7b71f00-b83d-11e9-9297-a63cc24ef115.png</xbar.image>
# <xbar.dependencies>bash</xbar.dependencies>
# <xbar.abouturl>https://gist.github.com/jasonrwang/49f76015627cf517fe77eca357401397</xbar.abouturl>
## !!!
# add this to your bitbar directory
# don't forget to chmod +x
## time parameters
working_start=0900
working_end=2300
## bitbar parameters
# width and characters for the progress bars
# feel free to configure these
width=30
fill_char="β"
empty_char="β"
# use a monospace font if you want the percentages to be right-aligned
bitbar="size=10 font='Menlo'"
## See Font Book.app's Fixed Width collection for what you can use
## you can also download this font for free and drag it into Font Book.app.
## https://github.com/belluzj/fantasque-sans/releases/latest
## calculations
# all of the calculations are done using unix timestamps from date(1)
# mac uses bsd's date(1)
# whenever we set a date, make sure to add -j so it doesn't change the clock
# we use `date -j %m%d0000 +%s` to get the start timestamp, %Y is implied
# then we use `date -jr $start -v +1y/+1m/+1d +%s` to get the ending timestamp
# then we calculate the percentage with (now - start) / (end - start)
now=$(date +%s)
Y=$(date +%Y)
Y_start=$(date -j 01010000 +%s)
Y_end=$(date -jr "$Y_start" -v +1y +%s)
Y_progress=$(
echo "($now - $Y_start) * 100 / ($Y_end - $Y_start)" | bc -l
)
m=$(date +%m)
m_start=$(date -j "$(date +%m)"010000 +%s)
m_end=$(date -jr "$m_start" -v +1m +%s)
m_progress=$(
echo "($now - $m_start) * 100 / ($m_end - $m_start)" | bc -l
)
# If time right now is working_start is less than the starting time but
# midnight, set to "SLP" without %
d=$(date +%d)
d_start=$(date -j $working_start +%s) # starttime of today
# set the end time
d_today=$(date -j "$(date +%m%d)"0000 +%s)
if [ $working_end -eq 0000 ]
then
d_end=$(date -jr "$d_today" -v +1d +%s) # beginning of next day
else
d_end=$(date -j "$(date +%m%d)$working_end" +%s) # set to working_end time of today
fi
d_progress=$(
echo "($now - $d_start) * 100 / ($d_end - $d_start)" | bc -l
)
## output prep
# padding to align progress bar and text
# Y-m-d = 10 + 2 spaces + 2 digits + percent sign = 15
# progress bar width - 15 = padding
padding=$(printf %$((width-6))s "")
# round function
round() { printf %.0f "$1"; }
# progress bar display function
progress() {
filled=$(round "$(echo "$1 * $width / 100" | bc -l)")
empty=$((width - filled))
# repeat the characters using printf
printf "$fill_char%0.s" $(seq "$filled")
printf "$empty_char%0.s" $(seq $empty)
}
## output to bitbar
# menu bar line
if [ "$now" -lt "$d_end" ] # tell me to stop if I'm past $working_end
then
if [ "$now" -lt "$d_start" ] # basically captures post-midnight oil-burning
then
echo "π΄SLEEP!π | $bitbar size=12 font='SF Compact Text Regular'"
else
echo "P: $(round "$d_progress")% | $bitbar size=12 font='SF Compact Text Regular'"
fi
else
echo "πSTOP!β | $bitbar size=12 font='SF Compact Text Regular'"
fi
echo ---
# day + progress bar
echo "$Y-$m-$d $padding $(round "$d_progress")% | $bitbar"
echo "$(progress "$d_progress") | $bitbar"
echo ---
# month + progress bar
echo "$Y-$m $padding $(round "$m_progress")% | $bitbar"
echo "$(progress "$m_progress") | $bitbar"
echo ---
# year + progress bar
echo "$Y $padding $(round "$Y_progress")% | $bitbar"
echo "$(progress "$Y_progress") | $bitbar"