From 0e85f1c46248ebbdb05f2af59d7e0f4a3d562f27 Mon Sep 17 00:00:00 2001 From: Ali Hammoud Date: Sat, 29 Aug 2026 08:41:28 +0300 Subject: [PATCH 1/2] fix(channels): fix rate limit handling and name changing of archived channels --- src/env.ts | 2 +- src/features/archive-channels/util.ts | 30 +++++++++++++-------------- src/index.ts | 7 +++++++ src/util/rate-limits.ts | 10 +++++++++ 4 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 src/util/rate-limits.ts diff --git a/src/env.ts b/src/env.ts index b04db02..6242e75 100644 --- a/src/env.ts +++ b/src/env.ts @@ -22,7 +22,7 @@ export const config = { clientId: requireEnv('CLIENT_ID'), serverId: requireEnv('SERVER_ID'), }, - fetchAndSyncMessages: true, + fetchAndSyncMessages: optionalEnv('FETCH_AND_SYNC_MESSAGES') !== 'false', guidesTrackerPath: optionalEnv('GUIDES_TRACKER_PATH'), adventOfCodeTrackerPath: requireEnv('ADVENT_OF_CODE_TRACKER_PATH'), roleIds: { diff --git a/src/features/archive-channels/util.ts b/src/features/archive-channels/util.ts index 9d2939f..c5fd426 100644 --- a/src/features/archive-channels/util.ts +++ b/src/features/archive-channels/util.ts @@ -45,7 +45,6 @@ export async function syncArchiveCategoryChannels(guild: Guild) { const errorMessages = failedReasons .map((reason) => reason.message || reason) .join('; '); - console.error(`Failed to archive some channels: ${errorMessages}`); throw new Error(`Failed to archive some channels: ${errorMessages}`); } } @@ -75,7 +74,14 @@ export function hasArchivedPermissions(channel: GuildChannel) { return false; } - return PUBLIC_PERMISSIONS.every((permission) => + // non-vc channels don't have the Connect permission, so we filter it out for those channels + const relevantPermissions = PUBLIC_PERMISSIONS.filter((permission) => + channel.type === ChannelType.GuildVoice + ? true + : permission !== PermissionFlagsBits.Connect + ); + + return relevantPermissions.every((permission) => overwrite.deny.has(permission) ); } @@ -92,12 +98,9 @@ export async function unarchiveChannel(channel: GuildChannel) { try { await setArchivedPermissions(channel, false); - await channel.setName(newChannelName); - } catch (error) { - console.error( - `Error unarchiving channel ${channelName}:`, - (error as Error).message - ); + if (newChannelName !== channelName) { + await channel.setName(newChannelName); + } } finally { processingChannels.delete(channel.id); } @@ -116,13 +119,10 @@ export async function archiveChannel(channel: GuildChannel) { processingChannels.add(channel.id); try { - const renamedChannel = await channel.setName(archivedChannelName); - await setArchivedPermissions(renamedChannel, true); - } catch (error) { - // console.error(`Error archiving channel ${channelName}:`, error); - throw new Error( - `Error archiving channel ${channelName}: ${(error as Error).message}` - ); + if (archivedChannelName !== channelName) { + await channel.setName(archivedChannelName); + } + await setArchivedPermissions(channel, true); } finally { processingChannels.delete(channel.id); } diff --git a/src/index.ts b/src/index.ts index 85dd229..1b3548e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,10 +1,17 @@ import { ActivityType, Client, GatewayIntentBits } from 'discord.js'; import { loadEvents } from './common/events/load-events.js'; import { config } from './env.js'; +import { isArchiveRateLimit } from './util/rate-limits.js'; const client = new Client({ rest: { timeout: 60_000, + rejectOnRateLimit: (rateLimitData) => { + if (isArchiveRateLimit(rateLimitData)) { + return true; + } + return false; + }, }, intents: [ GatewayIntentBits.Guilds, diff --git a/src/util/rate-limits.ts b/src/util/rate-limits.ts new file mode 100644 index 0000000..13dc467 --- /dev/null +++ b/src/util/rate-limits.ts @@ -0,0 +1,10 @@ +import { RateLimitData } from 'discord.js'; + +export function isArchiveRateLimit(rateLimitData: RateLimitData) { + console.log({ rateLimitData }); + return ( + rateLimitData.route === '/channels/:id' && + rateLimitData.method === 'PATCH' && + rateLimitData.scope === 'shared' + ); +} From 442488dbee24584346ddd4a58025d6cd7ee8bdfe Mon Sep 17 00:00:00 2001 From: Ali Hammoud Date: Sat, 29 Aug 2026 11:20:37 +0300 Subject: [PATCH 2/2] refactor: apply suggestions --- src/index.ts | 5 +---- src/util/rate-limits.ts | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index 1b3548e..08139a1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,10 +7,7 @@ const client = new Client({ rest: { timeout: 60_000, rejectOnRateLimit: (rateLimitData) => { - if (isArchiveRateLimit(rateLimitData)) { - return true; - } - return false; + return isArchiveRateLimit(rateLimitData); }, }, intents: [ diff --git a/src/util/rate-limits.ts b/src/util/rate-limits.ts index 13dc467..4eaf2c0 100644 --- a/src/util/rate-limits.ts +++ b/src/util/rate-limits.ts @@ -1,7 +1,6 @@ import { RateLimitData } from 'discord.js'; export function isArchiveRateLimit(rateLimitData: RateLimitData) { - console.log({ rateLimitData }); return ( rateLimitData.route === '/channels/:id' && rateLimitData.method === 'PATCH' &&