aboutsummaryrefslogtreecommitdiff
path: root/.local/bin/posix-pomo
blob: fc81352d11ac9cf0fb4181b2af65a7e1a7b2e691 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/bin/sh

# good thing I remembered that keyboard interrupts should always be a thing
keyboard_cancel() {
    printf "\npomo canceled. exiting..."
    exit 130
}

trap keyboard_cancel INT

# mandatory check for mpv
command -v mpv >/dev/null 2>&1 || { echo "error: mpv is a required dependency of posix-pomo — please install mpv to continue."; exit 1; }

# optional checks for fluff files
sound_file=$HOME/.cache/pomo/pomo-sound.mp3
icon_file=$HOME/.cache/pomo/pomo-tomato.png

[ -f "$sound_file" ] || echo "warning: please provide a sound file at $sound_file"
[ -f "$icon_file" ] || echo "warning: please provide an icon file at $icon_file"
{ [ ! -f "$sound_file" ] || [ ! -f "$icon_file" ]; } && echo

# show user, usage
[ "$#" -eq 2 ] || { echo "usage: $0 {work|break} <duration(h/m/s)>"; exit 1; }

mode=$1
input_duration=$2

timer() {
    duration=$1
    unit=$(echo "$duration" | sed -e 's/[0-9]//g' | tr '[:upper:]' '[:lower:]')
    numeric_duration=$(echo "$duration" | sed -e 's/[a-zA-Z]//g')

    case $unit in
        h) total_seconds=$((numeric_duration * 3600)) ;;
        m) total_seconds=$((numeric_duration * 60)) ;;
        s) total_seconds=$numeric_duration ;;
        *) echo "invalid duration format: $duration"; exit 3 ;;
    esac

    start_time=$(date +%s)
    end_time=$((start_time + total_seconds))

    while [ "$(date +%s)" -le "$end_time" ]; do
        current_time=$(date +%s)
        remaining_seconds=$((end_time - current_time))
        [ $remaining_seconds -lt 0 ] && remaining_seconds=0
        hours=$((remaining_seconds / 3600))
        minutes=$((remaining_seconds % 3600 / 60))
        seconds=$((remaining_seconds % 60))
        bar=$(printf "%-$((40 * (current_time - start_time) / total_seconds))s" "=" | tr ' ' '=')
        [ $remaining_seconds -eq 0 ] && bar=$(printf "%-40s" "=" | tr ' ' '=')
        printf "\rpomo timer: [%-40s] %02d:%02d:%02d remaining" "$bar" "$hours" "$minutes" "$seconds"
        sleep 1
    done
    echo # print newline after the loop completes
}

notify_and_play_sound() {
    notify-send 'posix-pomo(cli)' "$1" -i ~/.cache/pomo/pomo-tomato.png -t 120000 &
    echo
    echo "$2"
    mpv "$HOME/.cache/pomo/pomo-sound.mp3" >/dev/null 2>&1 &
}


case $mode in
    work)
        timer "$input_duration" && notify_and_play_sound 'work timer is up! take a break 😊' 'posix-pomo: work timer is up! take a break :)'
        ;;
    break)
        timer "$input_duration" && notify_and_play_sound 'break is over! get back to work 😬' 'posix-pomo: break timer is up! get back to work :|'
        ;;
    *)
        echo "invalid mode: $mode"
        echo "usage: $0 {work|break} <duration(h/m/s)>"
        exit 2
        ;;
esac