diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/IRCBot.py | 19 | ||||
| -rw-r--r-- | src/Timers.py | 32 |
2 files changed, 30 insertions, 21 deletions
diff --git a/src/IRCBot.py b/src/IRCBot.py index b03f2037..5e843054 100644 --- a/src/IRCBot.py +++ b/src/IRCBot.py @@ -1,7 +1,7 @@ import enum, queue, os, queue, select, socket, sys, threading, time, traceback import typing, uuid from src import EventManager, Exports, IRCServer, Logging, ModuleManager -from src import PollHook, Socket, utils +from src import PollHook, Socket, Timers, utils VERSION = "v1.11.1" SOURCE = "https://git.io/bitbot" @@ -83,8 +83,6 @@ class Bot(object): self._poll_timeouts.append(ListLambdaPollHook( lambda: self.servers.values(), self._throttle_timeout)) - self._events.on("timer.reconnect").hook(self._timed_reconnect) - def _throttle_timeout(self, server: IRCServer.Server): if server.socket.waiting_throttled_send(): return server.socket.send_throttle_timeout() @@ -216,12 +214,13 @@ class Bot(object): del self.servers[server.fileno()] self._trigger_both() - def _timed_reconnect(self, event: EventManager.Event): - if not self.reconnect(event["server_id"], - event.get("connection_params", None)): - event["timer"].redo() + def _timed_reconnect(self, timer: Timers.Timer): + server_id = timer.kwargs["server_id"] + params = timer.kwargs.get("connection_params", None) + if not self.reconnect(server_id, params): + timer.redo() else: - del self.reconnections[event["server_id"]] + del self.reconnections[server_id] def reconnect(self, server_id: int, connection_params: typing.Optional[ utils.irc.IRCConnectionParameters]=None) -> bool: args = {} # type: typing.Dict[str, str] @@ -395,8 +394,8 @@ class Bot(object): if not self.get_server_by_id(server.id): reconnect_delay = self.config.get("reconnect-delay", 10) - timer = self._timers.add("reconnect", reconnect_delay, - server_id=server.id) + self.timers.add("timed-reconnect", self._timed_reconnect, + reconnect_delay, server_id=server.id) self.reconnections[server.id] = timer self.log.warn( diff --git a/src/Timers.py b/src/Timers.py index e74d4a53..f913b781 100644 --- a/src/Timers.py +++ b/src/Timers.py @@ -1,9 +1,12 @@ import time, typing, uuid from src import Database, EventManager, Logging, PollHook +T_CALLBACK = typing.Callable[["Timer"], None] + class Timer(object): def __init__(self, id: str, context: typing.Optional[str], name: str, - delay: float, next_due: typing.Optional[float], kwargs: dict): + delay: float, next_due: typing.Optional[float], kwargs: dict, + callback: T_CALLBACK): self.id = id self.context = context self.name = name @@ -13,6 +16,7 @@ class Timer(object): else: self.set_next_due() self.kwargs = kwargs + self.callback = callback self._done = False def set_next_due(self): @@ -64,17 +68,24 @@ class Timers(PollHook.PollHook): self.timers.remove(timer) self.database.bot_settings.delete("timer-%s" % timer.id) - def add(self, name: str, delay: float, next_due: float=None, **kwargs - ) -> Timer: - return self._add(None, name, delay, next_due, None, False, kwargs) + def add(self, name: str, callback: T_CALLBACK, delay: float, + next_due: float=None, **kwargs) -> Timer: + return self._add(None, name, delay, next_due, None, False, kwargs, + callback=callback) def add_persistent(self, name: str, delay: float, next_due: float=None, **kwargs) -> Timer: return self._add(None, name, delay, next_due, None, True, kwargs) def _add(self, context: typing.Optional[str], name: str, delay: float, next_due: typing.Optional[float], id: typing.Optional[str], - persist: bool, kwargs: dict) -> Timer: + persist: bool, kwargs: dict, callback: T_CALLBACK=None) -> Timer: id = id or str(uuid.uuid4()) - timer = Timer(id, context, name, delay, next_due, kwargs) + + if not callback: + callback = lambda timer: self.events.on("timer.%s" % name).call( + timer=timer, **kwargs) + + timer = Timer(id, context, name, delay, next_due, kwargs, + callback=callback) if persist: self._persist(timer) @@ -110,8 +121,7 @@ class Timers(PollHook.PollHook): for timer in self.get_timers(): if timer.due(): timer.finish() - self.events.on("timer.%s" % timer.name).call(timer=timer, - **timer.kwargs) + timer.callback(timer) if timer.done(): self._remove(timer) @@ -123,10 +133,10 @@ class TimersContext(object): def __init__(self, parent: Timers, context: str): self._parent = parent self.context = context - def add(self, name: str, delay: float, next_due: float=None, - **kwargs) -> Timer: + def add(self, name: str, callback: T_CALLBACK, delay: float, + next_due: float=None, **kwargs) -> Timer: return self._parent._add(self.context, name, delay, next_due, None, - False, kwargs) + False, kwargs, callback=callback) def add_persistent(self, name: str, delay: float, next_due: float=None, **kwargs) -> Timer: return self._parent._add(None, name, delay, next_due, None, True, |
