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..c0133f9 100644 --- a/src/events/guildMemberAdd.ts +++ b/src/events/guildMemberAdd.ts @@ -28,8 +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 = + await member.guild.roles.fetch(pseudoToChangeRoleId); + + const roleToSelectRole = + await member.guild.roles.fetch(roleToSelectRoleId); 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..97c9303 --- /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; + + const { first, second, third, roleToSelectRoleId, pseudoToChangeRoleId } = + client.config; + + const hasYearRole = + 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 <${roleToSelectRole?.name}> 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 <${pseudoToChangeRole?.name}> a été retiré à <${newMember.user.tag}>`, + ); + } +} diff --git a/src/models/Configuration.ts b/src/models/Configuration.ts index 7f36040..7e812d7 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;