aboutsummaryrefslogtreecommitdiff
path: root/src/Timers.py
diff options
context:
space:
mode:
authorGravatar jesopo2018-09-28 16:51:36 +0100
committerGravatar jesopo2018-09-28 16:51:36 +0100
commita8bf3c93007503ec411d0d23fef021f386127fa5 (patch)
tree4aa2c0d367606bd4c5e9ff3a0dda75a59267beb3 /src/Timers.py
parentFix typo in database_backup.py, 'ocation' -> 'location' (diff)
signature
Remove cyclical references to IRCBot
Diffstat (limited to 'src/Timers.py')
-rw-r--r--src/Timers.py73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/Timers.py b/src/Timers.py
new file mode 100644
index 00000000..d3a297df
--- /dev/null
+++ b/src/Timers.py
@@ -0,0 +1,73 @@
+import time, uuid
+
+class Timer(object):
+ def __init__(self, id, name, delay, next_due, kwargs):
+ self.id = id
+ self.name = name
+ self.delay = delay
+ if next_due:
+ self.next_due = next_due
+ else:
+ self.set_next_due()
+ self.kwargs = kwargs
+ self._done = False
+
+ def set_next_due(self):
+ self.next_due = time.time()+self.delay
+ def due(self):
+ return self.time_left() <= 0
+ def time_left(self):
+ return self.next_due-time.time()
+
+ def redo(self):
+ self._done = False
+ self.set_next_due()
+ def finish():
+ self._done = True
+ def done(self):
+ return self._done
+
+class Timers(object):
+ def __init__(self, events, log):
+ self.events = events
+ self.log = log
+ self.timers = []
+
+ def setup(self, timers):
+ for name, timer in timers:
+ id = name.split("timer-", 1)[1]
+ self._add(timer["name"], timer["delay"], timer[
+ "next-due"], id, False, timer["kwargs"])
+
+ def _persist(self, timer):
+ self.set_setting("timer-%s" % timer.id, {
+ "name": timer.name, "delay": timer.delay,
+ "next-due": timer.next_due, "kwargs": timer.kwargs})
+ def _remove(self, timer):
+ self.timers.remove(timer)
+ self.del_setting("timer-%s" % timer.id)
+
+ def add(self, name, delay, next_due=None, **kwargs):
+ self._add(name, delay, next_due, None, False, kwargs)
+ def add_persistent(self, name, delay, next_due=None, **kwargs):
+ self._add(name, delay, next_due, None, True, kwargs)
+ def _add(self, name, delay, next_due, id, persist, kwargs):
+ id = id or uuid.uuid4().hex
+ timer = Timer(id, name, delay, next_due, kwargs)
+ if persist:
+ self._persist(timer)
+ self.timers.append(timer)
+
+ def next(self):
+ times = filter(None, [timer.time_left() for timer in self.timers])
+ if not times:
+ return None
+ return max(min(times), 0)
+
+ def call(self):
+ for timer in self.timers[:]:
+ if timer.due():
+ timer.finish()
+ self.events.on("timer.%s" % timer.name, timer=timer)
+ if timer.done():
+ self._remove(timer)