diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Cache.py | 50 | ||||
| -rw-r--r-- | src/IRCBot.py | 8 |
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: |
