.local-bin/scripts/promodoro
2024-09-15 11:42:01 -04:00

163 lines
4.1 KiB
Bash
Executable file

#!/usr/bin/env bash
LOG_FILE="tasks.log"
PLANNING_FILE="plan.txt"
TODAY_TASKS_FILE="today_tasks.txt"
MENU_TMUX_FILE="\"$HOME\"/.local/bin/scripts/pomodoro_menu"
MENU_WEZTERM_FILE="\"$HOME\"/.local/bin/scripts/pomodoro_menu"
WORK_INTERVAL=25
SHORT_BREAK=5
LONG_BREAK=15
NUM_INTERVALS=4
# Determine the terminal environment
detect_os_and_terminal() {
OS=$(uname)
if [ "$OS" == "Darwin" ]; then
OS_TYPE="mac"
else
OS_TYPE="linux"
fi
TERMINAL_TYPE=$(ps -o comm= $$)
if [ "$TERMINAL_TYPE" == "tmux" ]; then
if ! tmux has-session -t "$MENU_TMUX_FILE" 2>/dev/null; then
tmux new-session -d -s "$MENU_TMUX_FILE" bash -c "$MENU_TMUX_FILE"
fi
tmux split-window -t "$MENU_TMUX_FILE" bash -c "$MENU_TMUX_FILE"
elif [ "$TERMINAL_TYPE" == "wezterm" ]; then
wezterm cli start --new-tab --cwd="$PWD" -- bash -c "$MENU_WEZTERM_FILE"
fi
}
notify() {
local message=$1
local title="Pomodoro Timer"
if [ "$OS_TYPE" == "mac" ]; then
osascript -e "display notification \"$message\" with title \"$title\""
else
notify-send "$title" "$message"
fi
}
print_timer() {
local minutes=$1
local task_name=$2
local break_time=$3
local interval=$((minutes * 60))
local end_time=$((SECONDS + interval))
notify "Starting task: $task_name"
echo "Starting task: $task_name"
while [ $SECONDS -lt $end_time ]; do
local remaining=$((end_time - SECONDS))
local mins=$((remaining / 60))
local secs=$((remaining % 60))
printf "\rTime left for task: %02d:%02d" $mins $secs
sleep 1
done
notify "Time for break: $break_time minutes"
echo -e "\nTime for break: $break_time minutes"
sleep $((break_time * 60))
}
log_task() {
local task_name=$1
local start_time
start_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "$start_time - $task_name" >>"$LOG_FILE"
}
plan_next_day() {
echo "Plan for tomorrow:"
read -rp "Enter tasks for tomorrow (separated by commas): " tasks
if [ "$OS_TYPE" == "mac" ]; then
date_fmt=$(date -j -v+1d +"%Y-%m-%d")
else
date_fmt=$(date -d tomorrow +"%Y-%m-%d")
fi
echo "Tasks for $date_fmt:" >"$PLANNING_FILE"
IFS=',' read -ra TASK_ARRAY <<<"$tasks"
for task in "${TASK_ARRAY[@]}"; do
task=$(echo "$task" | xargs)
echo "- $task" >>"$PLANNING_FILE"
done
echo "Tasks for tomorrow have been saved in $PLANNING_FILE."
}
handle_skip() {
local pid=$1
while [ -e "$skip_file" ]; do
sleep 1
done
kill "$pid" 2>/dev/null
wait "$pid" 2>/dev/null
}
cleanup() {
if [ -n "$timer_pid" ]; then
kill "$timer_pid" 2>/dev/null
wait "$timer_pid" 2>/dev/null
fi
}
trap cleanup EXIT
start_timer() {
local current_task_name=""
notify "Starting the Pomodoro Technique Timer"
echo "Pomodoro Technique Timer"
# Prompt for the name of the first task
read -rp "Enter the name of the first task: " current_task_name
log_task "$current_task_name"
run_timer() {
local task_name="$1"
local work_interval="$2"
local short_break="$3"
skip_file="/tmp/skip_flag"
[ -e "$skip_file" ] && rm "$skip_file"
nohup bash -c "(print_timer $work_interval \"$task_name\" $short_break)" >/dev/null 2>&1 &
timer_pid=$!
handle_skip "$timer_pid" &
wait "$timer_pid"
}
for ((i = 1; i <= NUM_INTERVALS; i++)); do
run_timer "$current_task_name" $WORK_INTERVAL $SHORT_BREAK
# Prompt for the next task if not on the last interval
if ((i < NUM_INTERVALS)); then
echo "Interval task: $current_task_name completed."
if [ -z "$task_name_from_menu" ]; then
read -rp "Enter the name of the next task: " current_task_name
log_task "$current_task_name"
fi
fi
done
notify "Long break time: $LONG_BREAK minutes"
echo "Take a long break now: $LONG_BREAK minutes"
sleep $((LONG_BREAK * 60))
notify "All tasks are completed!"
}
detect_os_and_terminal
start_timer