aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Cache.py50
-rw-r--r--src/IRCBot.py8
2 files changed, 55 insertions, 3 deletions
diff --git a/src/Cache.py b/src/Cache.py
new file mode 100644
index 00000000..4d7c8def
--- /dev/null
+++ b/src/Cache.py
@@ -0,0 +1,50 @@
+import time, uuid
+
+class Cache(object):
+ def __init__(self):
+ self._items = {}
+ self._item_to_id = {}
+
+ def cache(self, item):
+ return self._cache(item, None)
+ def temporary_cache(self, item, timeout):
+ return self._cache(item, timeout)
+ def _cache(self, item, timeout):
+ id = str(uuid.uuid4())
+ self._items[id] = [item, time.monotonic()+timeout]
+ self._item_to_id[item] = id
+ return id
+
+ def next_expiration(self):
+ expirations = [self._items[id][1] for id in self._items]
+ expirations = list(filter(None, expirations))
+ if not expirations:
+ return None
+ expirations = [e-time.monotonic() for e in expirations]
+ return max(min(expirations), 0)
+
+ def expire(self):
+ now = time.monotonic()
+ expired = []
+ for id in self._items:
+ item, expiration = self._items[id]
+ if expiration and expiration <= now:
+ expired.append(id)
+ for id in expired:
+ del self._items[id]
+ del self._item_to_id[item]
+
+ def has_item(self, item):
+ return item in self._item_to_id
+
+ def get(self, id):
+ item, expiration = self._items[id]
+ return item
+
+ def get_expiration(self, item):
+ id = self._item_to_id[item]
+ item, expiration = self._items[id]
+ return expiration
+ def until_expiration(self, item):
+ expiration = self.get_expiration(item)
+ return expiration-time.monotonic()
diff --git a/src/IRCBot.py b/src/IRCBot.py
index f4c96627..ff5157cd 100644
--- a/src/IRCBot.py
+++ b/src/IRCBot.py
@@ -2,12 +2,12 @@ import os, select, sys, threading, time, traceback, uuid
from . import EventManager, Exports, IRCLineHandler, IRCServer, Logging
from . import ModuleManager
-
class Bot(object):
- def __init__(self, directory, args, config, database, events, exports,
- line_handler, log, modules, timers):
+ def __init__(self, directory, args, cache, config, database, events,
+ exports, line_handler, log, modules, timers):
self.directory = directory
self.args = args
+ self.cache = cache
self.config = config
self.database = database
self._events = events
@@ -79,6 +79,7 @@ class Bot(object):
timeouts.append(self.next_send())
timeouts.append(self.next_ping())
timeouts.append(self.next_read_timeout())
+ timeouts.append(self.cache.next_expiration())
return min([timeout for timeout in timeouts if not timeout == None])
def register_read(self, server):
@@ -120,6 +121,7 @@ class Bot(object):
self.lock.acquire()
events = self.poll.poll(self.get_poll_timeout())
self.timers.call()
+ self.cache.expire()
for fd, event in events:
if fd in self.servers: