summaryrefslogtreecommitdiffstats
path: root/examples/pomodoro.py
blob: 7af996b1a173288d6e8208542d94a5cfc8726e09 (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
"""
REQUIREMENTS
------------
* libnotify
* python-gobject


INSTALLATION
------------
Please add the following lines in your ~/.i3/config file::

    bindsym $mod+minus exec echo "stop" > ~/.i3/pomodoro.log
    bindsym $mod+equal exec echo "pause" > ~/.i3/pomodoro.log
    bindsym $mod+plus exec echo "start" > ~/.i3/pomodoro.log

"""
from datetime import timedelta
from gi.repository import Notify
import os.path
from time import time


LOG_FILE   = os.path.join(os.path.expanduser('~'), '.i3', 'pomodoro.log')
LONG_REST  = 1800  # 60 * 30
NB_REST    = 4
POMO       = 1500  # 60 * 25
POSITION   = 0
SHORT_REST = 300   # 60 * 5


class Py3status:
    """
    Pomodoro method
    """
    pomo = POMO
    rest = SHORT_REST
    nb_rest = NB_REST

    @property
    def response(self):
        return {
            'cached_until' : time(),
            'full_text': '',
            'name': 'pomodoro',
        }

    def pomodoro(self, json, i3status_config):
        """
        This function will update a timer in the i3status bar for 25 minutes,
        then print a red "Break time" message for 5 minutes.
        """
        status = self.get_status()

        if status == 'stop':
            self.pomo = POMO
            self.rest = SHORT_REST
            self.nb_rest = NB_REST
            return (POSITION, self.response)

        # Else run normally
        if not self.pomo:
            if status != 'pause':
                self.rest -= 1
            timer = self.rest
            self.full_text = 'Break time'
            color = 'color_bad'
        else:
            if status != 'pause':
                self.pomo -= 1
            timer = self.pomo
            self.full_text = 'Pomodoro'
            color = 'color_degraded'

        if status == 'pause':
            color = 'color_good'

        if not timer:
            # Pomodoro or Rest is finished, send notification
            self.send_notification()

        response = self.response
        response.update({
            'color': i3status_config[color],
            'full_text': '{}: {}'.format(
                self.full_text, str(timedelta(seconds=timer))[2:]),
        })

        return (POSITION, response)

    def get_status(self):
        """
        Read the log file and get the status value. Value is modifying via
        i3 key mapping.

        Value can be:
            * start
            * pause
            * stop (default)
        """
        with open(LOG_FILE, 'r') as f:
            status = f.read()

        return status.rstrip('\n')

    def send_notification(self):
        """
        Print a visual message
        """

        Notify.init('Pomodoro')
        notification = Notify.Notification.new (
            '<b>Attention:</b>',
            '{} is finished'.format(self.full_text),
            'dialog-information',
        )
        notification.show()

        if not self.rest:
            # Rest is finished, reinitialize data
            self.nb_rest -= 1
            self.pomo = POMO
            self.rest = SHORT_REST

        if not self.nb_rest:
            # Number of small rest reached, go for long rest
            self.rest = LONG_REST
            self.nb_rest = NB_REST