Skip to content

Commit a756199

Browse files
EepyElvyraToricane
andauthored
feat: Add helper methods for automod (#863)
* feat: Add helper methods for automod * feat: Add helper methods for automod * fix: other mistakes * Update interactions/api/models/guild.py Co-authored-by: Toricane <73972068+Toricane@users.noreply.github.com> * Update interactions/api/models/guild.py Co-authored-by: Toricane <73972068+Toricane@users.noreply.github.com> Co-authored-by: Toricane <73972068+Toricane@users.noreply.github.com>
1 parent 9ad859d commit a756199

File tree

5 files changed

+245
-4
lines changed

5 files changed

+245
-4
lines changed

interactions/api/models/guild.py

Lines changed: 181 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,14 @@
1414
from .channel import Channel, ChannelType, Thread
1515
from .member import Member
1616
from .message import Emoji, Sticker
17-
from .misc import Image, Overwrite, Snowflake
17+
from .misc import (
18+
AutoModAction,
19+
AutoModTriggerMetadata,
20+
AutoModTriggerType,
21+
Image,
22+
Overwrite,
23+
Snowflake,
24+
)
1825
from .presence import PresenceActivity
1926
from .role import Role
2027
from .team import Application
@@ -1932,6 +1939,179 @@ async def get_webhooks(self) -> List[Webhook]:
19321939

19331940
return [Webhook(**_, _client=self._client) for _ in res]
19341941

1942+
async def list_auto_moderation_rules(self) -> List["AutoModerationRule"]: # noqa
1943+
"""
1944+
Lists all AutoMod rules
1945+
"""
1946+
if not self._client:
1947+
raise LibraryException(code=13)
1948+
1949+
from .gw import AutoModerationRule
1950+
1951+
res = await self._client.list_auto_moderation_rules(int(self.id))
1952+
1953+
return [AutoModerationRule(**_) for _ in res]
1954+
1955+
async def get_auto_moderation_rule(
1956+
self, rule_id: Union[int, Snowflake]
1957+
) -> "AutoModerationRule": # noqa
1958+
"""
1959+
Gets a AutoMod rule from its ID
1960+
1961+
:param rule_id: The ID of the rule to get
1962+
:type rule_id: Union[int, Snowflake]
1963+
:return: A AutoMod rule
1964+
:rtype: AutoModerationRule
1965+
"""
1966+
if not self._client:
1967+
raise LibraryException(code=13)
1968+
1969+
from .gw import AutoModerationRule
1970+
1971+
res = await self._client.get_auto_moderation_rule(int(self.id), int(rule_id))
1972+
1973+
return AutoModerationRule(**res)
1974+
1975+
async def create_auto_moderation_rule(
1976+
self,
1977+
name: str,
1978+
# event_type: int, # only 1 exists
1979+
trigger_type: AutoModTriggerType,
1980+
actions: List[AutoModAction],
1981+
trigger_metadata: Optional[AutoModTriggerMetadata] = MISSING,
1982+
enabled: Optional[bool] = False,
1983+
exempt_roles: Optional[List[int]] = MISSING,
1984+
exempt_channels: Optional[List[int]] = MISSING,
1985+
reason: Optional[str] = None,
1986+
) -> "AutoModerationRule": # noqa
1987+
"""
1988+
Creates an AutoMod rule
1989+
1990+
:param name: The name of the new rule.
1991+
:type name: str
1992+
:param trigger_type: The trigger type of the new rule.
1993+
:type trigger_type: AutoModTriggerType
1994+
:param trigger_metadata: The trigger metadata payload representation. This can be omitted based on the trigger type.
1995+
:type trigger_metadata: Optional[AutoModTriggerMetadata]
1996+
:param actions: The actions that will execute when the rule is triggered.
1997+
:type actions: List[AutoModAction]
1998+
:param enabled: Whether the rule will be enabled upon creation. False by default.
1999+
:type enabled: Optional[bool]
2000+
:param exempt_roles: The role IDs that are whitelisted by the rule, if given. The maximum is 20.
2001+
:type exempt_roles: Optional[List[int]]
2002+
:param exempt_channels: The channel IDs that are whitelisted by the rule, if given. The maximum is 20
2003+
:type exempt_channels: Optional[List[int]]
2004+
:param reason: The reason of the creation
2005+
:type reason: Optional[str]
2006+
:return: The new AutoMod rule
2007+
:rtype: AutoModerationRule
2008+
"""
2009+
2010+
if not self._client:
2011+
raise LibraryException(code=13)
2012+
2013+
from .gw import AutoModerationRule
2014+
2015+
event_type = 1
2016+
_actions = None if actions is MISSING else [_._json for _ in actions]
2017+
_trigger_metadata = None if trigger_metadata is MISSING else trigger_metadata._json
2018+
_trigger_type = (
2019+
None
2020+
if trigger_type is MISSING
2021+
else trigger_type
2022+
if isinstance(trigger_type, int)
2023+
else trigger_type.value
2024+
)
2025+
2026+
res = await self._client.create_auto_moderation_rule(
2027+
guild_id=int(self.id),
2028+
event_type=event_type,
2029+
actions=_actions,
2030+
trigger_type=_trigger_type,
2031+
trigger_metadata=_trigger_metadata,
2032+
name=name,
2033+
enabled=enabled,
2034+
exempt_roles=exempt_roles,
2035+
exempt_channels=exempt_channels,
2036+
reason=reason,
2037+
)
2038+
2039+
return AutoModerationRule(**res)
2040+
2041+
async def modify_auto_moderation_rule(
2042+
self,
2043+
rule: Union[int, Snowflake, "AutoModerationRule"], # noqa
2044+
name: str = MISSING,
2045+
# event_type: int, # only 1 exists
2046+
trigger_type: AutoModTriggerType = MISSING,
2047+
actions: List[AutoModAction] = MISSING,
2048+
trigger_metadata: Optional[AutoModTriggerMetadata] = MISSING,
2049+
enabled: Optional[bool] = MISSING,
2050+
exempt_roles: Optional[List[int]] = MISSING,
2051+
exempt_channels: Optional[List[int]] = MISSING,
2052+
reason: Optional[str] = None,
2053+
) -> "AutoModerationRule": # noqa
2054+
"""
2055+
Edits an AutoMod rule
2056+
2057+
:param rule: The rule to modify
2058+
:type rule: Union[int, Snowflake, AutoModerationRule]
2059+
:param name: The name of the new rule.
2060+
:type name: str
2061+
:param trigger_type: The trigger type of the new rule.
2062+
:type trigger_type: AutoModTriggerType
2063+
:param trigger_metadata: The trigger metadata payload representation. This can be omitted based on the trigger type.
2064+
:type trigger_metadata: Optional[AutoModTriggerMetadata]
2065+
:param actions: The actions that will execute when the rule is triggered.
2066+
:type actions: List[AutoModAction]
2067+
:param enabled: Whether the rule will be enabled upon creation. False by default.
2068+
:type enabled: Optional[bool]
2069+
:param exempt_roles: The role IDs that are whitelisted by the rule, if given. The maximum is 20.
2070+
:type exempt_roles: Optional[List[int]]
2071+
:param exempt_channels: The channel IDs that are whitelisted by the rule, if given. The maximum is 20
2072+
:type exempt_channels: Optional[List[int]]
2073+
:param reason: The reason of the creation
2074+
:type reason: Optional[str]
2075+
:return: The new AutoMod rule
2076+
:rtype: AutoModerationRule
2077+
"""
2078+
2079+
if not self._client:
2080+
raise LibraryException(code=13)
2081+
2082+
from .gw import AutoModerationRule
2083+
2084+
if isinstance(rule, (int, Snowflake)):
2085+
rule = await self.get_auto_moderation_rule(rule)
2086+
2087+
event_type = 1
2088+
2089+
_actions = actions if actions is not MISSING else [_._json for _ in rule.actions]
2090+
_trigger_type = trigger_type if trigger_type is not MISSING else rule.trigger_type
2091+
_trigger_metadata = (
2092+
trigger_metadata if trigger_metadata is not MISSING else rule.trigger_metadata._json
2093+
)
2094+
_name = name if name is not MISSING else rule.name
2095+
_enabled = enabled if enabled is not MISSING else rule.enabled
2096+
_exempt_roles = exempt_roles if exempt_roles is not MISSING else rule.exempt_roles
2097+
_exempt_channels = (
2098+
exempt_channels if exempt_channels is not MISSING else rule.exempt_channels
2099+
)
2100+
2101+
res = await self._client.create_auto_moderation_rule(
2102+
guild_id=int(self.id),
2103+
event_type=event_type,
2104+
actions=_actions,
2105+
trigger_type=_trigger_type,
2106+
trigger_metadata=_trigger_metadata,
2107+
name=_name,
2108+
enabled=_enabled,
2109+
exempt_roles=_exempt_roles,
2110+
exempt_channels=_exempt_channels,
2111+
reason=reason,
2112+
)
2113+
return AutoModerationRule(**res)
2114+
19352115
@property
19362116
def icon_url(self) -> Optional[str]:
19372117
"""

interactions/api/models/guild.pyi

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ from typing import Any, Dict, List, Optional, Union
44

55
from .attrs_utils import ClientSerializerMixin, DictSerializerMixin, define, MISSING
66
from .channel import Channel, ChannelType, Thread
7+
from .gw import AutoModerationRule
78
from .member import Member
89
from .message import Emoji, Sticker
9-
from .misc import Image, Overwrite, Snowflake
10+
from .misc import Image, Overwrite, Snowflake, AutoModTriggerType, AutoModAction, AutoModTriggerMetadata
1011
from .presence import PresenceActivity
1112
from .role import Role
1213
from .team import Application
@@ -394,6 +395,31 @@ class Guild(ClientSerializerMixin):
394395
async def search_members(self, query: str, limit: Optional[int] = ...) -> List[Member]: ...
395396
async def get_all_members(self) -> List[Member]: ...
396397
async def get_webhooks(self) -> List[Webhook]: ...
398+
async def list_auto_moderation_rules(self) -> List[AutoModerationRule]: ...
399+
async def get_auto_moderation_rule(self, rule_id: Union[int, Snowflake]) -> AutoModerationRule: ...
400+
async def create_auto_moderation_rule(
401+
self,
402+
name: str,
403+
trigger_type: AutoModTriggerType,
404+
actions: List[AutoModAction],
405+
trigger_metadata: Optional[AutoModTriggerMetadata] = MISSING,
406+
enabled: Optional[bool] = False,
407+
exempt_roles: Optional[List[int]] = MISSING,
408+
exempt_channels: Optional[List[int]] = MISSING,
409+
reason: Optional[str] = None
410+
) -> AutoModerationRule: ...
411+
async def modify_auto_moderation_rule(
412+
self,
413+
rule: Union[int, Snowflake, AutoModerationRule],
414+
name: str = MISSING,
415+
trigger_type: AutoModTriggerType = MISSING,
416+
actions: List[AutoModAction] = MISSING,
417+
trigger_metadata: Optional[AutoModTriggerMetadata] = MISSING,
418+
enabled: Optional[bool] = MISSING,
419+
exempt_roles: Optional[List[int]] = MISSING,
420+
exempt_channels: Optional[List[int]] = MISSING,
421+
reason: Optional[str] = None
422+
) -> AutoModerationRule: ...
397423
@property
398424
def icon_url(self) -> Optional[str]: ...
399425
@property

interactions/api/models/gw.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,14 @@
1515
from .guild import EventMetadata
1616
from .member import Member
1717
from .message import Embed, Emoji, Message, MessageInteraction, Sticker
18-
from .misc import AutoModAction, AutoModTriggerMetadata, ClientStatus, File, Snowflake
18+
from .misc import (
19+
AutoModAction,
20+
AutoModTriggerMetadata,
21+
AutoModTriggerType,
22+
ClientStatus,
23+
File,
24+
Snowflake,
25+
)
1926
from .presence import PresenceActivity
2027
from .role import Role
2128
from .team import Application
@@ -105,7 +112,7 @@ class AutoModerationRule(DictSerializerMixin):
105112
name: str = field()
106113
creator_id: Snowflake = field(converter=Snowflake)
107114
event_type: int = field()
108-
trigger_type: str = field()
115+
trigger_type: int = field(converter=AutoModTriggerType)
109116
trigger_metadata: AutoModTriggerMetadata = field(converter=AutoModTriggerMetadata)
110117
actions: List[AutoModAction] = field(converter=convert_list(AutoModAction))
111118
enabled: bool = field()

interactions/api/models/misc.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import datetime
99
from base64 import b64encode
10+
from enum import IntEnum
1011
from io import FileIO, IOBase
1112
from logging import Logger
1213
from math import floor
@@ -18,6 +19,8 @@
1819
from .attrs_utils import MISSING, DictSerializerMixin, define, field
1920

2021
__all__ = (
22+
"AutoModKeywordPresetTypes",
23+
"AutoModTriggerType",
2124
"AutoModMetaData",
2225
"AutoModAction",
2326
"AutoModTriggerMetadata",
@@ -177,6 +180,19 @@ class AutoModMetaData(DictSerializerMixin):
177180
duration_seconds: Optional[int] = field(default=None)
178181

179182

183+
class AutoModTriggerType(IntEnum):
184+
KEYWORD = 1
185+
HARMFUL_LINK = 2
186+
SPAM = 3
187+
KEYWORD_PRESET = 4
188+
189+
190+
class AutoModKeywordPresetTypes(IntEnum):
191+
PROFANITY = 1
192+
SEXUAL_CONTENT = 2
193+
SLURS = 3
194+
195+
180196
@define()
181197
class AutoModAction(DictSerializerMixin):
182198
"""

interactions/api/models/misc.pyi

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import datetime
22
from io import FileIO, IOBase
33
from logging import Logger
44
from typing import Optional, Union, List
5+
from enum import IntEnum
56

67
from interactions.api.models.attrs_utils import DictSerializerMixin, define
78

@@ -12,6 +13,17 @@ class AutoModMetaData(DictSerializerMixin):
1213
channel_id: Optional[Snowflake]
1314
duration_seconds: Optional[int]
1415

16+
class AutoModTriggerType(IntEnum):
17+
KEYWORD: int
18+
HARMFUL_LINK: int
19+
SPAM: int
20+
KEYWORD_PRESET: int
21+
22+
class AutoModKeywordPresetTypes(IntEnum):
23+
PROFANITY: int
24+
SEXUAL_CONTENT: int
25+
SLURS: int
26+
1527
@define()
1628
class AutoModAction(DictSerializerMixin):
1729
type: int

0 commit comments

Comments
 (0)