--- /dev/null
+import threading
+
+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.sleep_event = threading.Event()
+ action.sleep_event_timer = threading.Timer(
+ duration,
+ action.sleep_event.set)
+
+ if music is not None:
+ music.wait_end()
+
+ action.sleep_event_timer.start()
+ action.sleep_event.wait()
+
+def description(action, duration=0, music=None, set_wait_id=None, **kwargs):
+ message = ""
+ if music is None:
+ message += "waiting {}s" \
+ .format(duration)
+ elif duration == 0:
+ message += "waiting the end of « {} »" \
+ .format(music.name)
+ else:
+ message += "waiting the end of « {} » + {}s" \
+ .format(music.name, duration)
+
+ if set_wait_id is not None:
+ message += " (setting id = {})".format(set_wait_id)
+
+ return message
+
+def interrupt(action, duration=0, music=None, **kwargs):
+ if action.sleep_event is not None:
+ action.sleep_event.set()
+ action.sleep_event_timer.cancel()
+ if music is not None:
+ music.wait_event.set()