import threading
+import time
def run(action, duration=0, music=None, set_wait_id=None, **kwargs):
- if set_wait_id is not None:
- action.mapping.add_wait_id(set_wait_id, action)
+ action.mapping.add_wait(action, wait_id=set_wait_id)
action.sleep_event = threading.Event()
action.sleep_event_timer = threading.Timer(
duration,
action.sleep_event.set)
+ action.sleep_event_initial_duration = duration
+ action.sleep_event_paused = False
+ action.sleep_event_left_time = duration
+
if music is not None:
music.wait_end()
- action.sleep_event_timer.start()
+ if duration <= 0 or not action.sleep_event_paused:
+ action.sleep_event_timer.start()
+ action.sleep_event_started_time = time.time()
+
action.sleep_event.wait()
def description(action, duration=0, music=None, set_wait_id=None, **kwargs):
+ formats = []
message = ""
if music is None:
- message += "waiting {}s" \
- .format(duration)
+ message += "waiting {}s"
+ formats.append(duration)
elif duration == 0:
- message += "waiting the end of « {} »" \
- .format(music.name)
+ message += "waiting the end of « {} »"
+ formats.append(music.name)
else:
- message += "waiting the end of « {} » + {}s" \
- .format(music.name, duration)
+ message += "waiting the end of « {} » + {}s"
+ formats.append(music.name)
+ formats.append(duration)
if set_wait_id is not None:
- message += " (setting id = {})".format(set_wait_id)
+ message += " (setting id = {})"
+ formats.append(set_wait_id)
+
+ return _(message).format(*formats)
+
+def pause(action, **kwargs):
+ if action.sleep_event_paused:
+ return
+
+ action.sleep_event_paused = True
+
+ if not action.sleep_event_timer.is_alive():
+ return
+
+ action.sleep_event_timer.cancel()
+
+ action.sleep_event_left_time = action.sleep_event_left_time\
+ - (time.time() - action.sleep_event_started_time)
+ if action.sleep_event_left_time < 0:
+ action.sleep_event.set()
+
+def unpause(action, **kwargs):
+ if not action.sleep_event_paused:
+ return
+
+ action.sleep_event_paused = False
- return message
+ action.sleep_event_timer = threading.Timer(
+ action.sleep_event_left_time,
+ action.sleep_event.set)
+
+ action.sleep_event_timer.start()
+ action.sleep_event_started_time = time.time()
+
+def reset(action, **kwargs):
+ action.sleep_event_timer.cancel()
+
+ action.sleep_event_left_time = action.sleep_event_initial_duration
+
+ if action.sleep_event_paused:
+ return
+
+ action.sleep_event_timer = threading.Timer(
+ action.sleep_event_left_time,
+ action.sleep_event.set)
+
+ action.sleep_event_timer.start()
+ action.sleep_event_started_time = time.time()
def interrupt(action, duration=0, music=None, **kwargs):
if action.sleep_event is not None: