Browse Source

Add AutoModTrigger.regex_patterns support

pull/9055/head
Rapptz 2 years ago
parent
commit
84767ef840
  1. 48
      discord/automod.py
  2. 1
      discord/types/automod.py

48
discord/automod.py

@ -118,17 +118,17 @@ class AutoModTrigger:
The following table illustrates relevant attributes for each :class:`AutoModRuleTriggerType`: The following table illustrates relevant attributes for each :class:`AutoModRuleTriggerType`:
+-----------------------------------------------+--------------------------------------+ +-----------------------------------------------+------------------------------------------------+
| Type | Attributes | | Type | Attributes |
+===============================================+======================================+ +===============================================+================================================+
| :attr:`AutoModRuleTriggerType.keyword` | :attr:`keyword_filter` | | :attr:`AutoModRuleTriggerType.keyword` | :attr:`keyword_filter`, :attr:`regex_patterns` |
+-----------------------------------------------+--------------------------------------+ +-----------------------------------------------+------------------------------------------------+
| :attr:`AutoModRuleTriggerType.spam` | | | :attr:`AutoModRuleTriggerType.spam` | |
+-----------------------------------------------+--------------------------------------+ +-----------------------------------------------+------------------------------------------------+
| :attr:`AutoModRuleTriggerType.keyword_preset` | :attr:`presets`\, :attr:`allow_list` | | :attr:`AutoModRuleTriggerType.keyword_preset` | :attr:`presets`\, :attr:`allow_list` |
+-----------------------------------------------+--------------------------------------+ +-----------------------------------------------+------------------------------------------------+
| :attr:`AutoModRuleTriggerType.mention_spam` | :attr:`mention_limit` | | :attr:`AutoModRuleTriggerType.mention_spam` | :attr:`mention_limit` |
+-----------------------------------------------+--------------------------------------+ +-----------------------------------------------+------------------------------------------------+
.. versionadded:: 2.0 .. versionadded:: 2.0
@ -137,7 +137,18 @@ class AutoModTrigger:
type: :class:`AutoModRuleTriggerType` type: :class:`AutoModRuleTriggerType`
The type of trigger. The type of trigger.
keyword_filter: List[:class:`str`] keyword_filter: List[:class:`str`]
The list of strings that will trigger the keyword filter. The list of strings that will trigger the keyword filter. Maximum of 1000.
Keywords can only be up to 30 characters in length.
This could be combined with :attr:`regex_patterns`.
regex_patterns: List[:class:`str`]
The regex pattern that will trigger the filter. The syntax is based off of
`Rust's regex syntax <https://docs.rs/regex/latest/regex/#syntax>`_.
Maximum of 10. Regex strings can only be up to 75 characters in length.
This could be combined with :attr:`keyword_filter`.
.. versionadded:: 2.1
presets: :class:`AutoModPresets` presets: :class:`AutoModPresets`
The presets used with the preset keyword filter. The presets used with the preset keyword filter.
allow_list: List[:class:`str`] allow_list: List[:class:`str`]
@ -153,6 +164,7 @@ class AutoModTrigger:
'presets', 'presets',
'allow_list', 'allow_list',
'mention_limit', 'mention_limit',
'regex_patterns',
) )
def __init__( def __init__(
@ -163,13 +175,14 @@ class AutoModTrigger:
presets: Optional[AutoModPresets] = None, presets: Optional[AutoModPresets] = None,
allow_list: Optional[List[str]] = None, allow_list: Optional[List[str]] = None,
mention_limit: Optional[int] = None, mention_limit: Optional[int] = None,
regex_patterns: Optional[List[str]] = None,
) -> None: ) -> None:
if type is None and sum(arg is not None for arg in (keyword_filter, presets, mention_limit)) > 1: if type is None and sum(arg is not None for arg in (keyword_filter or regex_patterns, presets, mention_limit)) > 1:
raise ValueError('Please pass only one of keyword_filter, presets, or mention_limit.') raise ValueError('Please pass only one of keyword_filter, regex_patterns, presets, or mention_limit.')
if type is not None: if type is not None:
self.type = type self.type = type
elif keyword_filter is not None: elif keyword_filter is not None or regex_patterns is not None:
self.type = AutoModRuleTriggerType.keyword self.type = AutoModRuleTriggerType.keyword
elif presets is not None: elif presets is not None:
self.type = AutoModRuleTriggerType.keyword_preset self.type = AutoModRuleTriggerType.keyword_preset
@ -184,6 +197,7 @@ class AutoModTrigger:
self.presets: AutoModPresets = presets if presets is not None else AutoModPresets() self.presets: AutoModPresets = presets if presets is not None else AutoModPresets()
self.allow_list: List[str] = allow_list if allow_list is not None else [] self.allow_list: List[str] = allow_list if allow_list is not None else []
self.mention_limit: int = mention_limit if mention_limit is not None else 0 self.mention_limit: int = mention_limit if mention_limit is not None else 0
self.regex_patterns: List[str] = regex_patterns if regex_patterns is not None else []
@classmethod @classmethod
def from_data(cls, type: int, data: Optional[AutoModerationTriggerMetadataPayload]) -> Self: def from_data(cls, type: int, data: Optional[AutoModerationTriggerMetadataPayload]) -> Self:
@ -191,7 +205,7 @@ class AutoModTrigger:
if data is None: if data is None:
return cls(type=type_) return cls(type=type_)
elif type_ is AutoModRuleTriggerType.keyword: elif type_ is AutoModRuleTriggerType.keyword:
return cls(type=type_, keyword_filter=data.get('keyword_filter')) return cls(type=type_, keyword_filter=data.get('keyword_filter'), regex_patterns=data.get('regex_patterns'))
elif type_ is AutoModRuleTriggerType.keyword_preset: elif type_ is AutoModRuleTriggerType.keyword_preset:
return cls( return cls(
type=type_, presets=AutoModPresets._from_value(data.get('presets', [])), allow_list=data.get('allow_list') type=type_, presets=AutoModPresets._from_value(data.get('presets', [])), allow_list=data.get('allow_list')
@ -203,7 +217,7 @@ class AutoModTrigger:
def to_metadata_dict(self) -> Optional[Dict[str, Any]]: def to_metadata_dict(self) -> Optional[Dict[str, Any]]:
if self.type is AutoModRuleTriggerType.keyword: if self.type is AutoModRuleTriggerType.keyword:
return {'keyword_filter': self.keyword_filter} return {'keyword_filter': self.keyword_filter, 'regex_patterns': self.regex_patterns}
elif self.type is AutoModRuleTriggerType.keyword_preset: elif self.type is AutoModRuleTriggerType.keyword_preset:
return {'presets': self.presets.to_array(), 'allow_list': self.allow_list} return {'presets': self.presets.to_array(), 'allow_list': self.allow_list}
elif self.type is AutoModRuleTriggerType.mention_spam: elif self.type is AutoModRuleTriggerType.mention_spam:

1
discord/types/automod.py

@ -65,6 +65,7 @@ AutoModerationAction = Union[_AutoModerationActionBlockMessage, _AutoModerationA
class _AutoModerationTriggerMetadataKeyword(TypedDict): class _AutoModerationTriggerMetadataKeyword(TypedDict):
keyword_filter: List[str] keyword_filter: List[str]
regex_patterns: NotRequired[List[str]]
class _AutoModerationTriggerMetadataKeywordPreset(TypedDict): class _AutoModerationTriggerMetadataKeywordPreset(TypedDict):

Loading…
Cancel
Save