summaryrefslogtreecommitdiffstats
path: root/examples/pomodoro.py
blob: 2094448d4cbd1105ac84e9392467985f150e58d5 (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
128
129
130
"""
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)
        """
        if not os.path.isfile(LOG_FILE):
            return 'stop'

        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