From 9b36df3c55efe2cc9d3c587e04e0bca2cebc2e3e Mon Sep 17 00:00:00 2001
From: Mihail Gribkov <61027276+Misha-133@users.noreply.github.com>
Date: Thu, 2 Nov 2023 09:18:29 +0300
Subject: [PATCH] [Feature] Guild incident actions (#2783)
* initial commit
* notes
---
.../Entities/Guilds/GuildIncidentsData.cs | 16 ++++++++++++++
.../Guilds/GuildIncidentsDataProperties.cs | 22 +++++++++++++++++++
.../Entities/Guilds/IGuild.cs | 13 +++++++++++
src/Discord.Net.Rest/API/Common/Guild.cs | 3 +++
.../API/Common/GuildIncidentsData.cs | 13 +++++++++++
.../Rest/ModifyGuildIncidentsDataParams.cs | 13 +++++++++++
src/Discord.Net.Rest/DiscordRestApiClient.cs | 10 +++++++++
.../Entities/Guilds/GuildHelper.cs | 18 +++++++++++++++
.../Entities/Guilds/RestGuild.cs | 16 ++++++++++++++
.../Entities/Guilds/SocketGuild.cs | 10 +++++++++
10 files changed, 134 insertions(+)
create mode 100644 src/Discord.Net.Core/Entities/Guilds/GuildIncidentsData.cs
create mode 100644 src/Discord.Net.Core/Entities/Guilds/GuildIncidentsDataProperties.cs
create mode 100644 src/Discord.Net.Rest/API/Common/GuildIncidentsData.cs
create mode 100644 src/Discord.Net.Rest/API/Rest/ModifyGuildIncidentsDataParams.cs
diff --git a/src/Discord.Net.Core/Entities/Guilds/GuildIncidentsData.cs b/src/Discord.Net.Core/Entities/Guilds/GuildIncidentsData.cs
new file mode 100644
index 00000000..0bd8b25c
--- /dev/null
+++ b/src/Discord.Net.Core/Entities/Guilds/GuildIncidentsData.cs
@@ -0,0 +1,16 @@
+using System;
+
+namespace Discord;
+
+public class GuildIncidentsData
+{
+ ///
+ /// Gets the time when invites get enabled again. if invites are not disabled.
+ ///
+ public DateTimeOffset? InvitesDisabledUntil { get; set; }
+
+ ///
+ /// Gets the time when DMs get enabled again. if DMs are not disabled.
+ ///
+ public DateTimeOffset? DmsDisabledUntil { get; set; }
+}
diff --git a/src/Discord.Net.Core/Entities/Guilds/GuildIncidentsDataProperties.cs b/src/Discord.Net.Core/Entities/Guilds/GuildIncidentsDataProperties.cs
new file mode 100644
index 00000000..7855fa2b
--- /dev/null
+++ b/src/Discord.Net.Core/Entities/Guilds/GuildIncidentsDataProperties.cs
@@ -0,0 +1,22 @@
+using System;
+
+namespace Discord;
+
+public class GuildIncidentsDataProperties
+{
+ ///
+ /// Gets or set when invites get enabled again, up to 24 hours in the future.
+ ///
+ ///
+ /// Set to to enable invites.
+ ///
+ public Optional InvitesDisabledUntil { get; set; }
+
+ ///
+ /// Gets or set when dms get enabled again, up to 24 hours in the future.
+ ///
+ ///
+ /// Set to to enable dms.
+ ///
+ public Optional DmsDisabledUntil { get; set; }
+}
diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs
index e434551d..dfde4d82 100644
--- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs
+++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs
@@ -376,6 +376,11 @@ namespace Discord
///
ulong MaxUploadLimit { get; }
+ ///
+ /// Gets the incidents data for this guild.
+ ///
+ GuildIncidentsData IncidentsData { get; }
+
///
/// Modifies this guild.
///
@@ -1325,5 +1330,13 @@ namespace Discord
/// A task that represents the asynchronous creation operation. The task result contains the modified .
///
Task ModifyOnboardingAsync(Action props, RequestOptions options = null);
+
+ ///
+ /// Modifies the incident actions of the guild.
+ ///
+ ///
+ /// A task that represents the asynchronous creation operation. The task result contains the modified .
+ ///
+ Task ModifyIncidentActionsAsync(Action props, RequestOptions options = null);
}
}
diff --git a/src/Discord.Net.Rest/API/Common/Guild.cs b/src/Discord.Net.Rest/API/Common/Guild.cs
index 995a60fc..67a0c9b2 100644
--- a/src/Discord.Net.Rest/API/Common/Guild.cs
+++ b/src/Discord.Net.Rest/API/Common/Guild.cs
@@ -91,5 +91,8 @@ namespace Discord.API
[JsonProperty("max_stage_video_channel_users")]
public Optional MaxStageVideoChannelUsers { get; set; }
+
+ [JsonProperty("incidents_data")]
+ public GuildIncidentsData IncidentsData { get; set; }
}
}
diff --git a/src/Discord.Net.Rest/API/Common/GuildIncidentsData.cs b/src/Discord.Net.Rest/API/Common/GuildIncidentsData.cs
new file mode 100644
index 00000000..5b8d02e4
--- /dev/null
+++ b/src/Discord.Net.Rest/API/Common/GuildIncidentsData.cs
@@ -0,0 +1,13 @@
+using Newtonsoft.Json;
+using System;
+
+namespace Discord.API;
+
+internal class GuildIncidentsData
+{
+ [JsonProperty("invites_disabled_until")]
+ public DateTimeOffset? InvitesDisabledUntil { get; set; }
+
+ [JsonProperty("dms_disabled_until")]
+ public DateTimeOffset? DmsDisabledUntil { get; set; }
+}
diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildIncidentsDataParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildIncidentsDataParams.cs
new file mode 100644
index 00000000..1d3302ed
--- /dev/null
+++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildIncidentsDataParams.cs
@@ -0,0 +1,13 @@
+using Newtonsoft.Json;
+using System;
+
+namespace Discord.API.Rest;
+
+internal class ModifyGuildIncidentsDataParams
+{
+ [JsonProperty("invites_disabled_until")]
+ public Optional InvitesDisabledUntil { get; set; }
+
+ [JsonProperty("dms_disabled_until")]
+ public Optional DmsDisabledUntil { get; set; }
+}
diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs
index 4a6d6274..a75b5c83 100644
--- a/src/Discord.Net.Rest/DiscordRestApiClient.cs
+++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs
@@ -1651,6 +1651,16 @@ namespace Discord.API
var ids = new BucketIds(guildId: guildId);
return await SendAsync("GET", () => $"guilds/{guildId}/prune?days={args.Days}{endpointRoleIds}", ids, options: options).ConfigureAwait(false);
}
+
+ public async Task ModifyGuildIncidentActionsAsync(ulong guildId, ModifyGuildIncidentsDataParams args, RequestOptions options = null)
+ {
+ Preconditions.NotEqual(guildId, 0, nameof(guildId));
+
+ var ids = new BucketIds(guildId: guildId);
+
+ return await SendJsonAsync("PUT", () => $"guilds/{guildId}/incident-actions", args, ids, options: options).ConfigureAwait(false);
+ }
+
#endregion
#region Guild Bans
diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs
index 4d72e88f..d837b8b9 100644
--- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs
+++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs
@@ -147,6 +147,24 @@ namespace Discord.Rest
var mebibyte = Math.Pow(2, 20);
return (ulong)(tierFactor * mebibyte);
}
+
+ public static async Task ModifyGuildIncidentActionsAsync(IGuild guild, BaseDiscordClient client, Action func, RequestOptions options = null)
+ {
+ var props = new GuildIncidentsDataProperties();
+ func(props);
+
+ var args = props.DmsDisabledUntil.IsSpecified || props.InvitesDisabledUntil.IsSpecified
+ ? new ModifyGuildIncidentsDataParams { DmsDisabledUntil = props.DmsDisabledUntil, InvitesDisabledUntil = props.InvitesDisabledUntil }
+ : null;
+
+ var model = await client.ApiClient.ModifyGuildIncidentActionsAsync(guild.Id, args, options);
+
+ return new GuildIncidentsData
+ {
+ DmsDisabledUntil = model.DmsDisabledUntil,
+ InvitesDisabledUntil = model.InvitesDisabledUntil
+ };
+ }
#endregion
#region Bans
diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs
index a5f79d5a..880e97dc 100644
--- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs
+++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs
@@ -115,6 +115,9 @@ namespace Discord.Rest
///
public GuildFeatures Features { get; private set; }
+ ///
+ public GuildIncidentsData IncidentsData { get; private set; }
+
///
public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id);
@@ -181,6 +184,10 @@ namespace Discord.Rest
Description = model.Description;
PremiumSubscriptionCount = model.PremiumSubscriptionCount.GetValueOrDefault();
NsfwLevel = model.NsfwLevel;
+ IncidentsData = model.IncidentsData is not null
+ ? new GuildIncidentsData { DmsDisabledUntil = model.IncidentsData.DmsDisabledUntil, InvitesDisabledUntil = model.IncidentsData.InvitesDisabledUntil }
+ : new GuildIncidentsData();
+
if (model.MaxPresences.IsSpecified)
MaxPresences = model.MaxPresences.Value ?? 25000;
if (model.MaxMembers.IsSpecified)
@@ -303,6 +310,15 @@ namespace Discord.Rest
///
public Task LeaveAsync(RequestOptions options = null)
=> GuildHelper.LeaveAsync(this, Discord, options);
+
+ ///
+ public async Task ModifyIncidentActionsAsync(Action props, RequestOptions options = null)
+ {
+ IncidentsData = await GuildHelper.ModifyGuildIncidentActionsAsync(this, Discord, props, options);
+
+ return IncidentsData;
+ }
+
#endregion
#region Interactions
diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
index c69600ab..8e814571 100644
--- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
+++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
@@ -143,6 +143,8 @@ namespace Discord.WebSocket
public bool IsBoostProgressBarEnabled { get; private set; }
///
public GuildFeatures Features { get; private set; }
+ ///
+ public GuildIncidentsData IncidentsData { get; private set; }
///
public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id);
@@ -560,6 +562,9 @@ namespace Discord.WebSocket
PreferredCulture = PreferredLocale == null ? null : new CultureInfo(PreferredLocale);
if (model.IsBoostProgressBarEnabled.IsSpecified)
IsBoostProgressBarEnabled = model.IsBoostProgressBarEnabled.Value;
+ IncidentsData = model.IncidentsData is not null
+ ? new GuildIncidentsData { DmsDisabledUntil = model.IncidentsData.DmsDisabledUntil, InvitesDisabledUntil = model.IncidentsData.InvitesDisabledUntil }
+ : new GuildIncidentsData();
if (model.Emojis != null)
{
var emojis = ImmutableArray.CreateBuilder(model.Emojis.Length);
@@ -656,6 +661,11 @@ namespace Discord.WebSocket
///
public Task LeaveAsync(RequestOptions options = null)
=> GuildHelper.LeaveAsync(this, Discord, options);
+
+ ///
+ public Task ModifyIncidentActionsAsync(Action props, RequestOptions options = null)
+ => GuildHelper.ModifyGuildIncidentActionsAsync(this, Discord, props, options);
+
#endregion
#region Bans