[AB-79] fix not applying role for re-joining users upon sync

This commit is contained in:
Sheldan
2022-12-27 13:03:59 +01:00
parent 74f54e1257
commit 41f42ee110
6 changed files with 13 additions and 17 deletions

View File

@@ -46,7 +46,7 @@ public class JoiningUserRoleListener implements AsyncJoinListener {
Optional<AUserExperience> 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 {

View File

@@ -41,7 +41,7 @@ public class MemberPendingRoleListener implements AsyncUpdatePendingListener {
Optional<AUserExperience> 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 {

View File

@@ -252,17 +252,17 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
public CompletableFuture<Void> syncUser(Member member, List<AExperienceRole> 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<Void> syncForSingleUser(AUserExperience userExperience, Member member) {
public CompletableFuture<Void> syncForSingleUser(AUserExperience userExperience, Member member, boolean forceRoles) {
List<AExperienceRole> 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<Void> calculateAndApplyExperienceRole(AUserExperience userExperience, Member member, List<AExperienceRole> roles) {
private CompletableFuture<Void> calculateAndApplyExperienceRole(AUserExperience userExperience, Member member, List<AExperienceRole> 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<Void> returningFuture;
if(!Objects.equals(oldRoleId, newRoleId)) {
if(!Objects.equals(oldRoleId, newRoleId) || forceRoles) {
CompletableFuture<Void> addingFuture;
if(oldRoleId != null) {
if(oldRoleId != null || forceRoles) {
addingFuture = roleService.removeRoleFromMemberAsync(member, oldRoleId);
} else {
addingFuture = CompletableFuture.completedFuture(null);
}
CompletableFuture<Void> removingFeature;
if(newRoleId != null) {
if(newRoleId != null || forceRoles) {
removingFeature = roleService.addRoleToMemberAsync(member, newRoleId);
} else {
removingFeature = CompletableFuture.completedFuture(null);

View File

@@ -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());
}
}

View File

@@ -44,7 +44,7 @@ public interface AUserExperienceService {
CompletableFuture<Void> syncUserRolesWithFeedback(AServer server, MessageChannel messageChannel);
CompletableFuture<Void> syncForSingleUser(AUserExperience userExperience, Member member);
CompletableFuture<Void> 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}

View File

@@ -122,10 +122,6 @@ public class RoleServiceBean implements RoleService {
}
private CompletableFuture<Void> 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());