@@ -585,53 +585,65 @@ 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+ if ( expectedRole && ! currentRoleIds . has ( role . role_id ) ) {
624+ rolesToAdd . push ( role . role_id )
625+ } else if ( ! expectedRole && currentRoleIds . has ( role . role_id ) ) {
626+ rolesToRemove . push ( role . role_id )
610627 }
611628 }
612629
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- }
630+ // Do nothing if no role changes are needed
631+ if ( rolesToRemove . length === 0 && rolesToAdd . length === 0 ) {
632+ console . log ( `No role changes needed for user ${ userId } ` )
633+ return
623634 }
624635
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- )
636+ try {
637+ if ( rolesToRemove . length > 0 ) {
638+ await member . roles . remove ( rolesToRemove )
639+ console . log ( `Removed ${ rolesToRemove . length } roles from user ${ userId } ` )
640+ }
641+ if ( rolesToAdd . length > 0 ) {
642+ await member . roles . add ( rolesToAdd )
643+ console . log ( `Added ${ rolesToAdd . length } roles to user ${ userId } ` )
634644 }
645+ } catch ( err ) {
646+ console . error ( `Failed to update roles for user ${ userId } :` , err )
635647 }
636648}
637649
0 commit comments