'use strict' const { COLLECTIONS, CHANNEL_TYPES } = require('pearcord-shared') const threadsForumMixin = { _threadHealWatermark: null, _forumHealWatermark: null, async _healForumTagPaletteOnPartition (guildId) { const gid = guildId || this.guild?.guild?.id || null const span = this.log.time('forum.heal', { spanKind: 'forum.heal', guildId: gid }) try { if (!gid || !this.guild?.listChannels) { span.end({ relisted: 0, skipped: true }) return { relisted: 0, skipped: true } } const channels = await this.guild.listChannels().catch(() => []) let relisted = 0 for (const ch of channels) { if (ch.type !== CHANNEL_TYPES.FORUM) continue if (this.forum?.parsePaletteFromTopic) { const tags = this.forum.parsePaletteFromTopic(ch.topic) if (tags?.length) relisted += 1 } } const watermark = Date.now() this._forumHealWatermark = watermark span.end({ relisted, watermark, forumPostCount: relisted }) return { relisted, watermark } } catch (err) { this.log.error('forum.heal error', { guildId: gid, error: err?.message || String(err) }) span.fail(err) return { relisted: 0, error: err?.message || String(err) } } }, listGuildThreadChannels (guildId) { const gid = guildId || this.guild?.guild?.id || null if (!gid) return [] const channels = this._lastViewChannelsCache || [] return channels.filter((c) => c.type === CHANNEL_TYPES.THREAD && c.guildId === gid) } } module.exports = { threadsForumMixin }