From 177df2ce709e0dce99492a25af4be1d938f782e1 Mon Sep 17 00:00:00 2001 From: Misha133 <61027276+Misha-133@users.noreply.github.com> Date: Sun, 19 Feb 2023 23:41:14 +0300 Subject: [PATCH] [Feature] Modify guild features (#2605) * initial commit * Update src/Discord.Net.Core/Entities/Guilds/GuildProperties.cs --------- Co-authored-by: Casmir <68127614+csmir@users.noreply.github.com> --- .../Entities/Guilds/GuildFeature.cs | 12 ++++- .../Entities/Guilds/GuildProperties.cs | 5 ++ .../API/Rest/ModifyGuildParams.cs | 2 + .../Entities/Guilds/GuildHelper.cs | 3 +- .../Net/Converters/GuildFeaturesConverter.cs | 46 ++++++++++++++++++- 5 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Guilds/GuildFeature.cs b/src/Discord.Net.Core/Entities/Guilds/GuildFeature.cs index 8ec3ee2ae..e5a2feb80 100644 --- a/src/Discord.Net.Core/Entities/Guilds/GuildFeature.cs +++ b/src/Discord.Net.Core/Entities/Guilds/GuildFeature.cs @@ -34,11 +34,11 @@ namespace Discord /// Commerce = 1L << 4, /// - /// The guild can enable welcome screen, Membership Screening, stage channels and discovery, and receives community updates. + /// The guild can enable welcome screen, Membership Screening, stage channels and discovery, and receives community updates. This feature is mutable. /// Community = 1L << 5, /// - /// The guild is able to be discovered in the directory. + /// The guild is able to be discovered in the directory. This feature is mutable. /// Discoverable = 1L << 6, /// @@ -185,5 +185,13 @@ namespace Discord /// The guild has been set as a support server on the App Directory. /// DeveloperSupportServer = 1L << 42, + /// + /// The guild has invites disabled. This feature is mutable. + /// + InvitesDisabled = 1L << 43, + /// + /// The guild has auto moderation enabled. + /// + AutoModeration = 1L << 44 } } diff --git a/src/Discord.Net.Core/Entities/Guilds/GuildProperties.cs b/src/Discord.Net.Core/Entities/Guilds/GuildProperties.cs index d50b2ac38..19bbb8f90 100644 --- a/src/Discord.Net.Core/Entities/Guilds/GuildProperties.cs +++ b/src/Discord.Net.Core/Entities/Guilds/GuildProperties.cs @@ -113,5 +113,10 @@ namespace Discord /// Gets or sets if the boost progress bar is enabled. /// public Optional IsBoostProgressBarEnabled { get; set; } + + /// + /// Gets or sets the guild features enabled in this guild. Features that are not mutable will be ignored. + /// + public Optional Features { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildParams.cs index c1a20cb83..4324fda4e 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildParams.cs @@ -37,5 +37,7 @@ namespace Discord.API.Rest public string PreferredLocale { get; set; } [JsonProperty("premium_progress_bar_enabled")] public Optional IsBoostProgressBarEnabled { get; set; } + [JsonProperty("features")] + public Optional GuildFeatures { get; set; } } } diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index 552cb9284..15005f7eb 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -39,7 +39,8 @@ namespace Discord.Rest VerificationLevel = args.VerificationLevel, ExplicitContentFilter = args.ExplicitContentFilter, SystemChannelFlags = args.SystemChannelFlags, - IsBoostProgressBarEnabled = args.IsBoostProgressBarEnabled + IsBoostProgressBarEnabled = args.IsBoostProgressBarEnabled, + GuildFeatures = args.Features.IsSpecified ? new GuildFeatures(args.Features.Value, Array.Empty()) : Optional.Create(), }; if (apiArgs.Banner.IsSpecified) diff --git a/src/Discord.Net.Rest/Net/Converters/GuildFeaturesConverter.cs b/src/Discord.Net.Rest/Net/Converters/GuildFeaturesConverter.cs index 308424399..26884d446 100644 --- a/src/Discord.Net.Rest/Net/Converters/GuildFeaturesConverter.cs +++ b/src/Discord.Net.Rest/Net/Converters/GuildFeaturesConverter.cs @@ -2,6 +2,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; +using System.Text; namespace Discord.Net.Converters { @@ -36,9 +37,52 @@ namespace Discord.Net.Converters return new GuildFeatures(features, experimental.ToArray()); } + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { - throw new NotImplementedException(); + var guildFeatures = (GuildFeatures)value; + + var enumValues = Enum.GetValues(typeof(GuildFeature)); + + writer.WriteStartArray(); + + foreach (var enumValue in enumValues) + { + var val = (GuildFeature)enumValue; + if (val is GuildFeature.None) + continue; + + if (guildFeatures.Value.HasFlag(val)) + { + writer.WriteValue(FeatureToApiString(val)); + } + } + writer.WriteEndArray(); + } + + private string FeatureToApiString(GuildFeature feature) + { + var builder = new StringBuilder(); + var firstChar = true; + + foreach (var c in feature.ToString().ToCharArray()) + { + if (char.IsUpper(c)) + { + if (firstChar) + firstChar = false; + else + builder.Append("_"); + + builder.Append(c); + } + else + { + builder.Append(char.ToUpper(c)); + } + } + + return builder.ToString(); } } }