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)