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..08139a1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,10 +1,14 @@ 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) => { + return isArchiveRateLimit(rateLimitData); + }, }, intents: [ GatewayIntentBits.Guilds, diff --git a/src/util/rate-limits.ts b/src/util/rate-limits.ts new file mode 100644 index 0000000..4eaf2c0 --- /dev/null +++ b/src/util/rate-limits.ts @@ -0,0 +1,9 @@ +import { RateLimitData } from 'discord.js'; + +export function isArchiveRateLimit(rateLimitData: RateLimitData) { + return ( + rateLimitData.route === '/channels/:id' && + rateLimitData.method === 'PATCH' && + rateLimitData.scope === 'shared' + ); +}