aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/exts/filtering/_filter_lists/filter_list.py3
-rw-r--r--bot/exts/filtering/_filter_lists/invite.py2
-rw-r--r--bot/exts/filtering/_settings.py6
-rw-r--r--bot/exts/filtering/_settings_types/actions/infraction_and_notification.py6
-rw-r--r--bot/exts/filtering/_settings_types/actions/ping.py6
-rw-r--r--bot/exts/filtering/_settings_types/actions/remove_context.py6
-rw-r--r--bot/exts/filtering/_settings_types/actions/send_alert.py7
-rw-r--r--bot/exts/filtering/_settings_types/settings_entry.py3
-rw-r--r--bot/exts/filtering/filtering.py3
9 files changed, 18 insertions, 24 deletions
diff --git a/bot/exts/filtering/_filter_lists/filter_list.py b/bot/exts/filtering/_filter_lists/filter_list.py
index a32b0741e..4913315eb 100644
--- a/bot/exts/filtering/_filter_lists/filter_list.py
+++ b/bot/exts/filtering/_filter_lists/filter_list.py
@@ -6,7 +6,6 @@ from collections.abc import Iterable
from dataclasses import dataclass
from enum import Enum
from functools import reduce
-from operator import or_
from typing import Any
import arrow
@@ -133,7 +132,7 @@ class AtomicList:
return None
try:
return reduce(
- or_, (filter_.actions or self.defaults.actions for filter_ in filters)
+ ActionSettings.union, (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,
diff --git a/bot/exts/filtering/_filter_lists/invite.py b/bot/exts/filtering/_filter_lists/invite.py
index dd14d2222..c2a75e831 100644
--- a/bot/exts/filtering/_filter_lists/invite.py
+++ b/bot/exts/filtering/_filter_lists/invite.py
@@ -120,7 +120,7 @@ class InviteList(FilterList[InviteFilter]):
# Blocked invites come second so that their actions have preference.
if triggered:
if actions:
- actions |= self[ListType.DENY].merge_actions(triggered)
+ actions = actions.union(self[ListType.DENY].merge_actions(triggered))
else:
actions = self[ListType.DENY].merge_actions(triggered)
all_triggers[ListType.DENY] = triggered
diff --git a/bot/exts/filtering/_settings.py b/bot/exts/filtering/_settings.py
index fff4239ec..75e810df5 100644
--- a/bot/exts/filtering/_settings.py
+++ b/bot/exts/filtering/_settings.py
@@ -7,6 +7,8 @@ from copy import copy
from functools import reduce
from typing import Any, NamedTuple, Optional, TypeVar
+from typing_extensions import Self
+
from bot.exts.filtering._filter_context import FilterContext
from bot.exts.filtering._settings_types import settings_types
from bot.exts.filtering._settings_types.settings_entry import ActionEntry, SettingsEntry, ValidationEntry
@@ -175,13 +177,13 @@ class ActionSettings(Settings[ActionEntry]):
def __init__(self, settings_data: dict, *, defaults: Settings | None = None, keep_empty: bool = False):
super().__init__(settings_data, defaults=defaults, keep_empty=keep_empty)
- def __or__(self, other: ActionSettings) -> ActionSettings:
+ def union(self, other: Self) -> Self:
"""Combine the entries of two collections of settings into a new ActionsSettings."""
actions = {}
# A settings object doesn't necessarily have all types of entries (e.g in the case of filter overrides).
for entry in self:
if entry in other:
- actions[entry] = self[entry] | other[entry]
+ actions[entry] = self[entry].union(other[entry])
else:
actions[entry] = self[entry]
for entry in other:
diff --git a/bot/exts/filtering/_settings_types/actions/infraction_and_notification.py b/bot/exts/filtering/_settings_types/actions/infraction_and_notification.py
index 215afabdd..a3b59d05d 100644
--- a/bot/exts/filtering/_settings_types/actions/infraction_and_notification.py
+++ b/bot/exts/filtering/_settings_types/actions/infraction_and_notification.py
@@ -9,6 +9,7 @@ from botcore.utils.members import get_or_fetch_member
from discord import Colour, Embed, Member, User
from discord.errors import Forbidden
from pydantic import validator
+from typing_extensions import Self
import bot as bot_module
from bot.constants import Channels
@@ -159,7 +160,7 @@ class InfractionAndNotification(ActionEntry):
)
ctx.action_descriptions.append(passive_form[self.infraction_type.name])
- def __or__(self, other: ActionEntry):
+ def union(self, other: Self) -> Self:
"""
Combines two actions of the same type. Each type of action is executed once per filter.
@@ -169,9 +170,6 @@ class InfractionAndNotification(ActionEntry):
To avoid bombarding the user with several notifications, the message with the more significant infraction
is used.
"""
- if not isinstance(other, InfractionAndNotification):
- return NotImplemented
-
# Lower number -> higher in the hierarchy
if self.infraction_type is None:
return other.copy()
diff --git a/bot/exts/filtering/_settings_types/actions/ping.py b/bot/exts/filtering/_settings_types/actions/ping.py
index b3725917c..ee40c54fe 100644
--- a/bot/exts/filtering/_settings_types/actions/ping.py
+++ b/bot/exts/filtering/_settings_types/actions/ping.py
@@ -1,6 +1,7 @@
from typing import ClassVar
from pydantic import validator
+from typing_extensions import Self
from bot.exts.filtering._filter_context import FilterContext
from bot.exts.filtering._settings_types.settings_entry import ActionEntry
@@ -39,9 +40,6 @@ class Ping(ActionEntry):
new_content = " ".join([resolve_mention(mention) for mention in mentions])
ctx.alert_content = f"{new_content} {ctx.alert_content}"
- def __or__(self, other: ActionEntry):
+ def union(self, other: Self) -> Self:
"""Combines two actions of the same type. Each type of action is executed once per filter."""
- if not isinstance(other, Ping):
- return NotImplemented
-
return Ping(guild_pings=self.guild_pings | other.guild_pings, dm_pings=self.dm_pings | other.dm_pings)
diff --git a/bot/exts/filtering/_settings_types/actions/remove_context.py b/bot/exts/filtering/_settings_types/actions/remove_context.py
index 410740028..e030f06d2 100644
--- a/bot/exts/filtering/_settings_types/actions/remove_context.py
+++ b/bot/exts/filtering/_settings_types/actions/remove_context.py
@@ -5,6 +5,7 @@ from botcore.utils import scheduling
from botcore.utils.logging import get_logger
from discord import Message
from discord.errors import HTTPException
+from typing_extensions import Self
import bot
from bot.constants import Channels
@@ -105,9 +106,6 @@ class RemoveContext(ActionEntry):
await command(FakeContext(alerts_channel, command), ctx.author, None, reason=SUPERSTAR_REASON)
ctx.action_descriptions.append("superstar")
- def __or__(self, other: ActionEntry):
+ def union(self, other: Self) -> Self:
"""Combines two actions of the same type. Each type of action is executed once per filter."""
- if not isinstance(other, RemoveContext):
- return NotImplemented
-
return RemoveContext(remove_context=self.remove_context or other.remove_context)
diff --git a/bot/exts/filtering/_settings_types/actions/send_alert.py b/bot/exts/filtering/_settings_types/actions/send_alert.py
index 04e400764..f554cdd4d 100644
--- a/bot/exts/filtering/_settings_types/actions/send_alert.py
+++ b/bot/exts/filtering/_settings_types/actions/send_alert.py
@@ -1,5 +1,7 @@
from typing import ClassVar
+from typing_extensions import Self
+
from bot.exts.filtering._filter_context import FilterContext
from bot.exts.filtering._settings_types.settings_entry import ActionEntry
@@ -16,9 +18,6 @@ class SendAlert(ActionEntry):
"""Add the stored pings to the alert message content."""
ctx.send_alert = self.send_alert
- def __or__(self, other: ActionEntry):
+ def union(self, other: Self) -> Self:
"""Combines two actions of the same type. Each type of action is executed once per filter."""
- if not isinstance(other, SendAlert):
- return NotImplemented
-
return SendAlert(send_alert=self.send_alert or other.send_alert)
diff --git a/bot/exts/filtering/_settings_types/settings_entry.py b/bot/exts/filtering/_settings_types/settings_entry.py
index 31e11108d..e41ef5c7a 100644
--- a/bot/exts/filtering/_settings_types/settings_entry.py
+++ b/bot/exts/filtering/_settings_types/settings_entry.py
@@ -4,6 +4,7 @@ from abc import abstractmethod
from typing import Any, ClassVar, Union
from pydantic import BaseModel, PrivateAttr
+from typing_extensions import Self
from bot.exts.filtering._filter_context import FilterContext
from bot.exts.filtering._utils import FieldRequiring
@@ -80,7 +81,7 @@ class ActionEntry(SettingsEntry):
...
@abstractmethod
- def __or__(self, other: ActionEntry):
+ def union(self, other: Self) -> Self:
"""
Combine two actions of the same type. Each type of action is executed once per filter.
diff --git a/bot/exts/filtering/filtering.py b/bot/exts/filtering/filtering.py
index a66adfc73..66f4715f3 100644
--- a/bot/exts/filtering/filtering.py
+++ b/bot/exts/filtering/filtering.py
@@ -1,6 +1,5 @@
import datetime
import json
-import operator
import re
import unicodedata
from collections import defaultdict
@@ -917,7 +916,7 @@ class Filtering(Cog):
result_actions = None
if actions:
- result_actions = reduce(operator.or_, (action for action in actions))
+ result_actions = reduce(ActionSettings.union, actions)
return result_actions, messages, triggers