Skip to content

Commit 851c857

Browse files
SoheabRapptz
andauthored
Add support for guild incidents
Co-authored-by: Danny <[email protected]>
1 parent 62a70c2 commit 851c857

File tree

3 files changed

+94
-0
lines changed

3 files changed

+94
-0
lines changed

discord/guild.py

+85
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
Guild as GuildPayload,
110110
RolePositionUpdate as RolePositionUpdatePayload,
111111
GuildFeature,
112+
IncidentData,
112113
)
113114
from .types.threads import (
114115
Thread as ThreadPayload,
@@ -320,6 +321,7 @@ class Guild(Hashable):
320321
'premium_progress_bar_enabled',
321322
'_safety_alerts_channel_id',
322323
'max_stage_video_users',
324+
'_incidents_data',
323325
)
324326

325327
_PREMIUM_GUILD_LIMITS: ClassVar[Dict[Optional[int], _GuildLimit]] = {
@@ -509,6 +511,7 @@ def _from_data(self, guild: GuildPayload) -> None:
509511
self.owner_id: Optional[int] = utils._get_as_snowflake(guild, 'owner_id')
510512
self._large: Optional[bool] = None if self._member_count is None else self._member_count >= 250
511513
self._afk_channel_id: Optional[int] = utils._get_as_snowflake(guild, 'afk_channel_id')
514+
self._incidents_data: Optional[IncidentData] = guild.get('incidents_data')
512515

513516
if 'channels' in guild:
514517
channels = guild['channels']
@@ -1843,6 +1846,8 @@ async def edit(
18431846
mfa_level: MFALevel = MISSING,
18441847
raid_alerts_disabled: bool = MISSING,
18451848
safety_alerts_channel: TextChannel = MISSING,
1849+
invites_disabled_until: datetime.datetime = MISSING,
1850+
dms_disabled_until: datetime.datetime = MISSING,
18461851
) -> Guild:
18471852
r"""|coro|
18481853
@@ -1969,6 +1974,18 @@ async def edit(
19691974
19701975
.. versionadded:: 2.3
19711976
1977+
invites_disabled_until: Optional[:class:`datetime.datetime`]
1978+
The time when invites should be enabled again, or ``None`` to disable the action.
1979+
This must be a timezone-aware datetime object. Consider using :func:`utils.utcnow`.
1980+
1981+
.. versionadded:: 2.4
1982+
1983+
dms_disabled_until: Optional[:class:`datetime.datetime`]
1984+
The time when direct messages should be allowed again, or ``None`` to disable the action.
1985+
This must be a timezone-aware datetime object. Consider using :func:`utils.utcnow`.
1986+
1987+
.. versionadded:: 2.4
1988+
19721989
Raises
19731990
-------
19741991
Forbidden
@@ -2157,6 +2174,30 @@ async def edit(
21572174

21582175
await http.edit_guild_mfa_level(self.id, mfa_level=mfa_level.value)
21592176

2177+
incident_actions_payload: IncidentData = {}
2178+
if invites_disabled_until is not MISSING:
2179+
if invites_disabled_until is None:
2180+
incident_actions_payload['invites_disabled_until'] = None
2181+
else:
2182+
if invites_disabled_until.tzinfo is None:
2183+
raise TypeError(
2184+
'invites_disabled_until must be an aware datetime. Consider using discord.utils.utcnow() or datetime.datetime.now().astimezone() for local time.'
2185+
)
2186+
incident_actions_payload['invites_disabled_until'] = invites_disabled_until.isoformat()
2187+
2188+
if dms_disabled_until is not MISSING:
2189+
if dms_disabled_until is None:
2190+
incident_actions_payload['dms_disabled_until'] = None
2191+
else:
2192+
if dms_disabled_until.tzinfo is None:
2193+
raise TypeError(
2194+
'dms_disabled_until must be an aware datetime. Consider using discord.utils.utcnow() or datetime.datetime.now().astimezone() for local time.'
2195+
)
2196+
incident_actions_payload['dms_disabled_until'] = dms_disabled_until.isoformat()
2197+
2198+
if incident_actions_payload:
2199+
await http.edit_incident_actions(self.id, payload=incident_actions_payload)
2200+
21602201
data = await http.edit_guild(self.id, reason=reason, **fields)
21612202
return Guild(data=data, state=self._state)
21622203

@@ -4292,3 +4333,47 @@ async def create_automod_rule(
42924333
)
42934334

42944335
return AutoModRule(data=data, guild=self, state=self._state)
4336+
4337+
@property
4338+
def invites_paused_until(self) -> Optional[datetime.datetime]:
4339+
"""Optional[:class:`datetime.datetime`]: If invites are paused, returns when
4340+
invites will get enabled in UTC, otherwise returns None.
4341+
4342+
.. versionadded:: 2.4
4343+
"""
4344+
if not self._incidents_data:
4345+
return None
4346+
4347+
return utils.parse_time(self._incidents_data.get('invites_disabled_until'))
4348+
4349+
@property
4350+
def dms_paused_until(self) -> Optional[datetime.datetime]:
4351+
"""Optional[:class:`datetime.datetime`]: If DMs are paused, returns when DMs
4352+
will get enabled in UTC, otherwise returns None.
4353+
4354+
.. versionadded:: 2.4
4355+
"""
4356+
if not self._incidents_data:
4357+
return None
4358+
4359+
return utils.parse_time(self._incidents_data.get('dms_disabled_until'))
4360+
4361+
def invites_paused(self) -> bool:
4362+
""":class:`bool`: Whether invites are paused in the guild.
4363+
4364+
.. versionadded:: 2.4
4365+
"""
4366+
if not self.invites_paused_until:
4367+
return False
4368+
4369+
return self.invites_paused_until > utils.utcnow()
4370+
4371+
def dms_paused(self) -> bool:
4372+
""":class:`bool`: Whether DMs are paused in the guild.
4373+
4374+
.. versionadded:: 2.4
4375+
"""
4376+
if not self.dms_paused_until:
4377+
return False
4378+
4379+
return self.dms_paused_until > utils.utcnow()

discord/http.py

+3
Original file line numberDiff line numberDiff line change
@@ -1764,6 +1764,9 @@ def edit_widget(
17641764
) -> Response[widget.WidgetSettings]:
17651765
return self.request(Route('PATCH', '/guilds/{guild_id}/widget', guild_id=guild_id), json=payload, reason=reason)
17661766

1767+
def edit_incident_actions(self, guild_id: Snowflake, payload: guild.IncidentData) -> Response[guild.IncidentData]:
1768+
return self.request(Route('PUT', '/guilds/{guild_id}/incident-actions', guild_id=guild_id), json=payload)
1769+
17671770
# Invite management
17681771

17691772
def create_invite(

discord/types/guild.py

+6
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ class UnavailableGuild(TypedDict):
4949
unavailable: NotRequired[bool]
5050

5151

52+
class IncidentData(TypedDict):
53+
invites_disabled_until: NotRequired[Optional[str]]
54+
dms_disabled_until: NotRequired[Optional[str]]
55+
56+
5257
DefaultMessageNotificationLevel = Literal[0, 1]
5358
ExplicitContentFilterLevel = Literal[0, 1, 2]
5459
MFALevel = Literal[0, 1]
@@ -97,6 +102,7 @@ class _BaseGuildPreview(UnavailableGuild):
97102
stickers: List[GuildSticker]
98103
features: List[GuildFeature]
99104
description: Optional[str]
105+
incidents_data: Optional[IncidentData]
100106

101107

102108
class _GuildPreviewUnique(TypedDict):

0 commit comments

Comments
 (0)