diff options
| -rw-r--r-- | bot/exts/filtering/_filter_lists/filter_list.py | 14 | ||||
| -rw-r--r-- | bot/exts/filtering/_settings.py | 13 |
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`.""" |