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