diff --git a/packages/discord.js/src/managers/CategoryChannelChildManager.js b/packages/discord.js/src/managers/CategoryChannelChildManager.js index 49c593b59684..43c4a20ee126 100644 --- a/packages/discord.js/src/managers/CategoryChannelChildManager.js +++ b/packages/discord.js/src/managers/CategoryChannelChildManager.js @@ -53,6 +53,7 @@ class CategoryChannelChildManager extends DataManager { * @property {GuildForumTagData[]} [availableTags] The tags that can be used in this channel (forum only). * @property {DefaultReactionEmoji} [defaultReactionEmoji] * The emoji to show in the add reaction button on a thread in a guild forum channel. + * @property {SortOrderType} [defaultSortOrder] The default sort order mode used to order posts (forum only). * @property {string} [reason] Reason for creating the new channel */ diff --git a/packages/discord.js/src/managers/GuildChannelManager.js b/packages/discord.js/src/managers/GuildChannelManager.js index 3710cff3ad18..64c8c8fdefbe 100644 --- a/packages/discord.js/src/managers/GuildChannelManager.js +++ b/packages/discord.js/src/managers/GuildChannelManager.js @@ -141,6 +141,7 @@ class GuildChannelManager extends CachedManager { videoQualityMode, availableTags, defaultReactionEmoji, + defaultSortOrder, reason, }) { parent &&= this.client.channels.resolveId(parent); @@ -162,6 +163,7 @@ class GuildChannelManager extends CachedManager { video_quality_mode: videoQualityMode, available_tags: availableTags?.map(availableTag => transformGuildForumTag(availableTag)), default_reaction_emoji: defaultReactionEmoji && transformGuildDefaultReaction(defaultReactionEmoji), + default_sort_order: defaultSortOrder, }, reason, }); @@ -229,6 +231,7 @@ class GuildChannelManager extends CachedManager { * @property {?DefaultReactionEmoji} [defaultReactionEmoji] The emoji to set as the default reaction emoji * @property {number} [defaultThreadRateLimitPerUser] The rate limit per user (slowmode) to set on forum posts * @property {ChannelFlagsResolvable} [flags] The flags to set on the channel + * @property {?SortOrderType} [defaultSortOrder] The default sort order mode to set on the channel * @property {string} [reason] Reason for editing this channel */ @@ -289,6 +292,7 @@ class GuildChannelManager extends CachedManager { default_reaction_emoji: data.defaultReactionEmoji && transformGuildDefaultReaction(data.defaultReactionEmoji), default_thread_rate_limit_per_user: data.defaultThreadRateLimitPerUser, flags: 'flags' in data ? ChannelFlagsBitField.resolve(data.flags) : undefined, + default_sort_order: data.defaultSortOrder, }, reason: data.reason, }); diff --git a/packages/discord.js/src/structures/ForumChannel.js b/packages/discord.js/src/structures/ForumChannel.js index 104abc5c3065..617f8ea6f3c5 100644 --- a/packages/discord.js/src/structures/ForumChannel.js +++ b/packages/discord.js/src/structures/ForumChannel.js @@ -124,6 +124,16 @@ class ForumChannel extends GuildChannel { */ this.topic = data.topic; } + + if ('default_sort_order' in data) { + /** + * The default sort order mode used to order posts + * @type {?SortOrderType} + */ + this.defaultSortOrder = data.default_sort_order; + } else { + this.defaultSortOrder ??= null; + } } /** @@ -205,6 +215,16 @@ class ForumChannel extends GuildChannel { return this.edit({ topic, reason }); } + /** + * Sets the default sort order mode used to order posts + * @param {?SortOrderType} defaultSortOrder The default sort order mode to set on this channel + * @param {string} [reason] Reason for changing the default sort order + * @returns {Promise} + */ + setDefaultSortOrder(defaultSortOrder, reason) { + return this.edit({ defaultSortOrder, reason }); + } + // These are here only for documentation purposes - they are implemented by TextBasedChannel /* eslint-disable no-empty-function */ createWebhook() {} diff --git a/packages/discord.js/src/util/APITypes.js b/packages/discord.js/src/util/APITypes.js index dd70c87295ad..cfde0d4dbe95 100644 --- a/packages/discord.js/src/util/APITypes.js +++ b/packages/discord.js/src/util/APITypes.js @@ -333,6 +333,11 @@ * @see {@link https://discord-api-types.dev/api/discord-api-types-rest/common/enum/RESTJSONErrorCodes} */ +/** + * @external SortOrderType + * @see {@link https://discord-api-types.dev/api/discord-api-types-v10/enum/SortOrderType} + */ + /** * @external StageInstancePrivacyLevel * @see {@link https://discord-api-types.dev/api/discord-api-types-v10/enum/StageInstancePrivacyLevel} diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index c66afbe6d6f7..8ea360a5c2d4 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -125,6 +125,7 @@ import { AuditLogOptionsType, TextChannelType, ChannelFlags, + SortOrderType, } from 'discord-api-types/v10'; import { ChildProcess } from 'node:child_process'; import { EventEmitter } from 'node:events'; @@ -2097,6 +2098,7 @@ export class ForumChannel extends TextBasedChannelMixin(GuildChannel, true, [ public defaultAutoArchiveDuration: ThreadAutoArchiveDuration | null; public nsfw: boolean; public topic: string | null; + public defaultSortOrder: SortOrderType | null; public setAvailableTags(tags: GuildForumTagData[], reason?: string): Promise; public setDefaultReactionEmoji(emojiId: DefaultReactionEmoji | null, reason?: string): Promise; @@ -2108,6 +2110,7 @@ export class ForumChannel extends TextBasedChannelMixin(GuildChannel, true, [ reason?: string, ): Promise; public setTopic(topic: string | null, reason?: string): Promise; + public setDefaultSortOrder(defaultSortOrder: SortOrderType | null, reason?: string): Promise; } export class PermissionOverwrites extends Base { @@ -4251,6 +4254,7 @@ export interface CategoryCreateChannelOptions { videoQualityMode?: VideoQualityMode; availableTags?: GuildForumTagData[]; defaultReactionEmoji?: DefaultReactionEmoji; + defaultSortOrder?: SortOrderType; reason?: string; } @@ -4932,6 +4936,7 @@ export interface GuildChannelEditOptions { defaultReactionEmoji?: DefaultReactionEmoji | null; defaultThreadRateLimitPerUser?: number; flags?: ChannelFlagsResolvable; + defaultSortOrder?: SortOrderType | null; reason?: string; }