From 9f33cb7de692d88685c1e93343713bb29b5a4a08 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Wed, 25 Oct 2023 21:29:06 +0200 Subject: [PATCH] GH-132 Move level-related calculations to LevelUtil. (#132) * Move level-related calculations to LevelUtil. * Move to level package. * Fix checkstyle. --- .../discordapp/leveling/LevelController.java | 22 +---------- .../discordapp/leveling/LevelUtil.java | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/eternalcode/discordapp/leveling/LevelUtil.java diff --git a/src/main/java/com/eternalcode/discordapp/leveling/LevelController.java b/src/main/java/com/eternalcode/discordapp/leveling/LevelController.java index b6edeb01..a76d8cce 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/LevelController.java +++ b/src/main/java/com/eternalcode/discordapp/leveling/LevelController.java @@ -23,24 +23,6 @@ public LevelController(LevelConfig levelConfig, LevelService levelService, JDA j this.jda = jda; } - /** - * This method is called when an ExperienceChangeEvent occurs. It updates the user's level based on their experience points - * and sends a message to a designated TextChannel when the user levels up. - *

- * It calculates the next level using the formula: N = P * L^2 + P * L + P - * where: - *

- N represents the points needed to reach the next level, - *

- P is the points needed for one level (provided by LevelConfig), - *

- L is the current level. - *

- * Example level calculations: - *

Level 1: N = 100 * 1^2 + 100 * 1 + 100 = 300 - *

Level 2: N = 100 * 2^2 + 100 * 2 + 100 = 700 - *

Level 3: N = 100 * 3^2 + 100 * 3 + 100 = 1200 - *

Level 4: N = 100 * 4^2 + 100 * 4 + 100 = 1700 - *

Level 5: N = 100 * 5^2 + 100 * 5 + 100 = 2300 - */ - @Override public void update(ExperienceChangeEvent event) { Experience experience = event.experience(); @@ -53,9 +35,7 @@ public void update(ExperienceChangeEvent event) { this.levelService.find(userId).thenApply(userLevel -> { int currentLevel = userLevel.getCurrentLevel(); - int pointsNeededForNextLevel = (int) (pointsNeededForOneLevel * Math.pow(currentLevel + 1, 2) - + pointsNeededForOneLevel * (currentLevel + 1) - + pointsNeededForOneLevel); + int pointsNeededForNextLevel = LevelUtil.calculatePointsForNextLevel(currentLevel, pointsNeededForOneLevel); if (experiencePoints <= pointsNeededForNextLevel) { return null; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/LevelUtil.java b/src/main/java/com/eternalcode/discordapp/leveling/LevelUtil.java new file mode 100644 index 00000000..7bad229a --- /dev/null +++ b/src/main/java/com/eternalcode/discordapp/leveling/LevelUtil.java @@ -0,0 +1,37 @@ +package com.eternalcode.discordapp.leveling; + +public final class LevelUtil { + + public LevelUtil() { + throw new UnsupportedOperationException("This class cannot be instantiated"); + } + + /** + * Calculates the points needed to achieve the next level. + *

+ * This method is called when an ExperienceChangeEvent occurs. It updates the user's level based on their experience points + * and sends a message to a designated TextChannel when the user levels up. + *

+ * It calculates the next level using the formula: N = P * L^2 + P * L + P + * where: + *

- N represents the points needed to reach the next level, + *

- P is the points needed for one level (provided by LevelConfig), + *

- L is the current level. + *

+ * Example level calculations: + *

Level 1: N = 100 * 1^2 + 100 * 1 + 100 = 300 + *

Level 2: N = 100 * 2^2 + 100 * 2 + 100 = 700 + *

Level 3: N = 100 * 3^2 + 100 * 3 + 100 = 1200 + *

Level 4: N = 100 * 4^2 + 100 * 4 + 100 = 1700 + *

Level 5: N = 100 * 5^2 + 100 * 5 + 100 = 2300 + * + * @param currentLevel Current level. + * @param pointsNeededForOneLevel Points needed for one level. + * @return The calculated points needed for the next level. + */ + public static int calculatePointsForNextLevel(int currentLevel, double pointsNeededForOneLevel) { + return (int) (pointsNeededForOneLevel * Math.pow(currentLevel + 1, 2) + + pointsNeededForOneLevel * (currentLevel + 1) + + pointsNeededForOneLevel); + } +}