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 3889a085a..bc796695c 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 @@ -371,21 +371,30 @@ public class AUserExperienceServiceBean implements AUserExperienceService { userExperienceManagementService.saveUser(aUserExperience); } if(!Objects.equals(result.getOldRoleId(), result.getNewRoleId())) { - if(result.getOldRoleId() != null) { - roleService.removeRoleFromMemberAsync(member, result.getOldRoleId()).thenAccept(unused -> { - log.debug("Removed role {} to member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong()); + if(result.getOldRoleId() != null && result.getNewRoleId() != null) { + roleService.updateRolesIds(member, Arrays.asList(result.getOldRoleId()), Arrays.asList(result.getNewRoleId())).thenAccept(unused -> { + log.debug("Removed role {} from and added role {} to member {} in server {}.", result.getOldRoleId(), result.getNewRoleId(), member.getIdLong(), member.getGuild().getIdLong()); }).exceptionally(throwable -> { - log.warn("Failed to remove role {} from {} member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong(), throwable); - return null; - }); - } - if(result.getNewRoleId() != null) { - roleService.addRoleToMemberAsync(member, result.getNewRoleId()).thenAccept(unused -> { - log.debug("Added role {} to member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong()); - }).exceptionally(throwable -> { - log.warn("Failed to add role {} to {} member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong(), throwable); + log.warn("Failed to remove role {} from and add role {} to member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong(), throwable); return null; }); + } else { + if(result.getOldRoleId() != null) { + roleService.removeRoleFromMemberAsync(member, result.getOldRoleId()).thenAccept(unused -> { + log.debug("Removed role {} from member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong()); + }).exceptionally(throwable -> { + log.warn("Failed to remove role {} from {} member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong(), throwable); + return null; + }); + } + if(result.getNewRoleId() != null) { + roleService.addRoleToMemberAsync(member, result.getNewRoleId()).thenAccept(unused -> { + log.debug("Added role {} to member {} in server {}.", result.getNewRoleId(), member.getIdLong(), member.getGuild().getIdLong()); + }).exceptionally(throwable -> { + log.warn("Failed to add role {} to {} member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong(), throwable); + return null; + }); + } } } } else { 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 de7e684fa..fc296746e 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 @@ -85,6 +85,23 @@ public class RoleServiceBean implements RoleService { return addRoleToMemberAsync(member.getGuild(), member.getIdLong(), role); } + @Override + public CompletableFuture updateRolesIds(Member member, List rolesToRemove, List rolesToAdd) { + List rolesObjToRemove = rolesToRemove + .stream().map(aLong -> member.getGuild().getRoleById(aLong)) + .toList(); + + List rolesObjToAdd = rolesToAdd + .stream().map(aLong -> member.getGuild().getRoleById(aLong)) + .toList(); + return updateRolesObj(member, rolesObjToRemove, rolesObjToAdd); + } + + @Override + public CompletableFuture updateRolesObj(Member member, List rolesToRemove, List rolesToAdd) { + return member.getGuild().modifyMemberRoles(member, rolesToAdd, rolesToRemove).submit(); + } + @Override public CompletableFuture addRoleToMemberAsync(Member member, Role role) { return addRoleToMemberAsync(member.getGuild(), member.getIdLong(), role); diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/RoleService.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/RoleService.java index c7bbd8365..15879f831 100644 --- a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/RoleService.java +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/RoleService.java @@ -16,6 +16,8 @@ public interface RoleService { void addRoleToMember(AUserInAServer aUserInAServer, ARole role); CompletableFuture addRoleToUserAsync(AUserInAServer aUserInAServer, ARole role); CompletableFuture addRoleToMemberAsync(Member member, Long roleId); + CompletableFuture updateRolesIds(Member member, List rolesToRemove, List rolesToAdd); + CompletableFuture updateRolesObj(Member member, List rolesToRemove, List rolesToAdd); CompletableFuture addRoleToMemberAsync(Member member, Role role); void addRoleToMember(Member member, ARole role); CompletableFuture addRoleToMemberAsync(Member member, ARole role);