-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpomodoro.py
107 lines (90 loc) · 3.39 KB
/
pomodoro.py
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
import datetime
import threading
from idletracker import IdleTracker
from notifier import Notifier
class PomodoroTimer(Notifier):
class State:
idle = 0
resting = 1
# Working should be the last as I encode the round into self.state
working = 2
def _load_config(self, config):
self.round_per_session = config["round_per_session"]
self.rest_time_in_session = config["rest_time_in_session"]
self.rest_time_after_session = config["rest_time_after_session"]
self.working_time = config["working_time"]
self.idle_threshold = config["idle_threshold"]
def __init__(self, config):
self._load_config(config)
self.idle_tracker = IdleTracker()
self._reset()
def _reset(self):
self.state = PomodoroTimer.State.idle
def round(self):
return (
self.state - PomodoroTimer.State.working
if self.state >= PomodoroTimer.State.working
else self.round_per_session
)
def arm_timer(self, time_mins, callback):
idle_time = self.idle_tracker.get_idle_time()
if idle_time > self.idle_threshold:
self.notify("Pomodoro timer", "Idle for a long time. Stop working")
self._stop()
return
self.date_timer_armed = datetime.datetime.now()
self.timer = threading.Timer(time_mins * 60, callback)
self.timer.start()
def start_resting(self):
current_round = self.round()
self.state += 1
next_round = current_round + 1
if self.round_per_session != 0 and next_round % self.round_per_session == 0:
rest_time = self.rest_time_after_session
message = "Session done."
else:
rest_time = self.rest_time_in_session
message = "Round {} done.".format(current_round)
message += " Resting for {} mins.".format(rest_time)
self.notify("Pomodoro timer", "Start resting. " + message)
self.arm_timer(rest_time, self.start_round)
def start_round(self):
round = self.round()
self.notify(
"Pomodoro timer",
"Start working. Round {} for {} mins".format(round, self.working_time),
)
self.arm_timer(self.working_time, self.start_resting)
def run(self):
if not self.state == PomodoroTimer.State.idle:
return
self.state = PomodoroTimer.State.working
self.start_round()
def _stop(self):
if self.timer != None and self.timer.is_alive():
self.timer.cancel()
self.timer = None
self._reset()
def stop(self):
if self.state == PomodoroTimer.State.idle:
return
self.notify("Pomodoro timer", "Stop working")
self._stop()
def reset(self):
was_running = self.state >= PomodoroTimer.State.working
self.stop()
self._reset()
if was_running:
self.run()
def report(self):
state = (
self.state
if self.state <= PomodoroTimer.State.working
else PomodoroTimer.State.working
)
state_texts = ["idle", "resting", "working"]
res = {"state": state_texts[state]}
if state != PomodoroTimer.State.idle:
elapsed = datetime.datetime.now() - self.date_timer_armed
res |= {"round": self.round(), "elapsed": elapsed.__str__()}
return res