Skip to content

Commit 163b0f6

Browse files
authored
🌟 feat: add auto role assignment based on other roles (#31)
* 🌟 feat: add auto role assignment based on other roels * πŸ”¨ refactor: rename memberHasRoles to hasRoles * πŸ”¨ refactor: remove unecessary return by switching the condition 'hasRoleC` -> `!hasRoleC` * feat: remove auto-role assignment from events for later setup
1 parent e67068a commit 163b0f6

3 files changed

Lines changed: 38 additions & 0 deletions

File tree

β€Žsrc/env.tsβ€Ž

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ export const config = {
3333
channelId: requireEnv('GUIDES_CHANNEL_ID'),
3434
trackerPath: optionalEnv('GUIDES_TRACKER_PATH'),
3535
},
36+
roleA: requireEnv('ROLE_A_ID'),
37+
roleB: requireEnv('ROLE_B_ID'),
38+
roleC: requireEnv('ROLE_C_ID'),
39+
// Add more config sections as needed:
40+
// database: {
41+
// url: requireEnv('DATABASE_URL'),
42+
// },
43+
// api: {
44+
// openaiKey: optionalEnv('OPENAI_API_KEY'),
45+
// },
3646
};
3747

3848
export type Config = typeof config;

β€Žsrc/events/auto-roles.tsβ€Ž

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { Events } from 'discord.js';
2+
import { config } from '../env.js';
3+
import { createEvent } from '../util/events.js';
4+
import { hasRoles } from '../util/member.js';
5+
6+
export const autoRoleEvent = createEvent(
7+
{
8+
name: Events.GuildMemberUpdate,
9+
},
10+
async (_, newMember) => {
11+
const hasRoleC = hasRoles(newMember, config.roleC);
12+
if (!hasRoleC) {
13+
const hasRequiredRoles = hasRoles(newMember, config.roleA, config.roleB);
14+
if (hasRequiredRoles) {
15+
try {
16+
await newMember.roles.add(config.roleC);
17+
} catch (error) {
18+
console.error(`Failed to add roleC to ${newMember.user.tag}:`, error);
19+
}
20+
}
21+
}
22+
}
23+
);

β€Žsrc/util/member.tsβ€Ž

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import type { GuildMember } from 'discord.js';
2+
3+
export const hasRoles = (member: GuildMember, ...roles: string[]): boolean => {
4+
return roles.every((roleId) => member.roles.cache.has(roleId));
5+
};

0 commit comments

Comments
Β (0)