From dd81b2432b9cf691bbee2c3c8d8b0d4b95888bb5 Mon Sep 17 00:00:00 2001 From: okx-code Date: Fri, 26 Jun 2020 23:19:36 +0100 Subject: [PATCH] 3.9-beta.2 --- .../java/sh/okx/rankup/economy/Economy.java | 4 + .../okx/rankup/economy/EconomyProvider.java | 4 + .../sh/okx/rankup/economy/VaultEconomy.java | 4 + .../rankup/economy/VaultEconomyProvider.java | 4 + .../sh/okx/rankup/hook/PermissionManager.java | 41 +-- .../rankup/hook/VaultPermissionManager.java | 34 +++ .../sh/okx/rankup/placeholders/Expansion.java | 4 + .../rankup/placeholders/RankupExpansion.java | 248 +----------------- .../RankupPlaceholderExpansion.java | 244 +++++++++++++++++ .../requirement/AdvancementRequirement.java | 4 + .../XpLevelDeductibleRequirement.java | 0 .../sh/okx/rankup/RankupPlaceholderTest.java | 4 + src/test/java/sh/okx/rankup/RankupTest.java | 4 + .../sh/okx/rankup/economy/TestEconomy.java | 4 + .../rankup/economy/TestEconomyProvider.java | 4 + .../sh/okx/rankup/hook/TestGroupProvider.java | 4 + .../rankup/hook/TestPermissionManager.java | 4 + 17 files changed, 337 insertions(+), 278 deletions(-) create mode 100644 src/main/java/sh/okx/rankup/economy/Economy.java create mode 100644 src/main/java/sh/okx/rankup/economy/EconomyProvider.java create mode 100644 src/main/java/sh/okx/rankup/economy/VaultEconomy.java create mode 100644 src/main/java/sh/okx/rankup/economy/VaultEconomyProvider.java create mode 100644 src/main/java/sh/okx/rankup/hook/VaultPermissionManager.java create mode 100644 src/main/java/sh/okx/rankup/placeholders/Expansion.java create mode 100644 src/main/java/sh/okx/rankup/placeholders/RankupPlaceholderExpansion.java create mode 100644 src/main/java/sh/okx/rankup/requirements/requirement/AdvancementRequirement.java rename src/main/java/sh/okx/rankup/requirements/{ => requirement}/XpLevelDeductibleRequirement.java (100%) create mode 100644 src/test/java/sh/okx/rankup/RankupPlaceholderTest.java create mode 100644 src/test/java/sh/okx/rankup/RankupTest.java create mode 100644 src/test/java/sh/okx/rankup/economy/TestEconomy.java create mode 100644 src/test/java/sh/okx/rankup/economy/TestEconomyProvider.java create mode 100644 src/test/java/sh/okx/rankup/hook/TestGroupProvider.java create mode 100644 src/test/java/sh/okx/rankup/hook/TestPermissionManager.java diff --git a/src/main/java/sh/okx/rankup/economy/Economy.java b/src/main/java/sh/okx/rankup/economy/Economy.java new file mode 100644 index 0000000..baf9481 --- /dev/null +++ b/src/main/java/sh/okx/rankup/economy/Economy.java @@ -0,0 +1,4 @@ +package sh.okx.rankup.economy; + +public interface Economy { +} diff --git a/src/main/java/sh/okx/rankup/economy/EconomyProvider.java b/src/main/java/sh/okx/rankup/economy/EconomyProvider.java new file mode 100644 index 0000000..beca05c --- /dev/null +++ b/src/main/java/sh/okx/rankup/economy/EconomyProvider.java @@ -0,0 +1,4 @@ +package sh.okx.rankup.economy; + +public interface EconomyProvider { +} diff --git a/src/main/java/sh/okx/rankup/economy/VaultEconomy.java b/src/main/java/sh/okx/rankup/economy/VaultEconomy.java new file mode 100644 index 0000000..5f0ebab --- /dev/null +++ b/src/main/java/sh/okx/rankup/economy/VaultEconomy.java @@ -0,0 +1,4 @@ +package sh.okx.rankup.economy; + +public class VaultEconomy { +} diff --git a/src/main/java/sh/okx/rankup/economy/VaultEconomyProvider.java b/src/main/java/sh/okx/rankup/economy/VaultEconomyProvider.java new file mode 100644 index 0000000..1efdfaa --- /dev/null +++ b/src/main/java/sh/okx/rankup/economy/VaultEconomyProvider.java @@ -0,0 +1,4 @@ +package sh.okx.rankup.economy; + +public class VaultEconomyProvider { +} diff --git a/src/main/java/sh/okx/rankup/hook/PermissionManager.java b/src/main/java/sh/okx/rankup/hook/PermissionManager.java index 0c4a007..f094e3c 100644 --- a/src/main/java/sh/okx/rankup/hook/PermissionManager.java +++ b/src/main/java/sh/okx/rankup/hook/PermissionManager.java @@ -1,34 +1,7 @@ -package sh.okx.rankup.hook; - -import net.milkbowl.vault.permission.Permission; -import org.bukkit.plugin.RegisteredServiceProvider; -import sh.okx.rankup.RankupPlugin; - -public class PermissionManager { - private final RankupPlugin plugin; - - public PermissionManager(RankupPlugin plugin) { - this.plugin = plugin; - } - - public GroupProvider findPermissionProvider() { - return getVaultPermissionProvider(); - } - - private GroupProvider getVaultPermissionProvider() { - RegisteredServiceProvider rsp = plugin.getServer().getServicesManager() - .getRegistration(Permission.class); - if (rsp == null) { - return null; - } - Permission provider = rsp.getProvider(); - if (!provider.hasGroupSupport()) { - return null; - } - return new VaultGroupProvider(provider); - } - - public GroupProvider permissionOnlyProvider() { - return new PermissionGroupProvider(); - } -} +package sh.okx.rankup.hook; + +public interface PermisionManager { + GroupProvider findPermissionProvider(); + + GroupProvider permissionOnlyProvider(); +} diff --git a/src/main/java/sh/okx/rankup/hook/VaultPermissionManager.java b/src/main/java/sh/okx/rankup/hook/VaultPermissionManager.java new file mode 100644 index 0000000..0c4a007 --- /dev/null +++ b/src/main/java/sh/okx/rankup/hook/VaultPermissionManager.java @@ -0,0 +1,34 @@ +package sh.okx.rankup.hook; + +import net.milkbowl.vault.permission.Permission; +import org.bukkit.plugin.RegisteredServiceProvider; +import sh.okx.rankup.RankupPlugin; + +public class PermissionManager { + private final RankupPlugin plugin; + + public PermissionManager(RankupPlugin plugin) { + this.plugin = plugin; + } + + public GroupProvider findPermissionProvider() { + return getVaultPermissionProvider(); + } + + private GroupProvider getVaultPermissionProvider() { + RegisteredServiceProvider rsp = plugin.getServer().getServicesManager() + .getRegistration(Permission.class); + if (rsp == null) { + return null; + } + Permission provider = rsp.getProvider(); + if (!provider.hasGroupSupport()) { + return null; + } + return new VaultGroupProvider(provider); + } + + public GroupProvider permissionOnlyProvider() { + return new PermissionGroupProvider(); + } +} diff --git a/src/main/java/sh/okx/rankup/placeholders/Expansion.java b/src/main/java/sh/okx/rankup/placeholders/Expansion.java new file mode 100644 index 0000000..2d19f46 --- /dev/null +++ b/src/main/java/sh/okx/rankup/placeholders/Expansion.java @@ -0,0 +1,4 @@ +package sh.okx.rankup.placeholders; + +public class Expansion { +} diff --git a/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java b/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java index f04401e..14da5d1 100644 --- a/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java +++ b/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java @@ -1,244 +1,4 @@ -package sh.okx.rankup.placeholders; - -import lombok.RequiredArgsConstructor; -import me.clip.placeholderapi.expansion.PlaceholderExpansion; -import org.bukkit.entity.Player; -import sh.okx.rankup.RankupPlugin; -import sh.okx.rankup.prestige.Prestige; -import sh.okx.rankup.prestige.Prestiges; -import sh.okx.rankup.ranks.Rank; -import sh.okx.rankup.ranks.RankElement; -import sh.okx.rankup.ranks.Rankups; -import sh.okx.rankup.requirements.Requirement; - -import java.util.Objects; -import java.util.function.Function; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -@RequiredArgsConstructor -public class RankupExpansion extends PlaceholderExpansion { - private static final Pattern PATTERN = Pattern.compile("(.*)#(.*)"); - - private final RankupPlugin plugin; - private final Placeholders placeholders; - - @Override - public String onPlaceholderRequest(Player player, String params) { - if (player == null) { - return ""; - } - params = params.toLowerCase(); - - Rankups rankups = plugin.getRankups(); - RankElement rankElement = rankups.getByPlayer(player); - Rank rank = rankElement == null ? null : rankElement.getRank(); - - Prestiges prestiges = plugin.getPrestiges(); - RankElement prestigeElement = null; - Prestige prestige = null; - if (prestiges != null) { - prestigeElement = prestiges.getByPlayer(player); - prestige = prestigeElement == null ? null : prestigeElement.getRank(); - } - - if (params.startsWith("requirement_")) { - String[] parts = params.split("_", 3); - return getPlaceholderRequirement(player, rank, - replacePattern(parts[1]), parts.length > 2 ? parts[2] : ""); - } else if (params.startsWith("rank_requirement_")) { - String[] parts = params.split("_", 5); - return getPlaceholderRequirement(player, rankups.getByName(parts[2]), - replacePattern(parts[3]), parts.length > 4 ? parts[4] : ""); -// return placeholders.getSimpleFormat().format(orElse(rankups.getByName(parts[2]).getRequirement(parts[3]), Requirement::getValueDouble, 0)); - } else if (params.startsWith("rank_money_")) { - String[] parts = params.split("_", 4); - double amount = Objects.requireNonNull(rankups.getByName(parts[2]), "Rankup " + parts[2] + " does not exist").getRequirement(player, "money").getValueDouble(); - if (parts.length > 3 && parts[3].equalsIgnoreCase("left")) { - amount = amount - plugin.getEconomy().getBalance(player); - } - return plugin.formatMoney(Math.max(0, amount)); - } else if (params.startsWith("status_")) { - String[] parts = params.split("_", 2); - Rank statusRank = rankups.getByName(parts[1]); - - if (statusRank == null) { - return null; - } - if (rank == null) { - return getPlaceholder("status.incomplete"); - } - if (statusRank.equals(rank)) { - return getPlaceholder("status.current"); - } - - // is playerRank before or after statusRank? - for (RankElement element : rankups.getTree().asList()) { - if (element.getRank().equals(statusRank)) { - return getPlaceholder("status.complete"); - } else if (element.getRank().equals(rank)) { - return getPlaceholder("status.incomplete"); - } - } - - // this should not happen - return null; - } - - switch (params) { - case "current_prestige": - requirePrestiging(prestiges, params); - if (prestige == null || prestige.getRank() == null) { - return getPlaceholder("no-prestige"); - } else { - return prestige.getRank(); - } - case "next_prestige": - requirePrestiging(prestiges, params); - if (prestigeElement != null && !prestigeElement.hasNext()) { - return getPlaceholder("highest-rank"); - } - return orElse(prestige, Prestige::getNext, prestiges.getFirst().getNext()); - case "prestige_money": - requirePrestiging(prestiges, params); - return String.valueOf(simplify(orElse(prestige, r -> r.isIn(player) ? r.getRequirement(player, "money").getValueDouble() : 0, 0))); - case "prestige_money_formatted": - requirePrestiging(prestiges, params); - return plugin.formatMoney(orElse(prestige, r -> r.isIn(player) ? r.getRequirement(player, "money").getValueDouble() : 0, 0D)); - case "current_rank": - if (rank == null) { - return getPlaceholder("not-in-ladder"); - } else { - return rank.getRank(); - } - case "next_rank": - if (rankElement != null && !rankElement.hasNext()) { - return getPlaceholder("highest-rank"); - } - return orElsePlaceholder(rank, r -> orElsePlaceholder(rank, Rank::getNext, "highest-rank"), "not-in-ladder"); - case "money": - return String.valueOf(getMoney(player, rank)); - case "money_formatted": - return plugin.formatMoney(getMoney(player, rank).doubleValue()); - case "money_left": - return String.valueOf(Math.max(0, orElse(rank, r -> simplify(plugin.getEconomy().getBalance(player) - r.getRequirement(player, "money").getValueDouble()), 0).doubleValue())); - case "money_left_formatted": - return plugin.formatMoney(Math.max(0D, orElse(rank, r -> plugin.getEconomy().getBalance(player) - r.getRequirement(player, "money").getValueDouble(), 0D))); - case "percent_left": - return String.valueOf(Math.max(0D, orElse(rank, r -> (1 - (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble())) * 100, 0).doubleValue())); - case "percent_left_formatted": - return placeholders.getPercentFormat().format(Math.max(0D, orElse(rank, r -> (1 - (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble())) * 100, 0).doubleValue())); - case "percent_done": - return String.valueOf(Math.min(100D, orElse(rank, r -> (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble()) * 100, 0).doubleValue())); - case "percent_done_formatted": - return placeholders.getPercentFormat().format(Math.min(100D, orElse(rank, r -> (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble()) * 100, 0).doubleValue())); - case "prestige_percent_left_formatted": - return placeholders.getPercentFormat().format(Math.max(0D, orElse(prestige, r -> (1 - (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble())) * 100, 0).doubleValue())); - case "prestige_percent_done_formatted": - return placeholders.getPercentFormat().format(Math.min(100D, orElse(prestige, r -> (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble()) * 100, 0).doubleValue())); - default: - return null; - } - } - - private Number getMoney(Player player, Rank rank) { - return orElse(rank, r -> simplify(r.getRequirement(player, "money").getValueDouble()), 0); - } - - private void requirePrestiging(Prestiges prestiges, String params) { - Objects.requireNonNull(prestiges, "Using %rankup_" + params + "% prestige placeholder but prestiging is disabled."); - } - - private String getPlaceholderRequirement(Player player, Rank rank, String requirementName, String params) { - if (rank == null) { - return ""; - } - Requirement requirement = rank.getRequirement(player, requirementName); - switch (params) { - case "": - return orElse(requirement, Requirement::getValueString, "0"); - case "left": - return placeholders.getSimpleFormat().format(orElse(requirement, r -> r.getRemaining(player), 0)); - case "done": - return placeholders.getSimpleFormat().format(orElse(requirement, r -> r.getValueDouble() - r.getRemaining(player), 0)); - case "percent_left": - return placeholders.getPercentFormat().format(orElse(requirement, r -> (r.getRemaining(player) / r.getValueDouble()) * 100, 0)); - case "percent_done": - return placeholders.getPercentFormat().format(orElse(requirement, r -> (1 - (r.getRemaining(player) / r.getValueDouble())) * 100, 100)); - default: - return null; - } - } - - private Number simplify(Number number) { - if (number instanceof Float) { - return (float) number % 1 == 0 ? number.intValue() : number; - } else if (number instanceof Double) { - return (double) number % 1 == 0 ? number.longValue() : number; - } else { - return number; - } - } - - private String orElsePlaceholder(T t, Function value, Object fallback) { - if (t == null) { - return getPlaceholder(String.valueOf(fallback)); - } - - try { - return String.valueOf(value.apply(t)); - } catch (NullPointerException ex) { - return getPlaceholder(String.valueOf(fallback)); - } - } - - private R orElse(T t, Function value, R fallback) { - if (t == null) { - return fallback; - } - - try { - return value.apply(t); - } catch (NullPointerException ex) { - return fallback; - } - } - - private String replacePattern(String string) { - Matcher matcher = PATTERN.matcher(string); - if (matcher.matches()) { - return matcher.group(1) + "#" + matcher.group(2).replace("-", "_"); - } else { - return string; - } - } - - private String getPlaceholder(String name) { - return plugin.getConfig().getString("placeholders." + name); - } - - @Override - public String getIdentifier() { - return "rankup"; - } - - @Override - public String getAuthor() { - return String.join(", ", plugin.getDescription().getAuthors()); - } - - @Override - public String getVersion() { - return plugin.getDescription().getVersion(); - } - - @Override - public boolean persist() { - return true; - } - - @Override - public boolean canRegister() { - return true; - } -} +package sh.okx.rankup.placeholders; + +public class RankupExpansion { +} diff --git a/src/main/java/sh/okx/rankup/placeholders/RankupPlaceholderExpansion.java b/src/main/java/sh/okx/rankup/placeholders/RankupPlaceholderExpansion.java new file mode 100644 index 0000000..f04401e --- /dev/null +++ b/src/main/java/sh/okx/rankup/placeholders/RankupPlaceholderExpansion.java @@ -0,0 +1,244 @@ +package sh.okx.rankup.placeholders; + +import lombok.RequiredArgsConstructor; +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import org.bukkit.entity.Player; +import sh.okx.rankup.RankupPlugin; +import sh.okx.rankup.prestige.Prestige; +import sh.okx.rankup.prestige.Prestiges; +import sh.okx.rankup.ranks.Rank; +import sh.okx.rankup.ranks.RankElement; +import sh.okx.rankup.ranks.Rankups; +import sh.okx.rankup.requirements.Requirement; + +import java.util.Objects; +import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@RequiredArgsConstructor +public class RankupExpansion extends PlaceholderExpansion { + private static final Pattern PATTERN = Pattern.compile("(.*)#(.*)"); + + private final RankupPlugin plugin; + private final Placeholders placeholders; + + @Override + public String onPlaceholderRequest(Player player, String params) { + if (player == null) { + return ""; + } + params = params.toLowerCase(); + + Rankups rankups = plugin.getRankups(); + RankElement rankElement = rankups.getByPlayer(player); + Rank rank = rankElement == null ? null : rankElement.getRank(); + + Prestiges prestiges = plugin.getPrestiges(); + RankElement prestigeElement = null; + Prestige prestige = null; + if (prestiges != null) { + prestigeElement = prestiges.getByPlayer(player); + prestige = prestigeElement == null ? null : prestigeElement.getRank(); + } + + if (params.startsWith("requirement_")) { + String[] parts = params.split("_", 3); + return getPlaceholderRequirement(player, rank, + replacePattern(parts[1]), parts.length > 2 ? parts[2] : ""); + } else if (params.startsWith("rank_requirement_")) { + String[] parts = params.split("_", 5); + return getPlaceholderRequirement(player, rankups.getByName(parts[2]), + replacePattern(parts[3]), parts.length > 4 ? parts[4] : ""); +// return placeholders.getSimpleFormat().format(orElse(rankups.getByName(parts[2]).getRequirement(parts[3]), Requirement::getValueDouble, 0)); + } else if (params.startsWith("rank_money_")) { + String[] parts = params.split("_", 4); + double amount = Objects.requireNonNull(rankups.getByName(parts[2]), "Rankup " + parts[2] + " does not exist").getRequirement(player, "money").getValueDouble(); + if (parts.length > 3 && parts[3].equalsIgnoreCase("left")) { + amount = amount - plugin.getEconomy().getBalance(player); + } + return plugin.formatMoney(Math.max(0, amount)); + } else if (params.startsWith("status_")) { + String[] parts = params.split("_", 2); + Rank statusRank = rankups.getByName(parts[1]); + + if (statusRank == null) { + return null; + } + if (rank == null) { + return getPlaceholder("status.incomplete"); + } + if (statusRank.equals(rank)) { + return getPlaceholder("status.current"); + } + + // is playerRank before or after statusRank? + for (RankElement element : rankups.getTree().asList()) { + if (element.getRank().equals(statusRank)) { + return getPlaceholder("status.complete"); + } else if (element.getRank().equals(rank)) { + return getPlaceholder("status.incomplete"); + } + } + + // this should not happen + return null; + } + + switch (params) { + case "current_prestige": + requirePrestiging(prestiges, params); + if (prestige == null || prestige.getRank() == null) { + return getPlaceholder("no-prestige"); + } else { + return prestige.getRank(); + } + case "next_prestige": + requirePrestiging(prestiges, params); + if (prestigeElement != null && !prestigeElement.hasNext()) { + return getPlaceholder("highest-rank"); + } + return orElse(prestige, Prestige::getNext, prestiges.getFirst().getNext()); + case "prestige_money": + requirePrestiging(prestiges, params); + return String.valueOf(simplify(orElse(prestige, r -> r.isIn(player) ? r.getRequirement(player, "money").getValueDouble() : 0, 0))); + case "prestige_money_formatted": + requirePrestiging(prestiges, params); + return plugin.formatMoney(orElse(prestige, r -> r.isIn(player) ? r.getRequirement(player, "money").getValueDouble() : 0, 0D)); + case "current_rank": + if (rank == null) { + return getPlaceholder("not-in-ladder"); + } else { + return rank.getRank(); + } + case "next_rank": + if (rankElement != null && !rankElement.hasNext()) { + return getPlaceholder("highest-rank"); + } + return orElsePlaceholder(rank, r -> orElsePlaceholder(rank, Rank::getNext, "highest-rank"), "not-in-ladder"); + case "money": + return String.valueOf(getMoney(player, rank)); + case "money_formatted": + return plugin.formatMoney(getMoney(player, rank).doubleValue()); + case "money_left": + return String.valueOf(Math.max(0, orElse(rank, r -> simplify(plugin.getEconomy().getBalance(player) - r.getRequirement(player, "money").getValueDouble()), 0).doubleValue())); + case "money_left_formatted": + return plugin.formatMoney(Math.max(0D, orElse(rank, r -> plugin.getEconomy().getBalance(player) - r.getRequirement(player, "money").getValueDouble(), 0D))); + case "percent_left": + return String.valueOf(Math.max(0D, orElse(rank, r -> (1 - (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble())) * 100, 0).doubleValue())); + case "percent_left_formatted": + return placeholders.getPercentFormat().format(Math.max(0D, orElse(rank, r -> (1 - (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble())) * 100, 0).doubleValue())); + case "percent_done": + return String.valueOf(Math.min(100D, orElse(rank, r -> (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble()) * 100, 0).doubleValue())); + case "percent_done_formatted": + return placeholders.getPercentFormat().format(Math.min(100D, orElse(rank, r -> (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble()) * 100, 0).doubleValue())); + case "prestige_percent_left_formatted": + return placeholders.getPercentFormat().format(Math.max(0D, orElse(prestige, r -> (1 - (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble())) * 100, 0).doubleValue())); + case "prestige_percent_done_formatted": + return placeholders.getPercentFormat().format(Math.min(100D, orElse(prestige, r -> (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble()) * 100, 0).doubleValue())); + default: + return null; + } + } + + private Number getMoney(Player player, Rank rank) { + return orElse(rank, r -> simplify(r.getRequirement(player, "money").getValueDouble()), 0); + } + + private void requirePrestiging(Prestiges prestiges, String params) { + Objects.requireNonNull(prestiges, "Using %rankup_" + params + "% prestige placeholder but prestiging is disabled."); + } + + private String getPlaceholderRequirement(Player player, Rank rank, String requirementName, String params) { + if (rank == null) { + return ""; + } + Requirement requirement = rank.getRequirement(player, requirementName); + switch (params) { + case "": + return orElse(requirement, Requirement::getValueString, "0"); + case "left": + return placeholders.getSimpleFormat().format(orElse(requirement, r -> r.getRemaining(player), 0)); + case "done": + return placeholders.getSimpleFormat().format(orElse(requirement, r -> r.getValueDouble() - r.getRemaining(player), 0)); + case "percent_left": + return placeholders.getPercentFormat().format(orElse(requirement, r -> (r.getRemaining(player) / r.getValueDouble()) * 100, 0)); + case "percent_done": + return placeholders.getPercentFormat().format(orElse(requirement, r -> (1 - (r.getRemaining(player) / r.getValueDouble())) * 100, 100)); + default: + return null; + } + } + + private Number simplify(Number number) { + if (number instanceof Float) { + return (float) number % 1 == 0 ? number.intValue() : number; + } else if (number instanceof Double) { + return (double) number % 1 == 0 ? number.longValue() : number; + } else { + return number; + } + } + + private String orElsePlaceholder(T t, Function value, Object fallback) { + if (t == null) { + return getPlaceholder(String.valueOf(fallback)); + } + + try { + return String.valueOf(value.apply(t)); + } catch (NullPointerException ex) { + return getPlaceholder(String.valueOf(fallback)); + } + } + + private R orElse(T t, Function value, R fallback) { + if (t == null) { + return fallback; + } + + try { + return value.apply(t); + } catch (NullPointerException ex) { + return fallback; + } + } + + private String replacePattern(String string) { + Matcher matcher = PATTERN.matcher(string); + if (matcher.matches()) { + return matcher.group(1) + "#" + matcher.group(2).replace("-", "_"); + } else { + return string; + } + } + + private String getPlaceholder(String name) { + return plugin.getConfig().getString("placeholders." + name); + } + + @Override + public String getIdentifier() { + return "rankup"; + } + + @Override + public String getAuthor() { + return String.join(", ", plugin.getDescription().getAuthors()); + } + + @Override + public String getVersion() { + return plugin.getDescription().getVersion(); + } + + @Override + public boolean persist() { + return true; + } + + @Override + public boolean canRegister() { + return true; + } +} diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/AdvancementRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/AdvancementRequirement.java new file mode 100644 index 0000000..c025f21 --- /dev/null +++ b/src/main/java/sh/okx/rankup/requirements/requirement/AdvancementRequirement.java @@ -0,0 +1,4 @@ +package sh.okx.rankup.requirements.requirement; + +public class AdvancementRequirement { +} diff --git a/src/main/java/sh/okx/rankup/requirements/XpLevelDeductibleRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/XpLevelDeductibleRequirement.java similarity index 100% rename from src/main/java/sh/okx/rankup/requirements/XpLevelDeductibleRequirement.java rename to src/main/java/sh/okx/rankup/requirements/requirement/XpLevelDeductibleRequirement.java diff --git a/src/test/java/sh/okx/rankup/RankupPlaceholderTest.java b/src/test/java/sh/okx/rankup/RankupPlaceholderTest.java new file mode 100644 index 0000000..027b73b --- /dev/null +++ b/src/test/java/sh/okx/rankup/RankupPlaceholderTest.java @@ -0,0 +1,4 @@ +package sh.okx.rankup; + +public class RankupPlaceholderTest { +} diff --git a/src/test/java/sh/okx/rankup/RankupTest.java b/src/test/java/sh/okx/rankup/RankupTest.java new file mode 100644 index 0000000..37639e5 --- /dev/null +++ b/src/test/java/sh/okx/rankup/RankupTest.java @@ -0,0 +1,4 @@ +package sh.okx.rankup; + +public class RankupTest { +} diff --git a/src/test/java/sh/okx/rankup/economy/TestEconomy.java b/src/test/java/sh/okx/rankup/economy/TestEconomy.java new file mode 100644 index 0000000..40cd1ef --- /dev/null +++ b/src/test/java/sh/okx/rankup/economy/TestEconomy.java @@ -0,0 +1,4 @@ +package sh.okx.rankup.economy; + +public class TestEconomy { +} diff --git a/src/test/java/sh/okx/rankup/economy/TestEconomyProvider.java b/src/test/java/sh/okx/rankup/economy/TestEconomyProvider.java new file mode 100644 index 0000000..5f91a78 --- /dev/null +++ b/src/test/java/sh/okx/rankup/economy/TestEconomyProvider.java @@ -0,0 +1,4 @@ +package sh.okx.rankup.economy; + +public class TestEconomyProvider { +} diff --git a/src/test/java/sh/okx/rankup/hook/TestGroupProvider.java b/src/test/java/sh/okx/rankup/hook/TestGroupProvider.java new file mode 100644 index 0000000..afd8f9a --- /dev/null +++ b/src/test/java/sh/okx/rankup/hook/TestGroupProvider.java @@ -0,0 +1,4 @@ +package sh.okx.rankup.hook; + +public class TestGroupProvider { +} diff --git a/src/test/java/sh/okx/rankup/hook/TestPermissionManager.java b/src/test/java/sh/okx/rankup/hook/TestPermissionManager.java new file mode 100644 index 0000000..acf7166 --- /dev/null +++ b/src/test/java/sh/okx/rankup/hook/TestPermissionManager.java @@ -0,0 +1,4 @@ +package sh.okx.rankup.hook; + +public class TestPermissionManager { +}