@@ -52,4 +52,9 @@ public class ForumChannelProperties : TextChannelProperties | |||||
/// Gets or sets a new default reaction emoji in this forum channel. | /// Gets or sets a new default reaction emoji in this forum channel. | ||||
/// </summary> | /// </summary> | ||||
public Optional<IEmote> DefaultReactionEmoji { get; set; } | public Optional<IEmote> DefaultReactionEmoji { get; set; } | ||||
/// <summary> | |||||
/// Gets or sets the rule used to order posts in forum channels. | |||||
/// </summary> | |||||
public Optional<ForumSortOrder> DefaultSortOrder { get; set; } | |||||
} | } |
@@ -0,0 +1,17 @@ | |||||
namespace Discord; | |||||
/// <summary> | |||||
/// Defines the rule used to order posts in forum channels. | |||||
/// </summary> | |||||
public enum ForumSortOrder | |||||
{ | |||||
/// <summary> | |||||
/// Sort forum posts by activity. | |||||
/// </summary> | |||||
LatestActivity = 0, | |||||
/// <summary> | |||||
/// Sort forum posts by creation time (from most recent to oldest). | |||||
/// </summary> | |||||
CreationDate = 1 | |||||
} |
@@ -62,6 +62,14 @@ namespace Discord | |||||
/// </remarks> | /// </remarks> | ||||
IEmote DefaultReactionEmoji { get; } | IEmote DefaultReactionEmoji { get; } | ||||
/// <summary> | |||||
/// Gets or sets the rule used to order posts in forum channels. | |||||
/// </summary> | |||||
/// <remarks> | |||||
/// Defaults to null, which indicates a preferred sort order hasn't been set | |||||
/// </remarks> | |||||
ForumSortOrder? DefaultSortOrder { get; } | |||||
/// <summary> | /// <summary> | ||||
/// Modifies this forum channel. | /// Modifies this forum channel. | ||||
/// </summary> | /// </summary> | ||||
@@ -83,7 +83,11 @@ namespace Discord.API | |||||
[JsonProperty("flags")] | [JsonProperty("flags")] | ||||
public Optional<ChannelFlags> Flags { get; set; } | public Optional<ChannelFlags> Flags { get; set; } | ||||
[JsonProperty("default_sort_order")] | |||||
public Optional<ForumSortOrder?> DefaultSortOrder { get; set; } | |||||
[JsonProperty("default_reaction_emoji")] | [JsonProperty("default_reaction_emoji")] | ||||
public Optional<ForumReactionEmoji> DefaultReactionEmoji { get; set; } | public Optional<ForumReactionEmoji> DefaultReactionEmoji { get; set; } | ||||
} | } | ||||
} | } |
@@ -5,7 +5,7 @@ namespace Discord.API; | |||||
public class ForumReactionEmoji | public class ForumReactionEmoji | ||||
{ | { | ||||
[JsonProperty("emoji_id")] | [JsonProperty("emoji_id")] | ||||
public Optional<ulong?> EmojiId { get; set; } | |||||
public ulong? EmojiId { get; set; } | |||||
[JsonProperty("emoji_name")] | [JsonProperty("emoji_name")] | ||||
public Optional<string> EmojiName { get; set; } | public Optional<string> EmojiName { get; set; } | ||||
@@ -39,6 +39,8 @@ namespace Discord.API.Rest | |||||
public Optional<int> ThreadRateLimitPerUser { get; set; } | public Optional<int> ThreadRateLimitPerUser { get; set; } | ||||
[JsonProperty("available_tags")] | [JsonProperty("available_tags")] | ||||
public Optional<ModifyForumTagParams[]> AvailableTags { get; set; } | public Optional<ModifyForumTagParams[]> AvailableTags { get; set; } | ||||
[JsonProperty("default_sort_order")] | |||||
public Optional<ForumSortOrder?> DefaultSortOrder { get; set; } | |||||
public CreateGuildChannelParams(string name, ChannelType type) | public CreateGuildChannelParams(string name, ChannelType type) | ||||
{ | { | ||||
@@ -17,4 +17,7 @@ internal class ModifyForumChannelParams : ModifyTextChannelParams | |||||
[JsonProperty("default_reaction_emoji")] | [JsonProperty("default_reaction_emoji")] | ||||
public Optional<ModifyForumReactionEmojiParams> DefaultReactionEmoji { get; set; } | public Optional<ModifyForumReactionEmojiParams> DefaultReactionEmoji { get; set; } | ||||
[JsonProperty("default_sort_order")] | |||||
public Optional<ForumSortOrder> DefaultSortOrder { get; set; } | |||||
} | } |
@@ -52,7 +52,8 @@ internal static class ForumHelper | |||||
EmojiName = args.DefaultReactionEmoji.Value is Emoji emoji ? | EmojiName = args.DefaultReactionEmoji.Value is Emoji emoji ? | ||||
emoji.Name : Optional<string>.Unspecified | emoji.Name : Optional<string>.Unspecified | ||||
} | } | ||||
: Optional<ModifyForumReactionEmojiParams>.Unspecified | |||||
: Optional<ModifyForumReactionEmojiParams>.Unspecified, | |||||
DefaultSortOrder = args.DefaultSortOrder | |||||
}; | }; | ||||
return await client.ApiClient.ModifyGuildChannelAsync(channel.Id, apiArgs, options).ConfigureAwait(false); | return await client.ApiClient.ModifyGuildChannelAsync(channel.Id, apiArgs, options).ConfigureAwait(false); | ||||
} | } | ||||
@@ -38,6 +38,9 @@ namespace Discord.Rest | |||||
/// <inheritdoc/> | /// <inheritdoc/> | ||||
public IEmote DefaultReactionEmoji { get; private set; } | public IEmote DefaultReactionEmoji { get; private set; } | ||||
/// <inheritdoc/> | |||||
public ForumSortOrder? DefaultSortOrder { get; private set; } | |||||
/// <inheritdoc/> | /// <inheritdoc/> | ||||
public string Mention => MentionUtils.MentionChannel(Id); | public string Mention => MentionUtils.MentionChannel(Id); | ||||
@@ -67,14 +70,16 @@ namespace Discord.Rest | |||||
if(model.SlowMode.IsSpecified) | if(model.SlowMode.IsSpecified) | ||||
ThreadCreationInterval = model.SlowMode.Value; | ThreadCreationInterval = model.SlowMode.Value; | ||||
DefaultSortOrder = model.DefaultSortOrder.GetValueOrDefault(); | |||||
Tags = model.ForumTags.GetValueOrDefault(Array.Empty<API.ForumTags>()).Select( | Tags = model.ForumTags.GetValueOrDefault(Array.Empty<API.ForumTags>()).Select( | ||||
x => new ForumTag(x.Id, x.Name, x.EmojiId.GetValueOrDefault(null), x.EmojiName.GetValueOrDefault(), x.Moderated) | x => new ForumTag(x.Id, x.Name, x.EmojiId.GetValueOrDefault(null), x.EmojiName.GetValueOrDefault(), x.Moderated) | ||||
).ToImmutableArray(); | ).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) | else if (model.DefaultReactionEmoji.Value.EmojiName.IsSpecified) | ||||
DefaultReactionEmoji = new Emoji(model.DefaultReactionEmoji.Value.EmojiName.Value); | DefaultReactionEmoji = new Emoji(model.DefaultReactionEmoji.Value.EmojiName.Value); | ||||
else | else | ||||
@@ -364,7 +364,7 @@ namespace Discord.Rest | |||||
}).ToArray() | }).ToArray() | ||||
: Optional.Create<API.Overwrite[]>(), | : Optional.Create<API.Overwrite[]>(), | ||||
SlowModeInterval = props.ThreadCreationInterval, | SlowModeInterval = props.ThreadCreationInterval, | ||||
AvailableTags = props.Tags.GetValueOrDefault().Select( | |||||
AvailableTags = props.Tags.GetValueOrDefault(Array.Empty<ForumTagProperties>()).Select( | |||||
x => new ModifyForumTagParams | x => new ModifyForumTagParams | ||||
{ | { | ||||
Id = x.Id, | Id = x.Id, | ||||
@@ -390,7 +390,8 @@ namespace Discord.Rest | |||||
CategoryId = props.CategoryId, | CategoryId = props.CategoryId, | ||||
IsNsfw = props.IsNsfw, | IsNsfw = props.IsNsfw, | ||||
Topic = props.Topic, | 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); | var model = await client.ApiClient.CreateGuildChannelAsync(guild.Id, args, options).ConfigureAwait(false); | ||||
@@ -42,6 +42,9 @@ namespace Discord.WebSocket | |||||
/// <inheritdoc/> | /// <inheritdoc/> | ||||
public IEmote DefaultReactionEmoji { get; private set; } | public IEmote DefaultReactionEmoji { get; private set; } | ||||
/// <inheritdoc/> | |||||
public ForumSortOrder? DefaultSortOrder { get; private set; } | |||||
/// <summary> | /// <summary> | ||||
/// Gets the parent (category) of this channel in the guild's channel list. | /// Gets the parent (category) of this channel in the guild's channel list. | ||||
/// </summary> | /// </summary> | ||||
@@ -73,14 +76,16 @@ namespace Discord.WebSocket | |||||
if (model.SlowMode.IsSpecified) | if (model.SlowMode.IsSpecified) | ||||
ThreadCreationInterval = model.SlowMode.Value; | ThreadCreationInterval = model.SlowMode.Value; | ||||
DefaultSortOrder = model.DefaultSortOrder.GetValueOrDefault(); | |||||
Tags = model.ForumTags.GetValueOrDefault(Array.Empty<API.ForumTags>()).Select( | Tags = model.ForumTags.GetValueOrDefault(Array.Empty<API.ForumTags>()).Select( | ||||
x => new ForumTag(x.Id, x.Name, x.EmojiId.GetValueOrDefault(null), x.EmojiName.GetValueOrDefault(), x.Moderated) | x => new ForumTag(x.Id, x.Name, x.EmojiId.GetValueOrDefault(null), x.EmojiName.GetValueOrDefault(), x.Moderated) | ||||
).ToImmutableArray(); | ).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) | else if (model.DefaultReactionEmoji.Value.EmojiName.IsSpecified) | ||||
DefaultReactionEmoji = new Emoji(model.DefaultReactionEmoji.Value.EmojiName.Value); | DefaultReactionEmoji = new Emoji(model.DefaultReactionEmoji.Value.EmojiName.Value); | ||||
else | else | ||||