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
|