From 8cd4c1cb8ed66baa94bcf871ca6e5407215e74bf Mon Sep 17 00:00:00 2001 From: Misha133 <61027276+Misha-133@users.noreply.github.com> Date: Thu, 10 Aug 2023 16:05:03 +0300 Subject: [PATCH] Onboarding updates (#2729) --- src/Discord.Net.Core/DiscordErrorCode.cs | 7 +- .../Entities/Guilds/IGuild.cs | 8 +++ .../Guilds/Onboarding/GuildOnboardingMode.cs | 17 +++++ .../GuildOnboardingPromptOptionProperties.cs | 40 +++++++++++ .../GuildOnboardingPromptProperties.cs | 45 ++++++++++++ .../Onboarding/GuildOnboardingProperties.cs | 29 ++++++++ .../Guilds/Onboarding/IGuildOnboarding.cs | 17 +++++ .../Extensions/GuildOnboardingExtensions.cs | 39 ++++++++++ .../API/Common/GuildOnboarding.cs | 6 ++ .../API/Common/GuildOnboardingPromptOption.cs | 2 +- .../API/Rest/ModifyGuildOnboardingParams.cs | 71 +++++++++++++++++++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 9 +++ .../Entities/Guilds/GuildHelper.cs | 60 +++++++++++++--- .../Guilds/Onboarding/RestGuildOnboarding.cs | 28 +++++++- .../RestGuildOnboardingPromptOption.cs | 2 +- .../Entities/Guilds/RestGuild.cs | 12 ++++ .../Onboarding/SocketGuildOnboarding.cs | 32 ++++++++- .../SocketGuildOnboardingPromptOption.cs | 2 +- .../Entities/Guilds/SocketGuild.cs | 12 ++++ 19 files changed, 420 insertions(+), 18 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingMode.cs create mode 100644 src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingPromptOptionProperties.cs create mode 100644 src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingPromptProperties.cs create mode 100644 src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingProperties.cs create mode 100644 src/Discord.Net.Core/Extensions/GuildOnboardingExtensions.cs create mode 100644 src/Discord.Net.Rest/API/Rest/ModifyGuildOnboardingParams.cs diff --git a/src/Discord.Net.Core/DiscordErrorCode.cs b/src/Discord.Net.Core/DiscordErrorCode.cs index 29f1b9d1..5fc71f4b 100644 --- a/src/Discord.Net.Core/DiscordErrorCode.cs +++ b/src/Discord.Net.Core/DiscordErrorCode.cs @@ -231,7 +231,7 @@ namespace Discord StickerAnimationDurationTooLong = 170007, #endregion - #region Guild Scheduled Events + #region Guild Scheduled Events (180XXX) CannotUpdateFinishedEvent = 180000, FailedStageCreation = 180002, #endregion @@ -245,5 +245,10 @@ namespace Discord WebhookServicesCannotBeUsedInForumChannels = 220004, MessageBlockedByHarmfulLinksFilter = 240000, #endregion + + #region Onboarding (350XXX) + CannotEnableOnboardingUnmetRequirements = 350000, + CannotUpdateOnboardingBelowRequirements = 350001 + #endregion } } diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index e63b2de0..e434551d 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -1317,5 +1317,13 @@ namespace Discord /// A task that represents the asynchronous creation operation. The task result contains the created . /// Task GetOnboardingAsync(RequestOptions options = null); + + /// + /// Modifies the onboarding object configured for the guild. + /// + /// + /// A task that represents the asynchronous creation operation. The task result contains the modified . + /// + Task ModifyOnboardingAsync(Action props, RequestOptions options = null); } } diff --git a/src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingMode.cs b/src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingMode.cs new file mode 100644 index 00000000..f2d92dd6 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingMode.cs @@ -0,0 +1,17 @@ +namespace Discord; + +/// +/// Defines the criteria used to satisfy Onboarding constraints that are required for enabling. +/// +public enum GuildOnboardingMode +{ + /// + /// Counts only Default Channels towards constraints. + /// + Default = 0, + + /// + /// Counts Default Channels and Questions towards constraints. + /// + Advanced = 1, +} diff --git a/src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingPromptOptionProperties.cs b/src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingPromptOptionProperties.cs new file mode 100644 index 00000000..38d5cd80 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingPromptOptionProperties.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; + +namespace Discord; + +/// +/// Represents properties used to create or modify guild onboarding prompt option. +/// +public class GuildOnboardingPromptOptionProperties +{ + /// + /// Gets or sets the Id of the prompt option. If the value is a new prompt will be created. + /// The existing one will be updated otherwise. + /// + public ulong? Id { get; set; } + + /// + /// Gets or set IDs for channels a member is added to when the option is selected. + /// + public ulong[] ChannelIds { get; set; } + + /// + /// Gets or sets IDs for roles assigned to a member when the option is selected. + /// + public ulong[] RoleIds { get; set; } + + /// + /// Gets or sets the emoji of the option. + /// + public Optional Emoji { get; set; } + + /// + /// Gets or sets the title of the option. + /// + public string Title { get; set; } + + /// + /// Gets or sets the description of the option. + /// + public string Description { get; set; } +} diff --git a/src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingPromptProperties.cs b/src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingPromptProperties.cs new file mode 100644 index 00000000..c6885f36 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingPromptProperties.cs @@ -0,0 +1,45 @@ +using System.Collections.Generic; + +namespace Discord; + +/// +/// Represents properties used to create or modify guild onboarding prompt. +/// +public class GuildOnboardingPromptProperties +{ + /// + /// Gets or sets the Id of the prompt. If the value is a new prompt will be created. + /// The existing one will be updated otherwise. + /// + public ulong? Id { get; set; } + + /// + /// Gets or sets options available within the prompt. + /// + public GuildOnboardingPromptOptionProperties[] Options { get; set; } + + /// + /// Gets or sets the title of the prompt. + /// + public string Title { get; set; } + + /// + /// Gets or sets whether users are limited to selecting one option for the prompt. + /// + public bool IsSingleSelect { get; set; } + + /// + /// Gets or sets whether the prompt is required before a user completes the onboarding flow. + /// + public bool IsRequired { get; set; } + + /// + /// Gets or sets whether the prompt is present in the onboarding flow. + /// + public bool IsInOnboarding { get; set; } + + /// + /// Gets or set the type of the prompt. + /// + public GuildOnboardingPromptType Type { get; set; } +} diff --git a/src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingProperties.cs b/src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingProperties.cs new file mode 100644 index 00000000..62fe1e5f --- /dev/null +++ b/src/Discord.Net.Core/Entities/Guilds/Onboarding/GuildOnboardingProperties.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; + +namespace Discord; + +/// +/// Represents properties used to create or modify guild onboarding. +/// +public class GuildOnboardingProperties +{ + /// + /// Gets or sets prompts shown during onboarding and in customize community. + /// + public Optional Prompts { get; set; } + + /// + /// Gets or sets channel IDs that members get opted into automatically. + /// + public Optional ChannelIds { get; set; } + + /// + /// Gets or sets whether onboarding is enabled in the guild. + /// + public Optional IsEnabled { get; set; } + + /// + /// Gets or sets current mode of onboarding. + /// + public Optional Mode { get; set;} +} diff --git a/src/Discord.Net.Core/Entities/Guilds/Onboarding/IGuildOnboarding.cs b/src/Discord.Net.Core/Entities/Guilds/Onboarding/IGuildOnboarding.cs index 96edbba9..5107524c 100644 --- a/src/Discord.Net.Core/Entities/Guilds/Onboarding/IGuildOnboarding.cs +++ b/src/Discord.Net.Core/Entities/Guilds/Onboarding/IGuildOnboarding.cs @@ -1,4 +1,6 @@ +using System; using System.Collections.Generic; +using System.Threading.Tasks; namespace Discord; @@ -31,4 +33,19 @@ public interface IGuildOnboarding /// Gets whether onboarding is enabled in the guild. /// bool IsEnabled { get; } + + /// + /// Gets the current mode of onboarding. + /// + GuildOnboardingMode Mode { get; } + + /// + /// Gets whether the server does not meet requirements to enable guild onboarding. + /// + bool IsBelowRequirements { get; } + + /// + /// Modifies the onboarding object. + /// + Task ModifyAsync(Action props, RequestOptions options = null); } diff --git a/src/Discord.Net.Core/Extensions/GuildOnboardingExtensions.cs b/src/Discord.Net.Core/Extensions/GuildOnboardingExtensions.cs new file mode 100644 index 00000000..d42f7a1d --- /dev/null +++ b/src/Discord.Net.Core/Extensions/GuildOnboardingExtensions.cs @@ -0,0 +1,39 @@ +using System.Linq; + +namespace Discord; + +public static class GuildOnboardingExtensions +{ + public static GuildOnboardingProperties ToProperties(this IGuildOnboarding onboarding) + => new () + { + ChannelIds = onboarding.DefaultChannelIds.ToArray(), + IsEnabled = onboarding.IsEnabled, + Mode = onboarding.Mode, + Prompts = onboarding.Prompts.Select(x => x.ToProperties()).ToArray(), + }; + + public static GuildOnboardingPromptProperties ToProperties(this IGuildOnboardingPrompt prompt) + => new() + { + Id = prompt.Id, + Type = prompt.Type, + IsInOnboarding = prompt.IsInOnboarding, + IsRequired = prompt.IsRequired, + IsSingleSelect = prompt.IsSingleSelect, + Title = prompt.Title, + Options = prompt.Options.Select(x => x.ToProperties()).ToArray() + }; + + public static GuildOnboardingPromptOptionProperties ToProperties(this IGuildOnboardingPromptOption option) + => new() + { + Title = option.Title, + ChannelIds = option.ChannelIds.ToArray(), + Description = option.Description, + Emoji = Optional.Create(option.Emoji), + Id = option.Id, + RoleIds = option.RoleIds.ToArray(), + }; + +} diff --git a/src/Discord.Net.Rest/API/Common/GuildOnboarding.cs b/src/Discord.Net.Rest/API/Common/GuildOnboarding.cs index 898643b6..bf47ac2f 100644 --- a/src/Discord.Net.Rest/API/Common/GuildOnboarding.cs +++ b/src/Discord.Net.Rest/API/Common/GuildOnboarding.cs @@ -15,4 +15,10 @@ internal class GuildOnboarding [JsonProperty("enabled")] public bool Enabled { get; set; } + + [JsonProperty("mode")] + public GuildOnboardingMode Mode { get; set; } + + [JsonProperty("below_requirements")] + public bool IsBelowRequirements { get; set; } } diff --git a/src/Discord.Net.Rest/API/Common/GuildOnboardingPromptOption.cs b/src/Discord.Net.Rest/API/Common/GuildOnboardingPromptOption.cs index bae5dc30..e8313ff3 100644 --- a/src/Discord.Net.Rest/API/Common/GuildOnboardingPromptOption.cs +++ b/src/Discord.Net.Rest/API/Common/GuildOnboardingPromptOption.cs @@ -20,5 +20,5 @@ internal class GuildOnboardingPromptOption public string Title { get; set; } [JsonProperty("description")] - public Optional Description { get; set; } + public string Description { get; set; } } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildOnboardingParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildOnboardingParams.cs new file mode 100644 index 00000000..f0a5a659 --- /dev/null +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildOnboardingParams.cs @@ -0,0 +1,71 @@ +using Newtonsoft.Json; + +namespace Discord.API.Rest; + +internal class ModifyGuildOnboardingParams +{ + [JsonProperty("prompts")] + public Optional Prompts { get; set; } + + [JsonProperty("default_channel_ids")] + public Optional DefaultChannelIds { get; set; } + + [JsonProperty("enabled")] + public Optional Enabled { get; set; } + + [JsonProperty("mode")] + public Optional Mode { get; set; } +} + + +internal class GuildOnboardingPromptParams +{ + [JsonProperty("id")] + public ulong Id { get; set; } + + [JsonProperty("options")] + public GuildOnboardingPromptOptionParams[] Options { get; set; } + + [JsonProperty("title")] + public string Title { get; set; } + + [JsonProperty("single_select")] + public bool IsSingleSelect { get; set; } + + [JsonProperty("required")] + public bool IsRequired { get; set; } + + [JsonProperty("in_onboarding")] + public bool IsInOnboarding { get; set; } + + [JsonProperty("type")] + public GuildOnboardingPromptType Type { get; set; } +} + + +internal class GuildOnboardingPromptOptionParams +{ + [JsonProperty("id")] + public Optional Id { get; set; } + + [JsonProperty("channel_ids")] + public ulong[] ChannelIds { get; set; } + + [JsonProperty("role_ids")] + public ulong[] RoleIds { get; set; } + + [JsonProperty("emoji_name")] + public string EmojiName { get; set; } + + [JsonProperty("emoji_id")] + public ulong? EmojiId { get; set; } + + [JsonProperty("emoji_animated")] + public bool? EmojiAnimated { get; set; } + + [JsonProperty("title")] + public string Title { get; set; } + + [JsonProperty("description")] + public string Description { get; set; } +} diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index bb6760f7..1ab55528 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -2252,6 +2252,15 @@ namespace Discord.API return await SendAsync("GET", () => $"guilds/{guildId}/onboarding", new BucketIds(guildId: guildId), options: options); } + public async Task ModifyGuildOnboardingAsync(ulong guildId, ModifyGuildOnboardingParams args, RequestOptions options) + { + Preconditions.NotEqual(guildId, 0, nameof(guildId)); + + options = RequestOptions.CreateOrClone(options); + + return await SendJsonAsync("PUT", () => $"guilds/{guildId}/onboarding", args, new BucketIds(guildId: guildId), options: options); + } + #endregion #region Users diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index cae86f13..4d72e88f 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -1,11 +1,13 @@ using Discord.API; using Discord.API.Rest; + using System; using System.Collections.Generic; using System.Collections.Immutable; using System.IO; using System.Linq; using System.Threading.Tasks; + using ImageModel = Discord.API.Image; using Model = Discord.API.Guild; using RoleModel = Discord.API.Role; @@ -757,7 +759,7 @@ namespace Discord.Rest Preconditions.AtLeast(description.Length, 2, nameof(description)); Preconditions.AtMost(description.Length, 100, nameof(description)); } - + var tagString = string.Join(", ", tags); Preconditions.AtLeast(tagString.Length, 1, nameof(tags)); @@ -1125,7 +1127,7 @@ namespace Discord.Rest } if (args.TriggerType.Value is AutoModTriggerType.Keyword) - Preconditions.AtLeast(args.KeywordFilter.GetValueOrDefault(Array.Empty()).Length + args.RegexPatterns.GetValueOrDefault(Array.Empty()).Length, 1, "KeywordFilter & RegexPatterns","Auto moderation rule must have at least 1 keyword or regex pattern"); + Preconditions.AtLeast(args.KeywordFilter.GetValueOrDefault(Array.Empty()).Length + args.RegexPatterns.GetValueOrDefault(Array.Empty()).Length, 1, "KeywordFilter & RegexPatterns", "Auto moderation rule must have at least 1 keyword or regex pattern"); if (args.AllowList.IsSpecified) { @@ -1243,13 +1245,13 @@ namespace Discord.Rest || args.MentionLimit.IsSpecified || args.RegexPatterns.IsSpecified || args.AllowList.IsSpecified ? new API.TriggerMetadata - { - KeywordFilter = args.KeywordFilter.IsSpecified ? args.KeywordFilter : rule.KeywordFilter.ToArray(), - RegexPatterns = args.RegexPatterns.IsSpecified ? args.RegexPatterns : rule.RegexPatterns.ToArray(), - AllowList = args.AllowList.IsSpecified ? args.AllowList : rule.AllowList.ToArray(), - MentionLimit = args.MentionLimit.IsSpecified ? args.MentionLimit : rule.MentionTotalLimit ?? Optional.Unspecified, - Presets = args.Presets.IsSpecified ? args.Presets : rule.Presets.ToArray(), - } : Optional.Unspecified + { + KeywordFilter = args.KeywordFilter.IsSpecified ? args.KeywordFilter : rule.KeywordFilter.ToArray(), + RegexPatterns = args.RegexPatterns.IsSpecified ? args.RegexPatterns : rule.RegexPatterns.ToArray(), + AllowList = args.AllowList.IsSpecified ? args.AllowList : rule.AllowList.ToArray(), + MentionLimit = args.MentionLimit.IsSpecified ? args.MentionLimit : rule.MentionTotalLimit ?? Optional.Unspecified, + Presets = args.Presets.IsSpecified ? args.Presets : rule.Presets.ToArray(), + } : Optional.Unspecified }; return client.ApiClient.ModifyGuildAutoModRuleAsync(rule.GuildId, rule.Id, apiArgs, options); @@ -1264,6 +1266,46 @@ namespace Discord.Rest public static async Task GetGuildOnboardingAsync(IGuild guild, BaseDiscordClient client, RequestOptions options) => await client.ApiClient.GetGuildOnboardingAsync(guild.Id, options); + public static async Task ModifyGuildOnboardingAsync(IGuild guild, Action func, BaseDiscordClient client, RequestOptions options) + { + var props = new GuildOnboardingProperties(); + func(props); + + var args = new ModifyGuildOnboardingParams + { + DefaultChannelIds = props.ChannelIds.IsSpecified + ? props.ChannelIds.Value.ToArray() + : Optional.Unspecified, + Enabled = props.IsEnabled, + Mode = props.Mode, + Prompts = props.Prompts.IsSpecified ? props.Prompts.Value? + .Select(prompt => new GuildOnboardingPromptParams + { + Id = prompt.Id ?? 0, + Type = prompt.Type, + IsInOnboarding = prompt.IsInOnboarding, + IsRequired = prompt.IsRequired, + IsSingleSelect = prompt.IsSingleSelect, + Title = prompt.Title, + Options = prompt.Options? + .Select(option => new GuildOnboardingPromptOptionParams + { + Title = option.Title, + ChannelIds = option.ChannelIds?.ToArray(), + RoleIds = option.RoleIds?.ToArray(), + Description = option.Description, + EmojiName = option.Emoji.GetValueOrDefault(null)?.Name, + EmojiId = option.Emoji.GetValueOrDefault(null) is Emote emote ? emote.Id : null, + EmojiAnimated = option.Emoji.GetValueOrDefault(null) is Emote emt ? emt.Animated : null, + Id = option.Id ?? Optional.Unspecified, + }).ToArray(), + }).ToArray() + : Optional.Unspecified, + }; + + return await client.ApiClient.ModifyGuildOnboardingAsync(guild.Id, args, options); + } + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Guilds/Onboarding/RestGuildOnboarding.cs b/src/Discord.Net.Rest/Entities/Guilds/Onboarding/RestGuildOnboarding.cs index d0c4c14b..7b446249 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/Onboarding/RestGuildOnboarding.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/Onboarding/RestGuildOnboarding.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; +using System.Threading.Tasks; using Model = Discord.API.GuildOnboarding; namespace Discord.Rest; @@ -9,6 +10,8 @@ namespace Discord.Rest; /// public class RestGuildOnboarding : IGuildOnboarding { + internal BaseDiscordClient Discord; + /// public ulong GuildId { get; private set; } @@ -21,17 +24,38 @@ public class RestGuildOnboarding : IGuildOnboarding /// public bool IsEnabled { get; private set; } + /// + public GuildOnboardingMode Mode { get; private set; } + + /// + public bool IsBelowRequirements { get; private set; } + /// public IReadOnlyCollection Prompts { get; private set; } internal RestGuildOnboarding(BaseDiscordClient discord, Model model, RestGuild guild = null) + { + Discord = discord; + Guild = guild; + Update(model); + } + + internal void Update(Model model) { GuildId = model.GuildId; DefaultChannelIds = model.DefaultChannelIds.ToImmutableArray(); IsEnabled = model.Enabled; + Mode = model.Mode; + IsBelowRequirements = model.IsBelowRequirements; + Prompts = model.Prompts.Select(prompt => new RestGuildOnboardingPrompt(Discord, prompt.Id, prompt)).ToImmutableArray(); + } - Guild = guild; - Prompts = model.Prompts.Select(prompt => new RestGuildOnboardingPrompt(discord, prompt.Id, prompt)).ToImmutableArray(); + /// + public async Task ModifyAsync(Action props, RequestOptions options = null) + { + var model = await GuildHelper.ModifyGuildOnboardingAsync(Guild, props, Discord, options); + + Update(model); } #region IGuildOnboarding diff --git a/src/Discord.Net.Rest/Entities/Guilds/Onboarding/RestGuildOnboardingPromptOption.cs b/src/Discord.Net.Rest/Entities/Guilds/Onboarding/RestGuildOnboardingPromptOption.cs index 5323a8ce..513c836c 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/Onboarding/RestGuildOnboardingPromptOption.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/Onboarding/RestGuildOnboardingPromptOption.cs @@ -32,7 +32,7 @@ public class RestGuildOnboardingPromptOption : RestEntity, IGuildOnboardi ChannelIds = model.ChannelIds.ToImmutableArray(); RoleIds = model.RoleIds.ToImmutableArray(); Title = model.Title; - Description = model.Description.IsSpecified ? model.Description.Value : null; + Description = model.Description; if (model.Emoji.Id.HasValue) { diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index a2bd23e2..a5f79d5a 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -1246,6 +1246,14 @@ namespace Discord.Rest return new RestGuildOnboarding(Discord, model, this); } + /// + public async Task ModifyOnboardingAsync(Action props, RequestOptions options = null) + { + var model = await GuildHelper.ModifyGuildOnboardingAsync(this, props, Discord, options); + + return new RestGuildOnboarding(Discord, model, this); + } + #endregion #region IGuild @@ -1609,6 +1617,10 @@ namespace Discord.Rest async Task IGuild.GetOnboardingAsync(RequestOptions options) => await GetOnboardingAsync(options); + /// + async Task IGuild.ModifyOnboardingAsync(Action props, RequestOptions options) + => await ModifyOnboardingAsync(props, options); + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/Onboarding/SocketGuildOnboarding.cs b/src/Discord.Net.WebSocket/Entities/Guilds/Onboarding/SocketGuildOnboarding.cs index a9d85b7d..404943d5 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/Onboarding/SocketGuildOnboarding.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/Onboarding/SocketGuildOnboarding.cs @@ -1,6 +1,9 @@ +using Discord.Rest; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; +using System.Threading.Tasks; using Model = Discord.API.GuildOnboarding; namespace Discord.WebSocket; @@ -8,6 +11,8 @@ namespace Discord.WebSocket; /// public class SocketGuildOnboarding : IGuildOnboarding { + internal DiscordSocketClient Discord; + /// public ulong GuildId { get; private set; } @@ -28,17 +33,38 @@ public class SocketGuildOnboarding : IGuildOnboarding /// public bool IsEnabled { get; private set; } + /// + public bool IsBelowRequirements { get; private set; } + + /// + public GuildOnboardingMode Mode { get; private set; } + internal SocketGuildOnboarding(DiscordSocketClient discord, Model model, SocketGuild guild) { - GuildId = model.GuildId; + Discord = discord; Guild = guild; + Update(model); + } + + internal void Update(Model model) + { + GuildId = model.GuildId; IsEnabled = model.Enabled; + Mode = model.Mode; + IsBelowRequirements = model.IsBelowRequirements; DefaultChannelIds = model.DefaultChannelIds; + DefaultChannels = model.DefaultChannelIds.Select(Guild.GetChannel).ToImmutableArray(); - DefaultChannels = model.DefaultChannelIds.Select(guild.GetChannel).ToImmutableArray(); - Prompts = model.Prompts.Select(x => new SocketGuildOnboardingPrompt(discord, x.Id, x, guild)).ToImmutableArray(); + Prompts = model.Prompts.Select(x => new SocketGuildOnboardingPrompt(Discord, x.Id, x, Guild)).ToImmutableArray(); + } + /// + public async Task ModifyAsync(Action props, RequestOptions options = null) + { + var model = await GuildHelper.ModifyGuildOnboardingAsync(Guild, props, Discord, options); + + Update(model); } #region IGuildOnboarding diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/Onboarding/SocketGuildOnboardingPromptOption.cs b/src/Discord.Net.WebSocket/Entities/Guilds/Onboarding/SocketGuildOnboardingPromptOption.cs index 770f4cc3..4e96a9f6 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/Onboarding/SocketGuildOnboardingPromptOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/Onboarding/SocketGuildOnboardingPromptOption.cs @@ -43,7 +43,7 @@ public class SocketGuildOnboardingPromptOption : SocketEntity, IGuildOnbo ChannelIds = model.ChannelIds.ToImmutableArray(); RoleIds = model.RoleIds.ToImmutableArray(); Title = model.Title; - Description = model.Description.IsSpecified ? model.Description.Value : null; + Description = model.Description; if (model.Emoji.Id.HasValue) { diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 9180ad92..c69600ab 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -1950,6 +1950,14 @@ namespace Discord.WebSocket return new SocketGuildOnboarding(Discord, model, this); } + /// + public async Task ModifyOnboardingAsync(Action props, RequestOptions options = null) + { + var model = await GuildHelper.ModifyGuildOnboardingAsync(this, props, Discord, options); + + return new SocketGuildOnboarding(Discord, model, this); + } + #endregion #region IGuild @@ -2214,6 +2222,10 @@ namespace Discord.WebSocket async Task IGuild.GetOnboardingAsync(RequestOptions options) => await GetOnboardingAsync(options); + /// + async Task IGuild.ModifyOnboardingAsync(Action props, RequestOptions options) + => await ModifyOnboardingAsync(props, options); + #endregion } }