aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/sed.py6
-rw-r--r--src/utils/__init__.py13
2 files changed, 11 insertions, 8 deletions
diff --git a/modules/sed.py b/modules/sed.py
index 31e7316e..62879da0 100644
--- a/modules/sed.py
+++ b/modules/sed.py
@@ -55,10 +55,10 @@ class Module(ModuleManager.BaseModule):
for_user = event["user"].nickname if self._closest_setting(event,
"sed-sender-only", False) else None
- def _find():
- return event["target"].buffer.find(pattern, from_self=False,
+ with utils.deadline():
+ match = event["target"].buffer.find(pattern, from_self=False,
for_user=for_user, not_pattern=REGEX_SED)
- match = utils.deadline(_find)
+
if match:
new_message = re.sub(pattern, replace, match.line.message,
count)
diff --git a/src/utils/__init__.py b/src/utils/__init__.py
index 35ac23e5..719065c0 100644
--- a/src/utils/__init__.py
+++ b/src/utils/__init__.py
@@ -1,4 +1,5 @@
-import datetime, decimal, enum, io, ipaddress, re, signal, threading, typing
+import contextlib, datetime, decimal, enum, io, ipaddress, re, signal
+import threading, typing
from src.utils import cli, consts, irc, http, parse, security
class Direction(enum.Enum):
@@ -348,11 +349,13 @@ class DeadlineExceededException(Exception):
def _raise_deadline():
raise DeadlineExceededException()
-def deadline(f: typing.Callable[[], typing.Any], seconds: int=10) -> typing.Any:
- signal.signal(signal.SIGALRM, lambda _1, _2: _raise_deadline())
+@contextlib.contextmanager
+def deadline(seconds: int=10):
+ old_handler = signal.signal(signal.SIGALRM,
+ lambda _1, _2: _raise_deadline())
signal.alarm(seconds)
try:
- return f()
+ yield
finally:
- signal.signal(signal.SIGALRM, signal.SIG_IGN)
+ signal.signal(signal.SIGALRM, old_handler)