aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar mbaruh <[email protected]>2022-10-27 23:19:21 +0300
committerGravatar mbaruh <[email protected]>2022-10-27 23:19:21 +0300
commitc756c52fc0fe2705309e532fdcfe4f669e284745 (patch)
tree695b03eb9643c345b70824ea07eb5fe104e5e887
parentAdd Discord token filter (diff)
Suppress exceptions while actioning filters
Filtering should not stop even if one type of action raised an exception. For example, if deleting the message raised somehow, it should still try to infract the user. Exceptions raised in actions are logged instead. Additionally adds a fix to the way actions are merged.
-rw-r--r--bot/exts/filtering/_filter_lists/filter_list.py14
-rw-r--r--bot/exts/filtering/_settings.py13
2 files changed, 20 insertions, 7 deletions
diff --git a/bot/exts/filtering/_filter_lists/filter_list.py b/bot/exts/filtering/_filter_lists/filter_list.py
index 50793b085..0bb0dc7f8 100644
--- a/bot/exts/filtering/_filter_lists/filter_list.py
+++ b/bot/exts/filtering/_filter_lists/filter_list.py
@@ -113,12 +113,16 @@ class AtomicList:
If `merge_default` is True, include it in the merge instead of using it as a fallback.
"""
- try:
- result = reduce(or_, (filter_.actions for filter_ in filters if filter_.actions))
- except TypeError: # The sequence fed to reduce is empty.
+ if not filters: # Nothing to action.
return None
-
- return result.fallback_to(self.defaults.actions)
+ try:
+ return reduce(
+ or_, (filter_.actions or self.defaults.actions for filter_ in filters)
+ ).fallback_to(self.defaults.actions)
+ except TypeError:
+ # The sequence fed to reduce is empty, meaning none of the filters have actions,
+ # meaning they all use the defaults.
+ return self.defaults.actions
@staticmethod
def format_messages(triggers: list[Filter], *, expand_single_filter: bool = True) -> list[str]:
diff --git a/bot/exts/filtering/_settings.py b/bot/exts/filtering/_settings.py
index 85a6f3d2b..a752918a6 100644
--- a/bot/exts/filtering/_settings.py
+++ b/bot/exts/filtering/_settings.py
@@ -1,6 +1,7 @@
from __future__ import annotations
import operator
+import traceback
from abc import abstractmethod
from functools import reduce
from typing import Any, NamedTuple, Optional, TypeVar
@@ -195,10 +196,18 @@ class ActionSettings(Settings[ActionEntry]):
async def action(self, ctx: FilterContext) -> None:
"""Execute the action of every action entry stored, as well as any additional actions in the context."""
for entry in self.values():
- await entry.action(ctx)
+ try:
+ await entry.action(ctx)
+ # Filtering should not stop even if one type of action raised an exception.
+ # For example, if deleting the message raised somehow, it should still try to infract the user.
+ except Exception:
+ log.exception(traceback.format_exc())
for action in ctx.additional_actions:
- await action(ctx)
+ try:
+ await action(ctx)
+ except Exception:
+ log.exception(traceback.format_exc())
def fallback_to(self, fallback: ActionSettings) -> ActionSettings:
"""Fill in missing entries from `fallback`."""