@@ -585,53 +585,66 @@ export async function setUserQueueRole(
585585) : Promise < void > {
586586 console . log ( `setting queue role for user ${ userId } in queue ${ queueId } ` )
587587 const currentRole = await getUserQueueRole ( queueId , userId )
588- const leaderboardRole = await getLeaderboardQueueRole ( queueId , userId )
589588 const allQueueRoles = await getAllQueueRoles ( queueId , false )
589+ const leaderboardRole = await getLeaderboardQueueRole ( queueId , userId )
590590
591591 const guild = await getGuild ( )
592592 const member = await guild . members . fetch ( userId )
593593
594- // Remove all MMR-based roles (where mmr_threshold is not null)
594+ // Get current member roles
595+ const currentRoleIds = new Set ( member . roles . cache . keys ( ) )
596+
597+ // Determine which queue roles should be added/removed
595598 const mmrRoles = allQueueRoles . filter ( ( role ) => role . mmr_threshold !== null )
596- for ( const role of mmrRoles ) {
597- try {
598- await member . roles . remove ( role . role_id )
599- } catch ( err ) {
600- console . error ( `Failed to remove MMR role ${ role . role_id } :` , err )
599+ const leaderboardRoles = allQueueRoles . filter (
600+ ( role ) => role . leaderboard_min !== null ,
601+ )
602+
603+ const rolesToRemove : string [ ] = [ ]
604+ const rolesToAdd : string [ ] = [ ]
605+
606+ // Check leaderboard roles
607+ for ( const role of leaderboardRoles ) {
608+ const expectedRole =
609+ leaderboardRole && role . role_id === leaderboardRole . role_id
610+
611+ if ( expectedRole && ! currentRoleIds . has ( role . role_id ) ) {
612+ rolesToAdd . push ( role . role_id )
613+ } else if ( ! expectedRole && currentRoleIds . has ( role . role_id ) ) {
614+ rolesToRemove . push ( role . role_id )
601615 }
602616 }
603617
604- // Add the current MMR-based role if one exists
605- if ( currentRole ) {
606- try {
607- await member . roles . add ( currentRole . role_id )
608- } catch ( err ) {
609- console . error ( `Failed to add MMR role ${ currentRole . role_id } :` , err )
618+ // Check MMR roles
619+ for ( const role of mmrRoles ) {
620+ const expectedRole = currentRole && role . role_id === currentRole . role_id
621+
622+ // If the user has the expected role, check if they are within the MMR range
623+ // Also don't add if they already have the role
624+ if ( expectedRole && ! currentRoleIds . has ( role . role_id ) ) {
625+ rolesToAdd . push ( role . role_id )
626+ } else if ( ! expectedRole && currentRoleIds . has ( role . role_id ) ) {
627+ rolesToRemove . push ( role . role_id )
610628 }
611629 }
612630
613- // Remove all leaderboard roles (where leaderboard_min is not null)
614- const leaderboardRoles = allQueueRoles . filter (
615- ( role ) => role . leaderboard_min !== null ,
616- )
617- for ( const role of leaderboardRoles ) {
618- try {
619- await member . roles . remove ( role . role_id )
620- } catch ( err ) {
621- console . error ( `Failed to remove leaderboard role ${ role . role_id } :` , err )
622- }
631+ // Do nothing if no role changes are needed
632+ if ( rolesToRemove . length === 0 && rolesToAdd . length === 0 ) {
633+ console . log ( `No role changes needed for user ${ userId } ` )
634+ return
623635 }
624636
625- // Add the current leaderboard role if one exists
626- if ( leaderboardRole ) {
627- try {
628- await member . roles . add ( leaderboardRole . role_id )
629- } catch ( err ) {
630- console . error (
631- `Failed to add leaderboard role ${ leaderboardRole . role_id } :` ,
632- err ,
633- )
637+ try {
638+ if ( rolesToRemove . length > 0 ) {
639+ await member . roles . remove ( rolesToRemove )
640+ console . log ( `Removed ${ rolesToRemove . length } roles from user ${ userId } ` )
641+ }
642+ if ( rolesToAdd . length > 0 ) {
643+ await member . roles . add ( rolesToAdd )
644+ console . log ( `Added ${ rolesToAdd . length } roles to user ${ userId } ` )
634645 }
646+ } catch ( err ) {
647+ console . error ( `Failed to update roles for user ${ userId } :` , err )
635648 }
636649}
637650
0 commit comments