aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/IRCBot.py19
-rw-r--r--src/Timers.py32
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,