diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/command/Rank.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/command/Rank.java index 52b9ab54e..d9f90d4f4 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/command/Rank.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/command/Rank.java @@ -104,7 +104,17 @@ public class Rank extends AbstractConditionableCommand { AUserInAServer aUserInAServer = userInServerManagementService.loadOrCreateUser(toRender); AUserExperience experienceObj = userExperienceManagementService.findUserInServer(aUserInAServer); log.info("Rendering rank for user {} in server {}.", toRender.getId(), toRender.getGuild().getId()); - rankModel.setExperienceToNextLevel(experienceLevelService.calculateExperienceToNextLevel(experienceObj.getCurrentLevel().getLevel(), experienceObj.getExperience())); + Long currentExpNeeded = experienceObj.getCurrentLevel().getExperienceNeeded(); + Long experienceNeededToNextLevel = experienceLevelService.calculateExperienceToNextLevel(experienceObj.getCurrentLevel().getLevel(), experienceObj.getExperience()); + Long nextLevelExperience = experienceLevelService.calculateNextLevel(experienceObj.getCurrentLevel().getLevel()).getExperienceNeeded(); + Long levelExperience = nextLevelExperience - currentExpNeeded; + Long inLevelExperience = experienceObj.getExperience() - currentExpNeeded; + rankModel.setExperienceForCurrentLevel(currentExpNeeded); + rankModel.setCurrentLevelPercentage((float) inLevelExperience / levelExperience); + rankModel.setLevelExperience(levelExperience); + rankModel.setExperienceToNextLevel(experienceNeededToNextLevel); + rankModel.setInLevelExperience(inLevelExperience); + rankModel.setNextLevelExperience(nextLevelExperience); return templateService.renderEmbedTemplate(RANK_POST_EMBED_TEMPLATE, rankModel, toRender.getGuild().getIdLong()); } 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 1cc4445bb..7e659f27f 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 @@ -57,9 +57,14 @@ public class ExperienceLevelServiceBean implements ExperienceLevelService { @Override public Long calculateExperienceToNextLevel(Integer level, Long currentExperience) { - AExperienceLevel nextLevel = experienceLevelManagementService.getLevelOptional(level + 1) - .orElseThrow(() -> new AbstractoRunTimeException(String.format("Could not find level %s", level))); + AExperienceLevel nextLevel = calculateNextLevel(level); return nextLevel.getExperienceNeeded() - currentExperience; } + @Override + public AExperienceLevel calculateNextLevel(Integer level) { + return experienceLevelManagementService.getLevelOptional(level + 1) + .orElseThrow(() -> new AbstractoRunTimeException(String.format("Could not find level %s", level))); + } + } diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/model/template/RankModel.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/model/template/RankModel.java index 06818d794..6a22a6e22 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/model/template/RankModel.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/model/template/RankModel.java @@ -23,6 +23,26 @@ public class RankModel { * The necessary experience to the next level up. */ private Long experienceToNextLevel; + /** + * Total experience needed for this level + */ + private Long experienceForCurrentLevel; + /** + * Percentage of progress within this level + */ + private Float currentLevelPercentage; + /** + * The total amount of experience needed for this level + */ + private Long levelExperience; + /** + * The experience which has been reached _within_ this level + */ + private Long inLevelExperience; + /** + * The experience needed to reach the next level + */ + private Long nextLevelExperience; /** * The member to show the rank for */ diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceLevelService.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceLevelService.java index 525c21fa5..a0b485e96 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceLevelService.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceLevelService.java @@ -1,5 +1,7 @@ package dev.sheldan.abstracto.experience.service; +import dev.sheldan.abstracto.experience.model.database.AExperienceLevel; + /** * Service responsible for operations on {@link dev.sheldan.abstracto.experience.model.database.AExperienceLevel experienceLevel} * This includes creating and calculations. @@ -20,6 +22,7 @@ public interface ExperienceLevelService { * @return The amount of experience required necessary to reach the next level */ Long calculateExperienceToNextLevel(Integer level, Long currentExperience); + AExperienceLevel calculateNextLevel(Integer level); /** * Calculates the required experience to reach this level. This calculated experience is relative, in the sense that