From c02ded6a60ff90d0377922a3ab1561ed48d2c559 Mon Sep 17 00:00:00 2001 From: Ali Hammoud Date: Thu, 6 Nov 2025 01:32:30 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=9F=20feat:=20update=20configuration?= =?UTF-8?q?=20structure=20to=20group=20roles=20and=20channels=20for=20bett?= =?UTF-8?q?er=20organization?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/commands/moderation/repel.ts | 10 ++++----- src/env.ts | 35 +++++++++++++------------------- src/events/auto-roles.ts | 6 +++--- src/events/ready.ts | 4 ++-- src/util/post-guides.ts | 2 +- 5 files changed, 24 insertions(+), 33 deletions(-) diff --git a/src/commands/moderation/repel.ts b/src/commands/moderation/repel.ts index 4781b3f..bc8f0e5 100644 --- a/src/commands/moderation/repel.ts +++ b/src/commands/moderation/repel.ts @@ -14,8 +14,8 @@ import { } from 'discord.js'; import { HOUR, MINUTE, timeToString } from '../../constants/time.js'; import { config } from '../../env.js'; -import { logToChannel } from '../../util/channel-logging.js'; import { getPublicChannels } from '../../util/channel.js'; +import { logToChannel } from '../../util/channel-logging.js'; import { buildCommandString, createCommand } from '../../util/commands.js'; const DEFAULT_LOOK_BACK_MS = 10 * MINUTE; @@ -287,11 +287,9 @@ const logRepelAction = async ({ const modMessage = interaction.options.getString(RepelOptions.MESSAGE_FOR_MODS) ?? false; const mentionText = modMessage - ? `${config.moderatorsRoleIds.map((id) => `<@&${id}>`)} - ${modMessage}` + ? `${config.roleIds.moderators.map((id) => `<@&${id}>`)} - ${modMessage}` : undefined; - const channel = interaction.client.channels.cache.get( - config.repel.repelLogChannelId - ) as TextChannel; + const channel = interaction.client.channels.cache.get(config.channelIds.repelLogs) as TextChannel; const embed = failedChannelsEmbed !== null @@ -390,7 +388,7 @@ export const repelCommand = createCommand({ } await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - const repelRole = interaction.guild.roles.cache.get(config.repel.repelRoleId); + const repelRole = interaction.guild.roles.cache.get(config.roleIds.repel); if (!repelRole) { await interaction.editReply({ content: '❌ Repel role is not configured correctly. Please contact an administrator.', diff --git a/src/env.ts b/src/env.ts index f91afa3..2f853a9 100644 --- a/src/env.ts +++ b/src/env.ts @@ -20,29 +20,22 @@ export const config = { token: requireEnv('DISCORD_TOKEN'), clientId: requireEnv('CLIENT_ID'), }, - repel: { - repelLogChannelId: requireEnv('REPEL_LOG_CHANNEL_ID'), - repelRoleId: requireEnv('REPEL_ROLE_ID'), - }, - fetchAndSyncMessages: true, serverId: requireEnv('SERVER_ID'), - moderatorsRoleIds: requireEnv('MODERATORS_ROLE_IDS') - ? requireEnv('MODERATORS_ROLE_IDS').split(',') - : [], - guides: { - channelId: requireEnv('GUIDES_CHANNEL_ID'), - trackerPath: optionalEnv('GUIDES_TRACKER_PATH'), + fetchAndSyncMessages: true, + guidesTrackerPath: optionalEnv('GUIDES_TRACKER_PATH'), + roleIds: { + moderators: requireEnv('MODERATORS_ROLE_IDS') + ? requireEnv('MODERATORS_ROLE_IDS').split(',') + : [], + repel: requireEnv('REPEL_ROLE_ID'), + a: requireEnv('ROLE_A_ID'), + b: requireEnv('ROLE_B_ID'), + c: requireEnv('ROLE_C_ID'), + }, + channelIds: { + repelLogs: requireEnv('REPEL_LOG_CHANNEL_ID'), + guides: requireEnv('GUIDES_CHANNEL_ID'), }, - // roleA: requireEnv('ROLE_A_ID'), - // roleB: requireEnv('ROLE_B_ID'), - // roleC: requireEnv('ROLE_C_ID'), - // Add more config sections as needed: - // database: { - // url: requireEnv('DATABASE_URL'), - // }, - // api: { - // openaiKey: optionalEnv('OPENAI_API_KEY'), - // }, }; export type Config = typeof config; diff --git a/src/events/auto-roles.ts b/src/events/auto-roles.ts index dabb624..08ff7ad 100644 --- a/src/events/auto-roles.ts +++ b/src/events/auto-roles.ts @@ -8,12 +8,12 @@ export const autoRoleEvent = createEvent( name: Events.GuildMemberUpdate, }, async (_, newMember) => { - const hasRoleC = hasRoles(newMember, config.roleC); + const hasRoleC = hasRoles(newMember, config.roleIds.c); if (!hasRoleC) { - const hasRequiredRoles = hasRoles(newMember, config.roleA, config.roleB); + const hasRequiredRoles = hasRoles(newMember, config.roleIds.a, config.roleIds.b); if (hasRequiredRoles) { try { - await newMember.roles.add(config.roleC); + await newMember.roles.add(config.roleIds.c); } catch (error) { console.error(`Failed to add roleC to ${newMember.user.tag}:`, error); } diff --git a/src/events/ready.ts b/src/events/ready.ts index 5a50475..a9f45f8 100644 --- a/src/events/ready.ts +++ b/src/events/ready.ts @@ -27,8 +27,8 @@ export const readyEvent = createEvent( // Sync guides to channel try { - console.log(`🔄 Starting guide sync to channel ${config.guides.channelId}...`); - await syncGuidesToChannel(client, config.guides.channelId); + console.log(`🔄 Starting guide sync to channel ${config.channelIds.guides}...`); + await syncGuidesToChannel(client, config.channelIds.guides); } catch (error) { if (error && typeof error === 'object' && 'code' in error) { const discordError = error as { code: number; message?: string }; diff --git a/src/util/post-guides.ts b/src/util/post-guides.ts index 8cd0c0c..0e5352a 100644 --- a/src/util/post-guides.ts +++ b/src/util/post-guides.ts @@ -33,7 +33,7 @@ export type GuideTracker = { const GUIDES_DIR = fileURLToPath(new URL('../commands/guides/subjects/', import.meta.url)); -const TRACKER_FILE = config.guides.trackerPath ?? 'guides-tracker.json'; +const TRACKER_FILE = config.guidesTrackerPath ?? 'guides-tracker.json'; const calculateHash = (content: string): string => { return createHash('sha256').update(content, 'utf8').digest('hex');