* Fix #1381 Guild PreferredLocale support Adds support for getting and modifying a guild's preferred_locale. This is a language tag in IETF BCP 47 format, which works with the built-in CultureInfo. While Discord only supports a number of cultures, I think that this restriction should be handled at the API and not by the wrapper. (Also easier on our end) * Add PreferredCulture to IGuild This property was defined in RestGuild and SocketGuild, so it only makes sense to make it part of IGuild as well.tags/2.2.0
| @@ -1,3 +1,5 @@ | |||||
| using System.Globalization; | |||||
| namespace Discord | namespace Discord | ||||
| { | { | ||||
| /// <summary> | /// <summary> | ||||
| @@ -84,5 +86,23 @@ namespace Discord | |||||
| /// are enabled, without the need to manipulate the logic of the flag. | /// are enabled, without the need to manipulate the logic of the flag. | ||||
| /// </remarks> | /// </remarks> | ||||
| public Optional<SystemChannelMessageDeny> SystemChannelFlags { get; set; } | public Optional<SystemChannelMessageDeny> SystemChannelFlags { get; set; } | ||||
| /// <summary> | |||||
| /// Gets or sets the preferred locale of the guild in IETF BCP 47 language tag format. | |||||
| /// </summary> | |||||
| /// <remarks> | |||||
| /// This property takes precedence over <see cref="PreferredCulture"/>. | |||||
| /// When it is set, the value of <see cref="PreferredCulture"/> | |||||
| /// will not be used. | |||||
| /// </remarks> | |||||
| public Optional<string> PreferredLocale { get; set; } | |||||
| /// <summary> | |||||
| /// Gets or sets the preferred locale of the guild. | |||||
| /// </summary> | |||||
| /// <remarks> | |||||
| /// The <see cref="PreferredLocale"/> property takes precedence | |||||
| /// over this property. When <see cref="PreferredLocale"/> is set, | |||||
| /// the value of <see cref="PreferredCulture"/> will be unused. | |||||
| /// </remarks> | |||||
| public Optional<CultureInfo> PreferredCulture { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -1,6 +1,7 @@ | |||||
| using Discord.Audio; | using Discord.Audio; | ||||
| using System; | using System; | ||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| using System.Globalization; | |||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
| namespace Discord | namespace Discord | ||||
| @@ -249,6 +250,24 @@ namespace Discord | |||||
| /// </returns> | /// </returns> | ||||
| int PremiumSubscriptionCount { get; } | int PremiumSubscriptionCount { get; } | ||||
| /// <summary> | |||||
| /// Gets the preferred locale of this guild in IETF BCP 47 | |||||
| /// language tag format. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// The preferred locale of the guild in IETF BCP 47 | |||||
| /// language tag format. | |||||
| /// </returns> | |||||
| string PreferredLocale { get; } | |||||
| /// <summary> | |||||
| /// Gets the preferred culture of this guild. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// The preferred culture information of this guild. | |||||
| /// </returns> | |||||
| CultureInfo PreferredCulture { get; } | |||||
| /// <summary> | /// <summary> | ||||
| /// Modifies this guild. | /// Modifies this guild. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -58,5 +58,7 @@ namespace Discord.API | |||||
| public SystemChannelMessageDeny SystemChannelFlags { get; set; } | public SystemChannelMessageDeny SystemChannelFlags { get; set; } | ||||
| [JsonProperty("premium_subscription_count")] | [JsonProperty("premium_subscription_count")] | ||||
| public int? PremiumSubscriptionCount { get; set; } | public int? PremiumSubscriptionCount { get; set; } | ||||
| [JsonProperty("preferred_locale")] | |||||
| public string PreferredLocale { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -32,5 +32,7 @@ namespace Discord.API.Rest | |||||
| public Optional<ExplicitContentFilterLevel> ExplicitContentFilter { get; set; } | public Optional<ExplicitContentFilterLevel> ExplicitContentFilter { get; set; } | ||||
| [JsonProperty("system_channel_flags")] | [JsonProperty("system_channel_flags")] | ||||
| public Optional<SystemChannelMessageDeny> SystemChannelFlags { get; set; } | public Optional<SystemChannelMessageDeny> SystemChannelFlags { get; set; } | ||||
| [JsonProperty("preferred_locale")] | |||||
| public string PreferredLocale { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -68,6 +68,12 @@ namespace Discord.Rest | |||||
| if (args.SystemChannelFlags.IsSpecified) | if (args.SystemChannelFlags.IsSpecified) | ||||
| apiArgs.SystemChannelFlags = args.SystemChannelFlags.Value; | apiArgs.SystemChannelFlags = args.SystemChannelFlags.Value; | ||||
| // PreferredLocale takes precedence over PreferredCulture | |||||
| if (args.PreferredLocale.IsSpecified) | |||||
| apiArgs.PreferredLocale = args.PreferredLocale.Value; | |||||
| else if (args.PreferredCulture.IsSpecified) | |||||
| apiArgs.PreferredLocale = args.PreferredCulture.Value.Name; | |||||
| return await client.ApiClient.ModifyGuildAsync(guild.Id, apiArgs, options).ConfigureAwait(false); | return await client.ApiClient.ModifyGuildAsync(guild.Id, apiArgs, options).ConfigureAwait(false); | ||||
| } | } | ||||
| /// <exception cref="ArgumentNullException"><paramref name="func"/> is <c>null</c>.</exception> | /// <exception cref="ArgumentNullException"><paramref name="func"/> is <c>null</c>.</exception> | ||||
| @@ -3,6 +3,7 @@ using System; | |||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| using System.Collections.Immutable; | using System.Collections.Immutable; | ||||
| using System.Diagnostics; | using System.Diagnostics; | ||||
| using System.Globalization; | |||||
| using System.Linq; | using System.Linq; | ||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
| using EmbedModel = Discord.API.GuildEmbed; | using EmbedModel = Discord.API.GuildEmbed; | ||||
| @@ -64,6 +65,11 @@ namespace Discord.Rest | |||||
| public string Description { get; private set; } | public string Description { get; private set; } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public int PremiumSubscriptionCount { get; private set; } | public int PremiumSubscriptionCount { get; private set; } | ||||
| /// <inheritdoc /> | |||||
| public string PreferredLocale { get; private set; } | |||||
| /// <inheritdoc /> | |||||
| public CultureInfo PreferredCulture { get; private set; } | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | ||||
| @@ -124,6 +130,8 @@ namespace Discord.Rest | |||||
| SystemChannelFlags = model.SystemChannelFlags; | SystemChannelFlags = model.SystemChannelFlags; | ||||
| Description = model.Description; | Description = model.Description; | ||||
| PremiumSubscriptionCount = model.PremiumSubscriptionCount.GetValueOrDefault(); | PremiumSubscriptionCount = model.PremiumSubscriptionCount.GetValueOrDefault(); | ||||
| PreferredLocale = model.PreferredLocale; | |||||
| PreferredCulture = new CultureInfo(PreferredLocale); | |||||
| if (model.Emojis != null) | if (model.Emojis != null) | ||||
| { | { | ||||
| @@ -5,6 +5,7 @@ using System.Collections.Concurrent; | |||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| using System.Collections.Immutable; | using System.Collections.Immutable; | ||||
| using System.Diagnostics; | using System.Diagnostics; | ||||
| using System.Globalization; | |||||
| using System.Linq; | using System.Linq; | ||||
| using System.Threading; | using System.Threading; | ||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
| @@ -105,6 +106,11 @@ namespace Discord.WebSocket | |||||
| public string Description { get; private set; } | public string Description { get; private set; } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public int PremiumSubscriptionCount { get; private set; } | public int PremiumSubscriptionCount { get; private set; } | ||||
| /// <inheritdoc /> | |||||
| public string PreferredLocale { get; private set; } | |||||
| /// <inheritdoc /> | |||||
| public CultureInfo PreferredCulture { get; private set; } | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | ||||
| @@ -374,6 +380,8 @@ namespace Discord.WebSocket | |||||
| SystemChannelFlags = model.SystemChannelFlags; | SystemChannelFlags = model.SystemChannelFlags; | ||||
| Description = model.Description; | Description = model.Description; | ||||
| PremiumSubscriptionCount = model.PremiumSubscriptionCount.GetValueOrDefault(); | PremiumSubscriptionCount = model.PremiumSubscriptionCount.GetValueOrDefault(); | ||||
| PreferredLocale = model.PreferredLocale; | |||||
| PreferredCulture = new CultureInfo(PreferredLocale); | |||||
| if (model.Emojis != null) | if (model.Emojis != null) | ||||
| { | { | ||||