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();
}
}
}