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
}
}