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 5d83be779..d0198628b 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 @@ -313,107 +313,107 @@ public class AUserExperienceServiceBean implements AUserExperienceService { Long userInServerId = userInAServer.getUserInServerId(); Optional aUserExperienceOptional = userExperienceManagementService.findByUserInServerIdOptional(userInAServer.getUserInServerId()); AUserExperience aUserExperience = aUserExperienceOptional.orElseGet(() -> userExperienceManagementService.createUserInServer(userInAServer)); - if(Boolean.FALSE.equals(aUserExperience.getExperienceGainDisabled())) { - List levels = experienceLevelManagementService.getLevelConfig(); - levels.sort(Comparator.comparing(AExperienceLevel::getExperienceNeeded)); - - Long minExp = configService.getLongValueOrConfigDefault(ExperienceFeatureConfig.MIN_EXP_KEY, serverId); - Long maxExp = configService.getLongValueOrConfigDefault(ExperienceFeatureConfig.MAX_EXP_KEY, serverId); - Double multiplier = configService.getDoubleValueOrConfigDefault(ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, serverId); - Long experienceRange = maxExp - minExp + 1; - Long gainedExperience = (secureRandom.nextInt(experienceRange.intValue()) + minExp); - gainedExperience = (long) Math.floor(gainedExperience * multiplier); - - List roles = experienceRoleManagementService.getExperienceRolesForServer(server); - roles.sort(Comparator.comparing(role -> role.getLevel().getLevel())); - - log.debug("Handling {}. The user gains {}.", userInServerId, gainedExperience); - - Long oldExperience = aUserExperience.getExperience(); - Long newExperienceCount = oldExperience + gainedExperience; - aUserExperience.setExperience(newExperienceCount); - AExperienceLevel newLevel = calculateLevel(levels, newExperienceCount); - RoleCalculationResult result = RoleCalculationResult - .builder() - .build(); - boolean userChangesLevel = !Objects.equals(newLevel.getLevel(), aUserExperience.getCurrentLevel().getLevel()); - Integer oldLevel = aUserExperience.getCurrentLevel() != null ? aUserExperience.getCurrentLevel().getLevel() : 0; - if(userChangesLevel) { - log.info("User {} in server {} changed level. New {}, Old {}.", member.getIdLong(), - member.getGuild().getIdLong(), newLevel.getLevel(), - oldLevel); - aUserExperience.setCurrentLevel(newLevel); - AExperienceRole calculatedNewRole = experienceRoleService.calculateRole(roles, newLevel.getLevel()); - Long oldRoleId = aUserExperience.getCurrentExperienceRole() != null && aUserExperience.getCurrentExperienceRole().getRole() != null ? aUserExperience.getCurrentExperienceRole().getRole().getId() : null; - Long newRoleId = calculatedNewRole != null && calculatedNewRole.getRole() != null ? calculatedNewRole.getRole().getId() : null; - result.setOldRoleId(oldRoleId); - result.setNewRoleId(newRoleId); - if(message != null - && aUserExperience.getLevelUpNotification() - && featureModeService.featureModeActive(ExperienceFeatureDefinition.EXPERIENCE, serverId, ExperienceFeatureMode.LEVEL_UP_NOTIFICATION)) { - LevelUpNotificationModel model = LevelUpNotificationModel - .builder() - .memberDisplay(MemberDisplay.fromMember(member)) - .oldExperience(oldExperience) - .newExperience(newExperienceCount) - .newLevel(newLevel.getLevel()) - .oldLevel(oldLevel) - .newRole(oldRoleId != null ? RoleDisplay.fromRole(oldRoleId) : null) - .newRole(newRoleId != null ? RoleDisplay.fromRole(newRoleId) : null) - .build(); - MessageToSend messageToSend = templateService.renderEmbedTemplate("experience_level_up_notification", model, serverId); - FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, message.getChannel())).thenAccept(unused -> { - log.info("Sent level up notification to user {} in server {} in channel {}.", member.getIdLong(), serverId, message.getChannel().getIdLong()); - }).exceptionally(throwable -> { - log.warn("Failed to send level up notification to user {} in server {} in channel {}.", member.getIdLong(), serverId, message.getChannel().getIdLong()); - return null; - }); - } - aUserExperience.setCurrentExperienceRole(calculatedNewRole); - } - aUserExperience.setMessageCount(aUserExperience.getMessageCount() + 1L); - if(userChangesLevel && featureModeService.featureModeActive(ExperienceFeatureDefinition.EXPERIENCE, server, ExperienceFeatureMode.LEVEL_ACTION)) { - levelActionService.applyLevelActionsToUser(aUserExperience, oldLevel) - .thenAccept(unused -> { - log.info("Executed level actions for user {}.", userInServerId); - }) - .exceptionally(throwable -> { - log.warn("Failed to execute level actions for user {}.", userInServerId, throwable); - return null; - }); - } - if(aUserExperienceOptional.isEmpty()) { - userExperienceManagementService.saveUser(aUserExperience); - } - if(!Objects.equals(result.getOldRoleId(), result.getNewRoleId())) { - 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 and add role {} to member {} in server {}.", result.getOldRoleId(), result.getNewRoleId(), 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 { + if (aUserExperience.getExperienceGainDisabled().equals(Boolean.TRUE)) { log.debug("Experience gain was disabled. User did not gain any experience."); + return; + } + List levels = experienceLevelManagementService.getLevelConfig(); + levels.sort(Comparator.comparing(AExperienceLevel::getExperienceNeeded)); + + Long minExp = configService.getLongValueOrConfigDefault(ExperienceFeatureConfig.MIN_EXP_KEY, serverId); + Long maxExp = configService.getLongValueOrConfigDefault(ExperienceFeatureConfig.MAX_EXP_KEY, serverId); + Double multiplier = configService.getDoubleValueOrConfigDefault(ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, serverId); + Long experienceRange = maxExp - minExp + 1; + Long gainedExperience = (secureRandom.nextInt(experienceRange.intValue()) + minExp); + gainedExperience = (long) Math.floor(gainedExperience * multiplier); + + List roles = experienceRoleManagementService.getExperienceRolesForServer(server); + roles.sort(Comparator.comparing(role -> role.getLevel().getLevel())); + + log.debug("Handling {}. The user gains {}.", userInServerId, gainedExperience); + + Long oldExperience = aUserExperience.getExperience(); + Long newExperienceCount = oldExperience + gainedExperience; + aUserExperience.setExperience(newExperienceCount); + AExperienceLevel newLevel = calculateLevel(levels, newExperienceCount); + RoleCalculationResult result = RoleCalculationResult + .builder() + .build(); + boolean userChangesLevel = !Objects.equals(newLevel.getLevel(), aUserExperience.getCurrentLevel().getLevel()); + Integer oldLevel = aUserExperience.getCurrentLevel() != null ? aUserExperience.getCurrentLevel().getLevel() : 0; + if(userChangesLevel) { + log.info("User {} in server {} changed level. New {}, Old {}.", member.getIdLong(), + member.getGuild().getIdLong(), newLevel.getLevel(), + oldLevel); + aUserExperience.setCurrentLevel(newLevel); + AExperienceRole calculatedNewRole = experienceRoleService.calculateRole(roles, newLevel.getLevel()); + Long oldRoleId = aUserExperience.getCurrentExperienceRole() != null && aUserExperience.getCurrentExperienceRole().getRole() != null ? aUserExperience.getCurrentExperienceRole().getRole().getId() : null; + Long newRoleId = calculatedNewRole != null && calculatedNewRole.getRole() != null ? calculatedNewRole.getRole().getId() : null; + result.setOldRoleId(oldRoleId); + result.setNewRoleId(newRoleId); + if(message != null + && aUserExperience.getLevelUpNotification() + && featureModeService.featureModeActive(ExperienceFeatureDefinition.EXPERIENCE, serverId, ExperienceFeatureMode.LEVEL_UP_NOTIFICATION)) { + LevelUpNotificationModel model = LevelUpNotificationModel + .builder() + .memberDisplay(MemberDisplay.fromMember(member)) + .oldExperience(oldExperience) + .newExperience(newExperienceCount) + .newLevel(newLevel.getLevel()) + .oldLevel(oldLevel) + .newRole(oldRoleId != null ? RoleDisplay.fromRole(oldRoleId) : null) + .newRole(newRoleId != null ? RoleDisplay.fromRole(newRoleId) : null) + .build(); + MessageToSend messageToSend = templateService.renderEmbedTemplate("experience_level_up_notification", model, serverId); + FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, message.getChannel())).thenAccept(unused -> { + log.info("Sent level up notification to user {} in server {} in channel {}.", member.getIdLong(), serverId, message.getChannel().getIdLong()); + }).exceptionally(throwable -> { + log.warn("Failed to send level up notification to user {} in server {} in channel {}.", member.getIdLong(), serverId, message.getChannel().getIdLong()); + return null; + }); + } + aUserExperience.setCurrentExperienceRole(calculatedNewRole); + } + aUserExperience.setMessageCount(aUserExperience.getMessageCount() + 1L); + if(userChangesLevel && featureModeService.featureModeActive(ExperienceFeatureDefinition.EXPERIENCE, server, ExperienceFeatureMode.LEVEL_ACTION)) { + levelActionService.applyLevelActionsToUser(aUserExperience, oldLevel) + .thenAccept(unused -> { + log.info("Executed level actions for user {}.", userInServerId); + }) + .exceptionally(throwable -> { + log.warn("Failed to execute level actions for user {}.", userInServerId, throwable); + return null; + }); + } + if(aUserExperienceOptional.isEmpty()) { + userExperienceManagementService.saveUser(aUserExperience); + } + if(!Objects.equals(result.getOldRoleId(), result.getNewRoleId())) { + if(result.getOldRoleId() != null && result.getNewRoleId() != null) { + roleService.updateRolesIds(member, List.of(result.getOldRoleId()), List.of(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 and add role {} to member {} in server {}.", result.getOldRoleId(), result.getNewRoleId(), 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; + }); + } + } } } @@ -521,7 +521,7 @@ public class AUserExperienceServiceBean implements AUserExperienceService { public LeaderBoardEntry getRankOfUserInServer(AUserInAServer userInAServer) { log.debug("Retrieving rank for {}", userInAServer.getUserReference().getId()); Optional aUserExperienceOptional = userExperienceManagementService.findByUserInServerIdOptional(userInAServer.getUserInServerId()); - if(!aUserExperienceOptional.isPresent()) { + if(aUserExperienceOptional.isEmpty()) { throw new NoExperienceTrackedException(); } Integer rank = 0; diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceLevelServiceBean.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceLevelServiceBean.java index 7e659f27f..d44e6965d 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceLevelServiceBean.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceLevelServiceBean.java @@ -52,7 +52,7 @@ public class ExperienceLevelServiceBean implements ExperienceLevelService { if(level < 0) { throw new IllegalArgumentException("Level should not be less to 0."); } - return 5L * (level * level) + 50 * level + 100; + return 5L * ((long) level * level) + 50L * level + 100; } @Override diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceRoleServiceBean.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceRoleServiceBean.java index 5e9c60af7..25eaa9243 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceRoleServiceBean.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceRoleServiceBean.java @@ -88,7 +88,7 @@ public class ExperienceRoleServiceBean implements ExperienceRoleService { @Override public CompletableFuture unsetRoles(List rolesToUnset, GuildMessageChannel messageChannel) { List rolesInServer = experienceRoleManagementService.getRolesInServer(rolesToUnset); - Integer totalCount = 0; + int totalCount = 0; for (AExperienceRole aExperienceRole : rolesInServer) { totalCount += aExperienceRole.getUsers().size(); } diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/RunTimeExperienceService.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/RunTimeExperienceService.java index e37a41401..19e181fbc 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/RunTimeExperienceService.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/RunTimeExperienceService.java @@ -1,5 +1,6 @@ package dev.sheldan.abstracto.experience.service; +import lombok.Getter; import org.springframework.stereotype.Component; import java.time.Instant; @@ -17,11 +18,9 @@ import java.util.concurrent.locks.ReentrantLock; @Component public class RunTimeExperienceService { - private Map> runtimeExperience = new HashMap<>(); + @Getter + private final Map> runtimeExperience = new HashMap<>(); private static final Lock lock = new ReentrantLock(); - public Map> getRuntimeExperience() { - return runtimeExperience; - } /** * Acquires the lock of the runtime experience data structure. Operations on it should only be done, while holding the lock