From 08bda4fd71885b5c411d1c6a4be64bf8ab0dd701 Mon Sep 17 00:00:00 2001 From: Misha133 Date: Thu, 22 Sep 2022 20:08:15 +0300 Subject: [PATCH] Some fixes & add support for `default_sort_order` --- .../Entities/Channels/ForumChannelProperties.cs | 5 +++++ .../Entities/Channels/ForumSortOrder.cs | 17 +++++++++++++++++ .../Entities/Channels/IForumChannel.cs | 8 ++++++++ src/Discord.Net.Rest/API/Common/Channel.cs | 4 ++++ .../API/Common/ForumReactionEmoji.cs | 2 +- .../API/Rest/CreateGuildChannelParams.cs | 2 ++ .../API/Rest/ModifyForumChannelParams.cs | 3 +++ .../Entities/Channels/ForumHelper.cs | 3 ++- .../Entities/Channels/RestForumChannel.cs | 11 ++++++++--- .../Entities/Guilds/GuildHelper.cs | 5 +++-- .../Entities/Channels/SocketForumChannel.cs | 11 ++++++++--- 11 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Channels/ForumSortOrder.cs diff --git a/src/Discord.Net.Core/Entities/Channels/ForumChannelProperties.cs b/src/Discord.Net.Core/Entities/Channels/ForumChannelProperties.cs index 507a7dd28..e1a123b37 100644 --- a/src/Discord.Net.Core/Entities/Channels/ForumChannelProperties.cs +++ b/src/Discord.Net.Core/Entities/Channels/ForumChannelProperties.cs @@ -52,4 +52,9 @@ public class ForumChannelProperties : TextChannelProperties /// Gets or sets a new default reaction emoji in this forum channel. /// public Optional DefaultReactionEmoji { get; set; } + + /// + /// Gets or sets the rule used to order posts in forum channels. + /// + public Optional DefaultSortOrder { get; set; } } diff --git a/src/Discord.Net.Core/Entities/Channels/ForumSortOrder.cs b/src/Discord.Net.Core/Entities/Channels/ForumSortOrder.cs new file mode 100644 index 000000000..2a576d978 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Channels/ForumSortOrder.cs @@ -0,0 +1,17 @@ +namespace Discord; + +/// +/// Defines the rule used to order posts in forum channels. +/// +public enum ForumSortOrder +{ + /// + /// Sort forum posts by activity. + /// + LatestActivity = 0, + + /// + /// Sort forum posts by creation time (from most recent to oldest). + /// + CreationDate = 1 +} diff --git a/src/Discord.Net.Core/Entities/Channels/IForumChannel.cs b/src/Discord.Net.Core/Entities/Channels/IForumChannel.cs index 3b244b1a9..93e83dd6a 100644 --- a/src/Discord.Net.Core/Entities/Channels/IForumChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IForumChannel.cs @@ -62,6 +62,14 @@ namespace Discord /// IEmote DefaultReactionEmoji { get; } + /// + /// Gets or sets the rule used to order posts in forum channels. + /// + /// + /// Defaults to null, which indicates a preferred sort order hasn't been set + /// + ForumSortOrder? DefaultSortOrder { get; } + /// /// Modifies this forum channel. /// diff --git a/src/Discord.Net.Rest/API/Common/Channel.cs b/src/Discord.Net.Rest/API/Common/Channel.cs index 2c43cc492..f9184cd1f 100644 --- a/src/Discord.Net.Rest/API/Common/Channel.cs +++ b/src/Discord.Net.Rest/API/Common/Channel.cs @@ -83,7 +83,11 @@ namespace Discord.API [JsonProperty("flags")] public Optional Flags { get; set; } + [JsonProperty("default_sort_order")] + public Optional DefaultSortOrder { get; set; } + [JsonProperty("default_reaction_emoji")] public Optional DefaultReactionEmoji { get; set; } + } } diff --git a/src/Discord.Net.Rest/API/Common/ForumReactionEmoji.cs b/src/Discord.Net.Rest/API/Common/ForumReactionEmoji.cs index 20463df8d..ae2d2b546 100644 --- a/src/Discord.Net.Rest/API/Common/ForumReactionEmoji.cs +++ b/src/Discord.Net.Rest/API/Common/ForumReactionEmoji.cs @@ -5,7 +5,7 @@ namespace Discord.API; public class ForumReactionEmoji { [JsonProperty("emoji_id")] - public Optional EmojiId { get; set; } + public ulong? EmojiId { get; set; } [JsonProperty("emoji_name")] public Optional EmojiName { get; set; } diff --git a/src/Discord.Net.Rest/API/Rest/CreateGuildChannelParams.cs b/src/Discord.Net.Rest/API/Rest/CreateGuildChannelParams.cs index 4a8a2ebea..74590fb35 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateGuildChannelParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateGuildChannelParams.cs @@ -39,6 +39,8 @@ namespace Discord.API.Rest public Optional ThreadRateLimitPerUser { get; set; } [JsonProperty("available_tags")] public Optional AvailableTags { get; set; } + [JsonProperty("default_sort_order")] + public Optional DefaultSortOrder { get; set; } public CreateGuildChannelParams(string name, ChannelType type) { diff --git a/src/Discord.Net.Rest/API/Rest/ModifyForumChannelParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyForumChannelParams.cs index 881e922f8..d8733a2bd 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyForumChannelParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyForumChannelParams.cs @@ -17,4 +17,7 @@ internal class ModifyForumChannelParams : ModifyTextChannelParams [JsonProperty("default_reaction_emoji")] public Optional DefaultReactionEmoji { get; set; } + + [JsonProperty("default_sort_order")] + public Optional DefaultSortOrder { get; set; } } diff --git a/src/Discord.Net.Rest/Entities/Channels/ForumHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ForumHelper.cs index 2597de3aa..c65d23d17 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ForumHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ForumHelper.cs @@ -52,7 +52,8 @@ internal static class ForumHelper EmojiName = args.DefaultReactionEmoji.Value is Emoji emoji ? emoji.Name : Optional.Unspecified } - : Optional.Unspecified + : Optional.Unspecified, + DefaultSortOrder = args.DefaultSortOrder }; return await client.ApiClient.ModifyGuildChannelAsync(channel.Id, apiArgs, options).ConfigureAwait(false); } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestForumChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestForumChannel.cs index 8f48aca42..373579e1c 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestForumChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestForumChannel.cs @@ -38,6 +38,9 @@ namespace Discord.Rest /// public IEmote DefaultReactionEmoji { get; private set; } + /// + public ForumSortOrder? DefaultSortOrder { get; private set; } + /// public string Mention => MentionUtils.MentionChannel(Id); @@ -67,14 +70,16 @@ namespace Discord.Rest if(model.SlowMode.IsSpecified) ThreadCreationInterval = model.SlowMode.Value; + DefaultSortOrder = model.DefaultSortOrder.GetValueOrDefault(); + Tags = model.ForumTags.GetValueOrDefault(Array.Empty()).Select( x => new ForumTag(x.Id, x.Name, x.EmojiId.GetValueOrDefault(null), x.EmojiName.GetValueOrDefault(), x.Moderated) ).ToImmutableArray(); - if (model.DefaultReactionEmoji.IsSpecified) + if (model.DefaultReactionEmoji.IsSpecified && model.DefaultReactionEmoji.Value is not null) { - if (model.DefaultReactionEmoji.Value.EmojiId.IsSpecified && model.DefaultReactionEmoji.Value.EmojiId.Value != 0) - DefaultReactionEmoji = new Emote(model.DefaultReactionEmoji.Value.EmojiId.Value.GetValueOrDefault(), null, false); + if (model.DefaultReactionEmoji.Value.EmojiId.HasValue && model.DefaultReactionEmoji.Value.EmojiId.Value != 0) + DefaultReactionEmoji = new Emote(model.DefaultReactionEmoji.Value.EmojiId.GetValueOrDefault(), null, false); else if (model.DefaultReactionEmoji.Value.EmojiName.IsSpecified) DefaultReactionEmoji = new Emoji(model.DefaultReactionEmoji.Value.EmojiName.Value); else diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index 6ed0678e2..44467cfac 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -364,7 +364,7 @@ namespace Discord.Rest }).ToArray() : Optional.Create(), SlowModeInterval = props.ThreadCreationInterval, - AvailableTags = props.Tags.GetValueOrDefault().Select( + AvailableTags = props.Tags.GetValueOrDefault(Array.Empty()).Select( x => new ModifyForumTagParams { Id = x.Id, @@ -390,7 +390,8 @@ namespace Discord.Rest CategoryId = props.CategoryId, IsNsfw = props.IsNsfw, Topic = props.Topic, - DefaultAutoArchiveDuration = props.AutoArchiveDuration + DefaultAutoArchiveDuration = props.AutoArchiveDuration, + DefaultSortOrder = props.DefaultSortOrder.GetValueOrDefault(ForumSortOrder.LatestActivity) }; var model = await client.ApiClient.CreateGuildChannelAsync(guild.Id, args, options).ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketForumChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketForumChannel.cs index 9216a14f5..1a8b7ecf4 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketForumChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketForumChannel.cs @@ -42,6 +42,9 @@ namespace Discord.WebSocket /// public IEmote DefaultReactionEmoji { get; private set; } + /// + public ForumSortOrder? DefaultSortOrder { get; private set; } + /// /// Gets the parent (category) of this channel in the guild's channel list. /// @@ -73,14 +76,16 @@ namespace Discord.WebSocket if (model.SlowMode.IsSpecified) ThreadCreationInterval = model.SlowMode.Value; + DefaultSortOrder = model.DefaultSortOrder.GetValueOrDefault(); + Tags = model.ForumTags.GetValueOrDefault(Array.Empty()).Select( x => new ForumTag(x.Id, x.Name, x.EmojiId.GetValueOrDefault(null), x.EmojiName.GetValueOrDefault(), x.Moderated) ).ToImmutableArray(); - if (model.DefaultReactionEmoji.IsSpecified) + if (model.DefaultReactionEmoji.IsSpecified && model.DefaultReactionEmoji.Value is not null) { - if (model.DefaultReactionEmoji.Value.EmojiId.IsSpecified && model.DefaultReactionEmoji.Value.EmojiId.Value != 0) - DefaultReactionEmoji = new Emote(model.DefaultReactionEmoji.Value.EmojiId.Value.GetValueOrDefault(), null, false); + if (model.DefaultReactionEmoji.Value.EmojiId.HasValue && model.DefaultReactionEmoji.Value.EmojiId.Value != 0) + DefaultReactionEmoji = new Emote(model.DefaultReactionEmoji.Value.EmojiId.GetValueOrDefault(), null, false); else if (model.DefaultReactionEmoji.Value.EmojiName.IsSpecified) DefaultReactionEmoji = new Emoji(model.DefaultReactionEmoji.Value.EmojiName.Value); else