From 5084d17bedb1c1829a1eb43153876c1ccc9e8a94 Mon Sep 17 00:00:00 2001 From: Kenny Leloup Date: Tue, 22 Sep 2026 15:35:50 +0200 Subject: [PATCH 1/2] Add temporary roles for new member setup --- config.production.json | 2 ++ src/config.ts | 2 ++ src/events/guildMemberAdd.ts | 14 +++++++++ src/events/guildMemberUpdate.ts | 54 +++++++++++++++++++++++++++++++++ src/models/Configuration.ts | 2 ++ 5 files changed, 74 insertions(+) create mode 100644 src/events/guildMemberUpdate.ts diff --git a/config.production.json b/config.production.json index eaa8969..ee77f9b 100644 --- a/config.production.json +++ b/config.production.json @@ -12,6 +12,8 @@ "delegatesRoleid": "288659613732306944", "professorRoleid": "360457051417083907", "verifiedRoleId": "1048774703206109264", + "pseudoToChangeRoleId": "1550454126423441408", + "roleToSelectRoleId": "1550454055309021215", "informationsChannelid": "288666915314991107", "faqChannelid": "360126831376203778", "comiteeChannelid": "506564987914027008", diff --git a/src/config.ts b/src/config.ts index 1e4754b..d5d953b 100644 --- a/src/config.ts +++ b/src/config.ts @@ -15,6 +15,8 @@ const defaultConfig: Configuration = { delegatesRoleid: "", professorRoleid: "", verifiedRoleId: "", + pseudoToChangeRoleId: "", + roleToSelectRoleId: "", informationsChannelid: "", faqChannelid: "", comiteeChannelid: "", diff --git a/src/events/guildMemberAdd.ts b/src/events/guildMemberAdd.ts index 5fff629..6d392a5 100644 --- a/src/events/guildMemberAdd.ts +++ b/src/events/guildMemberAdd.ts @@ -30,6 +30,13 @@ async function guildMemberAdd(client: DatadropClient, member: GuildMember) { comiteeChannelid, } = client.config; const annoncesRole = await member.guild.roles.fetch(announce.roleid); + const pseudoToChangeRole = client.config.pseudoToChangeRoleId + ? await member.guild.roles.fetch(client.config.pseudoToChangeRoleId) + : null; + + const roleToSelectRole = client.config.roleToSelectRoleId + ? await member.guild.roles.fetch(client.config.roleToSelectRoleId) + : null; const userFromDatabase = await client.database.read(member.id); if (userFromDatabase?.isDeleted) { @@ -59,6 +66,13 @@ async function guildMemberAdd(client: DatadropClient, member: GuildMember) { `Le rôle <${annoncesRole.name}> a été ajouté à <${member.user.tag}> à l'entrée de la guilde`, ); } + if (pseudoToChangeRole) { + await member.roles.add(pseudoToChangeRole); + } + + if (roleToSelectRole) { + await member.roles.add(roleToSelectRole); + } await member.send({ embeds: [embed], components: [row] }); client.logger.info( diff --git a/src/events/guildMemberUpdate.ts b/src/events/guildMemberUpdate.ts new file mode 100644 index 0000000..d40f527 --- /dev/null +++ b/src/events/guildMemberUpdate.ts @@ -0,0 +1,54 @@ +import { Events, type GuildMember } from "discord.js"; + +import type { DatadropClient } from "../datadrop.js"; +import type { Event } from "../models/index.js"; + +export default { + name: Events.GuildMemberUpdate, + execute: guildMemberUpdate, +} as Event; + +async function guildMemberUpdate( + client: DatadropClient, + oldMember: GuildMember, + newMember: GuildMember, +) { + if (newMember.user.bot) return; + + if ( + !client.config.roleToSelectRoleId || + !client.config.pseudoToChangeRoleId + ) + return; + + const { first, second, third, roleToSelectRoleId, pseudoToChangeRoleId } = + client.config; + + const hasYearRole = + newMember.roles.cache.has(first.roleid) || + newMember.roles.cache.has(second.roleid) || + newMember.roles.cache.has(third.roleid); + + const displayNameParts = newMember.displayName.trim().split(/\s+/); + const hasDisplayNameChanged = + oldMember.displayName !== newMember.displayName; + const hasValidDisplayName = displayNameParts.length >= 2; + + if (hasYearRole && newMember.roles.cache.has(roleToSelectRoleId)) { + await newMember.roles.remove(roleToSelectRoleId); + client.logger.info( + `Le rôle a été retiré à <${newMember.user.tag}>`, + ); + } + + if ( + hasDisplayNameChanged && + hasValidDisplayName && + newMember.roles.cache.has(pseudoToChangeRoleId) + ) { + await newMember.roles.remove(pseudoToChangeRoleId); + client.logger.info( + `Le rôle a été retiré à <${newMember.user.tag}>`, + ); + } +} diff --git a/src/models/Configuration.ts b/src/models/Configuration.ts index 7f36040..12ded11 100644 --- a/src/models/Configuration.ts +++ b/src/models/Configuration.ts @@ -40,6 +40,8 @@ export interface Configuration { delegatesRoleid: Snowflake; professorRoleid: Snowflake; verifiedRoleId: Snowflake; + pseudoToChangeRoleId?: Snowflake; + roleToSelectRoleId?: Snowflake; informationsChannelid: Snowflake; faqChannelid: Snowflake; From 75fbcdb3be090c518cf47e75efd80d7532b2e71d Mon Sep 17 00:00:00 2001 From: Kenny Leloup Date: Wed, 23 Sep 2026 13:54:39 +0200 Subject: [PATCH 2/2] Apply review feedback --- src/events/guildMemberAdd.ts | 12 ++++++------ src/events/guildMemberUpdate.ts | 22 +++++++++++----------- src/models/Configuration.ts | 4 ++-- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/events/guildMemberAdd.ts b/src/events/guildMemberAdd.ts index 6d392a5..c0133f9 100644 --- a/src/events/guildMemberAdd.ts +++ b/src/events/guildMemberAdd.ts @@ -28,15 +28,15 @@ async function guildMemberAdd(client: DatadropClient, member: GuildMember) { faqChannelid, rolesChannelid, comiteeChannelid, + pseudoToChangeRoleId, + roleToSelectRoleId, } = client.config; const annoncesRole = await member.guild.roles.fetch(announce.roleid); - const pseudoToChangeRole = client.config.pseudoToChangeRoleId - ? await member.guild.roles.fetch(client.config.pseudoToChangeRoleId) - : null; + const pseudoToChangeRole = + await member.guild.roles.fetch(pseudoToChangeRoleId); - const roleToSelectRole = client.config.roleToSelectRoleId - ? await member.guild.roles.fetch(client.config.roleToSelectRoleId) - : null; + const roleToSelectRole = + await member.guild.roles.fetch(roleToSelectRoleId); const userFromDatabase = await client.database.read(member.id); if (userFromDatabase?.isDeleted) { diff --git a/src/events/guildMemberUpdate.ts b/src/events/guildMemberUpdate.ts index d40f527..97c9303 100644 --- a/src/events/guildMemberUpdate.ts +++ b/src/events/guildMemberUpdate.ts @@ -15,29 +15,29 @@ async function guildMemberUpdate( ) { if (newMember.user.bot) return; - if ( - !client.config.roleToSelectRoleId || - !client.config.pseudoToChangeRoleId - ) - return; - const { first, second, third, roleToSelectRoleId, pseudoToChangeRoleId } = client.config; const hasYearRole = - newMember.roles.cache.has(first.roleid) || - newMember.roles.cache.has(second.roleid) || - newMember.roles.cache.has(third.roleid); + newMember.roles.resolve(first.roleid) || + newMember.roles.resolve(second.roleid) || + newMember.roles.resolve(third.roleid); const displayNameParts = newMember.displayName.trim().split(/\s+/); const hasDisplayNameChanged = oldMember.displayName !== newMember.displayName; const hasValidDisplayName = displayNameParts.length >= 2; + const roleToSelectRole = + await newMember.guild.roles.fetch(roleToSelectRoleId); + + const pseudoToChangeRole = + await newMember.guild.roles.fetch(pseudoToChangeRoleId); + if (hasYearRole && newMember.roles.cache.has(roleToSelectRoleId)) { await newMember.roles.remove(roleToSelectRoleId); client.logger.info( - `Le rôle a été retiré à <${newMember.user.tag}>`, + `Le rôle <${roleToSelectRole?.name}> a été retiré à <${newMember.user.tag}>`, ); } @@ -48,7 +48,7 @@ async function guildMemberUpdate( ) { await newMember.roles.remove(pseudoToChangeRoleId); client.logger.info( - `Le rôle a été retiré à <${newMember.user.tag}>`, + `Le rôle <${pseudoToChangeRole?.name}> a été retiré à <${newMember.user.tag}>`, ); } } diff --git a/src/models/Configuration.ts b/src/models/Configuration.ts index 12ded11..7e812d7 100644 --- a/src/models/Configuration.ts +++ b/src/models/Configuration.ts @@ -40,8 +40,8 @@ export interface Configuration { delegatesRoleid: Snowflake; professorRoleid: Snowflake; verifiedRoleId: Snowflake; - pseudoToChangeRoleId?: Snowflake; - roleToSelectRoleId?: Snowflake; + pseudoToChangeRoleId: Snowflake; + roleToSelectRoleId: Snowflake; informationsChannelid: Snowflake; faqChannelid: Snowflake;