diff --git a/src/env.ts b/src/env.ts index b595138..96f5e12 100644 --- a/src/env.ts +++ b/src/env.ts @@ -33,6 +33,16 @@ export const config = { channelId: requireEnv('GUIDES_CHANNEL_ID'), trackerPath: optionalEnv('GUIDES_TRACKER_PATH'), }, + 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 new file mode 100644 index 0000000..dabb624 --- /dev/null +++ b/src/events/auto-roles.ts @@ -0,0 +1,23 @@ +import { Events } from 'discord.js'; +import { config } from '../env.js'; +import { createEvent } from '../util/events.js'; +import { hasRoles } from '../util/member.js'; + +export const autoRoleEvent = createEvent( + { + name: Events.GuildMemberUpdate, + }, + async (_, newMember) => { + const hasRoleC = hasRoles(newMember, config.roleC); + if (!hasRoleC) { + const hasRequiredRoles = hasRoles(newMember, config.roleA, config.roleB); + if (hasRequiredRoles) { + try { + await newMember.roles.add(config.roleC); + } catch (error) { + console.error(`Failed to add roleC to ${newMember.user.tag}:`, error); + } + } + } + } +); diff --git a/src/util/member.ts b/src/util/member.ts new file mode 100644 index 0000000..33adab7 --- /dev/null +++ b/src/util/member.ts @@ -0,0 +1,5 @@ +import type { GuildMember } from 'discord.js'; + +export const hasRoles = (member: GuildMember, ...roles: string[]): boolean => { + return roles.every((roleId) => member.roles.cache.has(roleId)); +};