diff --git a/src/managers/GuildChannelManager.js b/src/managers/GuildChannelManager.js index 49d2505c5871..9d4f28f0c097 100644 --- a/src/managers/GuildChannelManager.js +++ b/src/managers/GuildChannelManager.js @@ -12,6 +12,7 @@ const Webhook = require('../structures/Webhook'); const { ThreadChannelTypes, ChannelTypes, VideoQualityModes } = require('../util/Constants'); const DataResolver = require('../util/DataResolver'); const Util = require('../util/Util'); +const { resolveAutoArchiveMaxLimit } = require('../util/Util'); let cacheWarningEmitted = false; let storeChannelDeprecationEmitted = false; @@ -262,6 +263,9 @@ class GuildChannelManager extends CachedManager { } } + let defaultAutoArchiveDuration = data.defaultAutoArchiveDuration; + if (defaultAutoArchiveDuration === 'MAX') defaultAutoArchiveDuration = resolveAutoArchiveMaxLimit(this.guild); + const newData = await this.client.api.channels(channel.id).patch({ data: { name: (data.name ?? channel.name).trim(), @@ -276,7 +280,7 @@ class GuildChannelManager extends CachedManager { parent_id: parent, lock_permissions: data.lockPermissions, rate_limit_per_user: data.rateLimitPerUser, - default_auto_archive_duration: data.defaultAutoArchiveDuration, + default_auto_archive_duration: defaultAutoArchiveDuration, permission_overwrites, }, reason, diff --git a/src/managers/ThreadManager.js b/src/managers/ThreadManager.js index 9cd4f049e2c5..0568c6c39f8a 100644 --- a/src/managers/ThreadManager.js +++ b/src/managers/ThreadManager.js @@ -5,6 +5,7 @@ const CachedManager = require('./CachedManager'); const { TypeError } = require('../errors'); const ThreadChannel = require('../structures/ThreadChannel'); const { ChannelTypes } = require('../util/Constants'); +const { resolveAutoArchiveMaxLimit } = require('../util/Util'); /** * Manages API methods for {@link ThreadChannel} objects and stores their cache. @@ -120,14 +121,8 @@ class ThreadManager extends CachedManager { } else if (this.channel.type !== 'GUILD_NEWS') { resolvedType = typeof type === 'string' ? ChannelTypes[type] : type ?? resolvedType; } - if (autoArchiveDuration === 'MAX') { - autoArchiveDuration = 1440; - if (this.channel.guild.features.includes('SEVEN_DAY_THREAD_ARCHIVE')) { - autoArchiveDuration = 10080; - } else if (this.channel.guild.features.includes('THREE_DAY_THREAD_ARCHIVE')) { - autoArchiveDuration = 4320; - } - } + + if (autoArchiveDuration === 'MAX') autoArchiveDuration = resolveAutoArchiveMaxLimit(this.channel.guild); const data = await path.threads.post({ data: { diff --git a/src/structures/BaseGuildTextChannel.js b/src/structures/BaseGuildTextChannel.js index 7d2f5c0e04bb..fd59508caf09 100644 --- a/src/structures/BaseGuildTextChannel.js +++ b/src/structures/BaseGuildTextChannel.js @@ -69,7 +69,7 @@ class BaseGuildTextChannel extends GuildChannel { if ('default_auto_archive_duration' in data) { /** * The default auto archive duration for newly created threads in this channel - * @type {?ThreadAutoArchiveDuration} + * @type {?number} */ this.defaultAutoArchiveDuration = data.default_auto_archive_duration; } diff --git a/src/structures/ThreadChannel.js b/src/structures/ThreadChannel.js index 6f3e1a8ca516..0ef83d2e648d 100644 --- a/src/structures/ThreadChannel.js +++ b/src/structures/ThreadChannel.js @@ -6,6 +6,7 @@ const { RangeError } = require('../errors'); const MessageManager = require('../managers/MessageManager'); const ThreadMemberManager = require('../managers/ThreadMemberManager'); const Permissions = require('../util/Permissions'); +const { resolveAutoArchiveMaxLimit } = require('../util/Util'); /** * Represents a thread channel on Discord. @@ -314,14 +315,8 @@ class ThreadChannel extends Channel { */ async edit(data, reason) { let autoArchiveDuration = data.autoArchiveDuration; - if (data.autoArchiveDuration === 'MAX') { - autoArchiveDuration = 1440; - if (this.guild.features.includes('SEVEN_DAY_THREAD_ARCHIVE')) { - autoArchiveDuration = 10080; - } else if (this.guild.features.includes('THREE_DAY_THREAD_ARCHIVE')) { - autoArchiveDuration = 4320; - } - } + if (autoArchiveDuration === 'MAX') autoArchiveDuration = resolveAutoArchiveMaxLimit(this.guild); + const newData = await this.client.api.channels(this.id).patch({ data: { name: (data.name ?? this.name).trim(), diff --git a/src/util/Util.js b/src/util/Util.js index 7901f7781ad8..d33da68d1b36 100644 --- a/src/util/Util.js +++ b/src/util/Util.js @@ -603,6 +603,17 @@ class Util extends null { filter.isDefault = true; return filter; } + + /** + * Resolves the maximum time a guild's thread channels should automatcally archive in case of no recent activity. + * @param {Guild} guild The guild to resolve this limit from. + * @returns {number} + */ + static resolveAutoArchiveMaxLimit({ features }) { + if (features.includes('SEVEN_DAY_THREAD_ARCHIVE')) return 10080; + if (features.includes('THREE_DAY_THREAD_ARCHIVE')) return 4320; + return 1440; + } } module.exports = Util; diff --git a/typings/index.d.ts b/typings/index.d.ts index fd85af780318..3a3a5ac3466b 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -441,7 +441,7 @@ export class BaseGuildTextChannel extends TextBasedChannelMixin(GuildChannel) { public createWebhook(name: string, options?: ChannelWebhookCreateOptions): Promise; public fetchInvites(cache?: boolean): Promise>; public setDefaultAutoArchiveDuration( - defaultAutoArchiveDuration: ThreadAutoArchiveDuration, + defaultAutoArchiveDuration: ThreadAutoArchiveDuration | 'MAX', reason?: string, ): Promise; public setNSFW(nsfw?: boolean, reason?: string): Promise; @@ -2502,7 +2502,7 @@ export class ThreadChannel extends TextBasedChannelMixin(Channel) { public fetchStarterMessage(options?: BaseFetchOptions): Promise; public setArchived(archived?: boolean, reason?: string): Promise; public setAutoArchiveDuration( - autoArchiveDuration: ThreadAutoArchiveDuration, + autoArchiveDuration: ThreadAutoArchiveDuration | 'MAX', reason?: string, ): Promise; public setInvitable(invitable?: boolean, reason?: string): Promise; @@ -2628,6 +2628,7 @@ export class Util extends null { reason?: string, ): Promise<{ id: Snowflake; position: number }[]>; public static splitMessage(text: string, options?: SplitOptions): string[]; + public static resolveAutoArchiveMaxLimit(guild: Guild): number; } export class Formatters extends null { @@ -4086,7 +4087,7 @@ export interface ChannelData { rateLimitPerUser?: number; lockPermissions?: boolean; permissionOverwrites?: readonly OverwriteResolvable[] | Collection; - defaultAutoArchiveDuration?: ThreadAutoArchiveDuration; + defaultAutoArchiveDuration?: ThreadAutoArchiveDuration | 'MAX'; rtcRegion?: string | null; videoQualityMode?: VideoQualityMode | null; } @@ -5882,7 +5883,7 @@ export type TextChannelResolvable = Snowflake | TextChannel; export type TextBasedChannelResolvable = Snowflake | TextBasedChannel; -export type ThreadAutoArchiveDuration = 60 | 1440 | 4320 | 10080 | 'MAX'; +export type ThreadAutoArchiveDuration = 60 | 1440 | 4320 | 10080; export type ThreadChannelResolvable = ThreadChannel | Snowflake;