diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/listener/JoiningUserRoleListener.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/listener/JoiningUserRoleListener.java index 0daa0f81c..3fe037854 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/listener/JoiningUserRoleListener.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/listener/JoiningUserRoleListener.java @@ -46,7 +46,7 @@ public class JoiningUserRoleListener implements AsyncJoinListener { Optional userExperienceOptional = userExperienceManagementService.findByUserInServerIdOptional(aUserInAServer.getUserInServerId()); if(userExperienceOptional.isPresent()) { log.info("User {} joined {} with previous experience. Setting up experience role again (if necessary).", model.getJoiningUser().getUserId(), model.getServerId()); - userExperienceService.syncForSingleUser(userExperienceOptional.get(), model.getMember()).thenAccept(result -> + userExperienceService.syncForSingleUser(userExperienceOptional.get(), model.getMember(), true).thenAccept(result -> log.info("Finished re-assigning experience for re-joining user {} in server {}.", model.getJoiningUser().getUserId(), model.getServerId()) ); } else { diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/listener/MemberPendingRoleListener.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/listener/MemberPendingRoleListener.java index 5b5a57b83..295976de3 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/listener/MemberPendingRoleListener.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/listener/MemberPendingRoleListener.java @@ -41,7 +41,7 @@ public class MemberPendingRoleListener implements AsyncUpdatePendingListener { Optional userExperienceOptional = userExperienceManagementService.findByUserInServerIdOptional(aUserInAServer.getUserInServerId()); if(userExperienceOptional.isPresent()) { log.info("User {} updated pending status {} with previous experience. Setting up experience role again (if necessary).", model.getUser().getUserId(), model.getServerId()); - userExperienceService.syncForSingleUser(userExperienceOptional.get(), model.getMember()).thenAccept(result -> + userExperienceService.syncForSingleUser(userExperienceOptional.get(), model.getMember(), true).thenAccept(result -> log.info("Finished re-assigning experience for update pending user {} in server {}.", model.getUser().getUserId(), model.getServerId()) ); } else { diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBean.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBean.java index aa5d79754..0f973bc17 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBean.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBean.java @@ -252,17 +252,17 @@ public class AUserExperienceServiceBean implements AUserExperienceService { public CompletableFuture syncUser(Member member, List roles) { AUserInAServer aUserInAServer = userInServerManagementService.loadOrCreateUser(member); AUserExperience userExperience = userExperienceManagementService.findByUserInServerId(aUserInAServer.getUserInServerId()); - return calculateAndApplyExperienceRole(userExperience, member, roles); + return calculateAndApplyExperienceRole(userExperience, member, roles, false); } @Override - public CompletableFuture syncForSingleUser(AUserExperience userExperience, Member member) { + public CompletableFuture syncForSingleUser(AUserExperience userExperience, Member member, boolean forceRoles) { List roles = experienceRoleManagementService.getExperienceRolesForServer(userExperience.getServer()); roles.sort(Comparator.comparing(role -> role.getLevel().getLevel())); - return calculateAndApplyExperienceRole(userExperience, member, roles); + return calculateAndApplyExperienceRole(userExperience, member, roles, forceRoles); } - private CompletableFuture calculateAndApplyExperienceRole(AUserExperience userExperience, Member member, List roles) { + private CompletableFuture calculateAndApplyExperienceRole(AUserExperience userExperience, Member member, List roles, boolean forceRoles) { AExperienceRole calculatedNewRole = experienceRoleService.calculateRole(roles, userExperience.getCurrentLevel().getLevel()); Long oldRoleId = userExperience.getCurrentExperienceRole() != null && userExperience.getCurrentExperienceRole().getRole() != null ? userExperience.getCurrentExperienceRole().getRole().getId() : null; Long newRoleId = calculatedNewRole != null ? calculatedNewRole.getRole().getId() : null; @@ -270,15 +270,15 @@ public class AUserExperienceServiceBean implements AUserExperienceService { userExperience.setCurrentExperienceRole(calculatedNewRole); CompletableFuture returningFuture; - if(!Objects.equals(oldRoleId, newRoleId)) { + if(!Objects.equals(oldRoleId, newRoleId) || forceRoles) { CompletableFuture addingFuture; - if(oldRoleId != null) { + if(oldRoleId != null || forceRoles) { addingFuture = roleService.removeRoleFromMemberAsync(member, oldRoleId); } else { addingFuture = CompletableFuture.completedFuture(null); } CompletableFuture removingFeature; - if(newRoleId != null) { + if(newRoleId != null || forceRoles) { removingFeature = roleService.addRoleToMemberAsync(member, newRoleId); } else { removingFeature = CompletableFuture.completedFuture(null); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/listener/JoiningUserRoleListenerTest.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/listener/JoiningUserRoleListenerTest.java index d691039c4..9b01d3ccb 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/listener/JoiningUserRoleListenerTest.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/listener/JoiningUserRoleListenerTest.java @@ -67,7 +67,7 @@ public class JoiningUserRoleListenerTest { public void testUserWithExperienceRejoining() { AUserExperience experience = Mockito.mock(AUserExperience.class); when(userExperienceManagementService.findByUserInServerIdOptional(USER_IN_SERVER_ID)).thenReturn(Optional.of(experience)); - when(userExperienceService.syncForSingleUser(experience, member)).thenReturn(CompletableFuture.completedFuture(null)); + when(userExperienceService.syncForSingleUser(experience, member, true)).thenReturn(CompletableFuture.completedFuture(null)); when(model.getMember()).thenReturn(member); DefaultListenerResult result = testUnit.execute(model); Assert.assertEquals(DefaultListenerResult.PROCESSED, result); @@ -78,7 +78,7 @@ public class JoiningUserRoleListenerTest { when(model.getMember()).thenReturn(member); when(userExperienceManagementService.findByUserInServerIdOptional(USER_IN_SERVER_ID)).thenReturn(Optional.empty()); testUnit.execute(model); - verify(userExperienceService, times(0)).syncForSingleUser(any(), any()); + verify(userExperienceService, times(0)).syncForSingleUser(any(), any(), eq(true)); } @Test @@ -86,7 +86,7 @@ public class JoiningUserRoleListenerTest { when(member.isPending()).thenReturn(true); when(model.getMember()).thenReturn(member); testUnit.execute(model); - verify(userExperienceService, times(0)).syncForSingleUser(any(), any()); + verify(userExperienceService, times(0)).syncForSingleUser(any(), any(), any()); } } diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceService.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceService.java index f32b5a0a0..25ed98403 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceService.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceService.java @@ -44,7 +44,7 @@ public interface AUserExperienceService { CompletableFuture syncUserRolesWithFeedback(AServer server, MessageChannel messageChannel); - CompletableFuture syncForSingleUser(AUserExperience userExperience, Member member); + CompletableFuture syncForSingleUser(AUserExperience userExperience, Member member, boolean changeRoles); /** * Loads the desired page of the ordered complete leaderboard from the {@link AServer} and returns the information as a {@link LeaderBoard} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/RoleServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/RoleServiceBean.java index 9e812f722..de7e684fa 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/RoleServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/RoleServiceBean.java @@ -122,10 +122,6 @@ public class RoleServiceBean implements RoleService { } private CompletableFuture addRoleToUserAsync(Guild guild, Long userId, ARole role) { - if(role.getDeleted()) { - log.warn("Not possible to add role to user. Role {} was marked as deleted.", role.getId()); - throw new RoleDeletedException(role); - } Role roleById = guild.getRoleById(role.getId()); if(roleById != null) { log.info("Adding role {} to user {} in server {}.", role.getId(), userId, guild.getId());