From 55e190a5c2c26791c649aa17155bfddb0543f63f Mon Sep 17 00:00:00 2001 From: okx-code Date: Fri, 26 Jun 2020 23:19:41 +0100 Subject: [PATCH] 3.9-beta.2 --- build.gradle | 4 +- src/main/java/sh/okx/rankup/RankupHelper.java | 2 +- src/main/java/sh/okx/rankup/RankupPlugin.java | 80 ++++--- .../sh/okx/rankup/commands/InfoCommand.java | 4 +- .../okx/rankup/commands/PrestigeCommand.java | 8 +- .../sh/okx/rankup/commands/RankupCommand.java | 15 +- .../java/sh/okx/rankup/economy/Economy.java | 5 + .../okx/rankup/economy/EconomyProvider.java | 1 + .../sh/okx/rankup/economy/VaultEconomy.java | 25 +- .../rankup/economy/VaultEconomyProvider.java | 15 +- src/main/java/sh/okx/rankup/gui/Gui.java | 5 + .../sh/okx/rankup/hook/PermissionManager.java | 3 +- .../rankup/hook/VaultPermissionManager.java | 6 +- .../sh/okx/rankup/placeholders/Expansion.java | 5 +- .../okx/rankup/placeholders/Placeholders.java | 5 +- .../rankup/placeholders/RankupExpansion.java | 216 +++++++++++++++++- .../RankupPlaceholderExpansion.java | 208 +---------------- .../requirement/AdvancementRequirement.java | 55 ++++- .../MoneyDeductibleRequirement.java | 2 +- .../XpLevelDeductibleRequirement.java | 5 +- .../sh/okx/rankup/RankupPlaceholderTest.java | 53 ++++- src/test/java/sh/okx/rankup/RankupTest.java | 97 ++++++++ .../sh/okx/rankup/economy/TestEconomy.java | 23 +- .../rankup/economy/TestEconomyProvider.java | 6 +- .../sh/okx/rankup/hook/TestGroupProvider.java | 23 +- .../rankup/hook/TestPermissionManager.java | 17 +- .../rankup/messages/MessageBuilderTest.java | 1 - 27 files changed, 617 insertions(+), 272 deletions(-) diff --git a/build.gradle b/build.gradle index 95ef388..c97715e 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'sh.okx' -version '3.9-beta.1' +version '3.9-beta.2' repositories { mavenCentral() @@ -26,6 +26,8 @@ repositories { dependencies { testImplementation group: 'junit', name: 'junit', version: '4.12' + testImplementation 'com.github.seeseemelk:MockBukkit-v1.15:0.3.0-SNAPSHOT' + compileOnly 'org.jetbrains:annotations:16.0.2' implementation 'org.spigotmc:spigot-api:1.16.1-R0.1-SNAPSHOT' implementation('com.github.Realizedd:TokenManager:3.2.4') { diff --git a/src/main/java/sh/okx/rankup/RankupHelper.java b/src/main/java/sh/okx/rankup/RankupHelper.java index 6d8b776..625e3a7 100644 --- a/src/main/java/sh/okx/rankup/RankupHelper.java +++ b/src/main/java/sh/okx/rankup/RankupHelper.java @@ -27,7 +27,7 @@ public class RankupHelper { /** * Players who cannot rankup/prestige for a certain amount of time. */ - private Map cooldowns = new HashMap<>(); + private final Map cooldowns = new HashMap<>(); public RankupHelper(RankupPlugin plugin) { this.plugin = plugin; diff --git a/src/main/java/sh/okx/rankup/RankupPlugin.java b/src/main/java/sh/okx/rankup/RankupPlugin.java index f656e13..dd73866 100644 --- a/src/main/java/sh/okx/rankup/RankupPlugin.java +++ b/src/main/java/sh/okx/rankup/RankupPlugin.java @@ -1,7 +1,6 @@ package sh.okx.rankup; import lombok.Getter; -import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -11,14 +10,19 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.InventoryView; +import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginManager; -import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.java.JavaPluginLoader; import sh.okx.rankup.commands.*; +import sh.okx.rankup.economy.Economy; +import sh.okx.rankup.economy.EconomyProvider; +import sh.okx.rankup.economy.VaultEconomyProvider; import sh.okx.rankup.gui.Gui; import sh.okx.rankup.gui.GuiListener; import sh.okx.rankup.hook.GroupProvider; import sh.okx.rankup.hook.PermissionManager; +import sh.okx.rankup.hook.VaultPermissionManager; import sh.okx.rankup.messages.Message; import sh.okx.rankup.messages.MessageBuilder; import sh.okx.rankup.messages.NullMessageBuilder; @@ -31,7 +35,7 @@ import sh.okx.rankup.ranks.RankList; import sh.okx.rankup.ranks.Rankups; import sh.okx.rankup.requirements.Requirement; import sh.okx.rankup.requirements.RequirementRegistry; -import sh.okx.rankup.requirements.XpLevelDeductibleRequirement; +import sh.okx.rankup.requirements.requirement.XpLevelDeductibleRequirement; import sh.okx.rankup.requirements.requirement.*; import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchievementsAchievementRequirement; import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchievementsTotalRequirement; @@ -78,8 +82,20 @@ public class RankupPlugin extends JavaPlugin { private Placeholders placeholders; @Getter private RankupHelper helper; - private AutoRankup autoRankup; + protected AutoRankup autoRankup = new AutoRankup(this); private String errorMessage; + private PermissionManager permissionManager = new VaultPermissionManager(this); + private EconomyProvider economyProvider = new VaultEconomyProvider(); + + public RankupPlugin() { + super(); + } + + protected RankupPlugin(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file, PermissionManager permissionManager, EconomyProvider economyProvider) { + super(loader, description, dataFolder, file); + this.permissionManager = permissionManager; + this.economyProvider = economyProvider; + } @Override public void onEnable() { @@ -87,23 +103,25 @@ public class RankupPlugin extends JavaPlugin { reload(true); - Metrics metrics = new Metrics(this); - metrics.addCustomChart(new Metrics.SimplePie("confirmation", - () -> config.getString("confirmation-type", "unknown"))); - metrics.addCustomChart(new Metrics.AdvancedPie("requirements", () -> { - Map map = new HashMap<>(); - addAll(map, rankups); - if (prestiges != null) { - addAll(map, prestiges); - } - return map; - })); - metrics.addCustomChart(new Metrics.SimplePie("prestige", - () -> config.getBoolean("prestige") ? "enabled" : "disabled")); - metrics.addCustomChart(new Metrics.SimplePie("permission-rankup", - () -> config.getBoolean("permission-rankup") ? "enabled" : "disabled")); - metrics.addCustomChart(new Metrics.SimplePie("notify-update", - () -> config.getBoolean("notify-update") ? "enabled" : "disabled")); + if (System.getProperty("TEST") == null) { + Metrics metrics = new Metrics(this); + metrics.addCustomChart(new Metrics.SimplePie("confirmation", + () -> config.getString("confirmation-type", "unknown"))); + metrics.addCustomChart(new Metrics.AdvancedPie("requirements", () -> { + Map map = new HashMap<>(); + addAll(map, rankups); + if (prestiges != null) { + addAll(map, prestiges); + } + return map; + })); + metrics.addCustomChart(new Metrics.SimplePie("prestige", + () -> config.getBoolean("prestige") ? "enabled" : "disabled")); + metrics.addCustomChart(new Metrics.SimplePie("permission-rankup", + () -> config.getBoolean("permission-rankup") ? "enabled" : "disabled")); + metrics.addCustomChart(new Metrics.SimplePie("notify-update", + () -> config.getBoolean("notify-update") ? "enabled" : "disabled")); + } if (config.getBoolean("ranks")) { getCommand("ranks").setExecutor(new RanksCommand(this)); @@ -142,8 +160,6 @@ public class RankupPlugin extends JavaPlugin { config = loadConfig("config.yml"); - PermissionManager permissionManager = new PermissionManager(this); - if (config.getBoolean("permission-rankup")) { permissions = permissionManager.permissionOnlyProvider(); } else { @@ -158,12 +174,11 @@ public class RankupPlugin extends JavaPlugin { closeInventories(); loadConfigs(init); - if (autoRankup != null) { - autoRankup.cancel(); - } long time = (long) (config.getDouble("autorankup-interval") * 60 * 20); if (time > 0) { - autoRankup = new AutoRankup(this); + if (!autoRankup.isCancelled()) { + autoRankup.cancel(); + } autoRankup.runTaskTimer(this, time, time); } @@ -239,7 +254,7 @@ public class RankupPlugin extends JavaPlugin { messages = YamlConfiguration.loadConfiguration(localeFile); if (init) { - Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> { + Bukkit.getScheduler().runTask(this, () -> { refreshRanks(); error(); }); @@ -302,6 +317,7 @@ public class RankupPlugin extends JavaPlugin { new XpLevelRequirement(this, "xp-levelh"), new XpLevelDeductibleRequirement(this, "xp-level"), new PlaytimeMinutesRequirement(this), + new AdvancementRequirement(this), new GroupRequirement(this), new PermissionRequirement(this), new PlaceholderRequirement(this), @@ -353,13 +369,7 @@ public class RankupPlugin extends JavaPlugin { } } private void setupEconomy() { - RegisteredServiceProvider rsp = getServer().getServicesManager() - .getRegistration(Economy.class); - if (rsp != null) { - economy = rsp.getProvider(); - } else { - getLogger().warning("No economy found. The 'money' requirement will be disabled."); - } + economy = economyProvider.getEconomy(); } public String formatMoney(double money) { diff --git a/src/main/java/sh/okx/rankup/commands/InfoCommand.java b/src/main/java/sh/okx/rankup/commands/InfoCommand.java index 1f58441..191db2c 100644 --- a/src/main/java/sh/okx/rankup/commands/InfoCommand.java +++ b/src/main/java/sh/okx/rankup/commands/InfoCommand.java @@ -158,7 +158,7 @@ public class InfoCommand implements TabExecutor { if (args.length > 1 && args[1].equalsIgnoreCase("status")) { for (Rank rank : plugin.getRankups().getTree()) { String placeholder = "status_" + rank.getRank(); - sender.sendMessage(placeholder + ": " + plugin.getPlaceholders().getExpansion().onPlaceholderRequest(sender instanceof Player ? (Player) sender : null, placeholder)); + sender.sendMessage(placeholder + ": " + plugin.getPlaceholders().getExpansion().placeholder(sender instanceof Player ? (Player) sender : null, placeholder)); } return true; } @@ -178,7 +178,7 @@ public class InfoCommand implements TabExecutor { "next_rank", }; for (String placeholder : placeholders) { - sender.sendMessage(placeholder + ": " + plugin.getPlaceholders().getExpansion().onPlaceholderRequest(sender instanceof Player ? (Player) sender : null, placeholder)); + sender.sendMessage(placeholder + ": " + plugin.getPlaceholders().getExpansion().placeholder(sender instanceof Player ? (Player) sender : null, placeholder)); } return true; } else if (args[0].equalsIgnoreCase("tree") && sender.hasPermission("rankup.admin")) { diff --git a/src/main/java/sh/okx/rankup/commands/PrestigeCommand.java b/src/main/java/sh/okx/rankup/commands/PrestigeCommand.java index 67dda2e..a675056 100644 --- a/src/main/java/sh/okx/rankup/commands/PrestigeCommand.java +++ b/src/main/java/sh/okx/rankup/commands/PrestigeCommand.java @@ -1,6 +1,7 @@ package sh.okx.rankup.commands; import lombok.RequiredArgsConstructor; +import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -62,7 +63,12 @@ public class PrestigeCommand implements CommandExecutor { .send(player); break; case "gui": - Gui.of(player, prestige, rankElement.getNext().getRank(), plugin).open(player); + Gui gui = Gui.of(player, prestige, rankElement.getNext().getRank(), plugin); + if (gui == null) { + player.sendMessage(ChatColor.RED + "GUI is not available. Check console for more informatiopn."); + return true; + } + gui.open(player); break; case "none": plugin.getHelper().prestige(player); diff --git a/src/main/java/sh/okx/rankup/commands/RankupCommand.java b/src/main/java/sh/okx/rankup/commands/RankupCommand.java index 9551e35..855494f 100644 --- a/src/main/java/sh/okx/rankup/commands/RankupCommand.java +++ b/src/main/java/sh/okx/rankup/commands/RankupCommand.java @@ -1,6 +1,7 @@ package sh.okx.rankup.commands; import lombok.RequiredArgsConstructor; +import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -40,13 +41,6 @@ public class RankupCommand implements CommandExecutor { return true; } RankElement rankElement = rankups.getByPlayer(player); - /*Rank next = rankups.next(rank); - if (next == null) { - plugin.getLogger().severe("Rankup from " + rank.getRank() + " to " + rank.getNext() + - " is defined but " + rank.getNext() + " does not exist."); - plugin.getMessage(Message.INVALID_RANKUP).failIfEmpty().send(player); - return true; - }*/ FileConfiguration config = plugin.getConfig(); String confirmationType = config.getString("confirmation-type").toLowerCase(); @@ -68,7 +62,12 @@ public class RankupCommand implements CommandExecutor { .send(player); break; case "gui": - Gui.of(player, rankElement.getRank(), rankElement.getNext().getRank(), plugin).open(player); + Gui gui = Gui.of(player, rankElement.getRank(), rankElement.getNext().getRank(), plugin); + if (gui == null) { + player.sendMessage(ChatColor.RED + "GUI is not available. Check console for more informatiopn."); + return true; + } + gui.open(player); break; case "none": plugin.getHelper().rankup(player); diff --git a/src/main/java/sh/okx/rankup/economy/Economy.java b/src/main/java/sh/okx/rankup/economy/Economy.java index baf9481..2561501 100644 --- a/src/main/java/sh/okx/rankup/economy/Economy.java +++ b/src/main/java/sh/okx/rankup/economy/Economy.java @@ -1,4 +1,9 @@ package sh.okx.rankup.economy; +import org.bukkit.entity.Player; + public interface Economy { + double getBalance(Player player); + void withdrawPlayer(Player player, double amount); + void setPlayer(Player player, double amount); } diff --git a/src/main/java/sh/okx/rankup/economy/EconomyProvider.java b/src/main/java/sh/okx/rankup/economy/EconomyProvider.java index beca05c..56c5e5d 100644 --- a/src/main/java/sh/okx/rankup/economy/EconomyProvider.java +++ b/src/main/java/sh/okx/rankup/economy/EconomyProvider.java @@ -1,4 +1,5 @@ package sh.okx.rankup.economy; public interface EconomyProvider { + Economy getEconomy(); } diff --git a/src/main/java/sh/okx/rankup/economy/VaultEconomy.java b/src/main/java/sh/okx/rankup/economy/VaultEconomy.java index 5f0ebab..e4f3adc 100644 --- a/src/main/java/sh/okx/rankup/economy/VaultEconomy.java +++ b/src/main/java/sh/okx/rankup/economy/VaultEconomy.java @@ -1,4 +1,27 @@ package sh.okx.rankup.economy; -public class VaultEconomy { +import org.bukkit.entity.Player; + +public class VaultEconomy implements Economy { + private final net.milkbowl.vault.economy.Economy economy; + + public VaultEconomy(net.milkbowl.vault.economy.Economy economy) { + this.economy = economy; + } + + @Override + public double getBalance(Player player) { + return economy.getBalance(player); + } + + @Override + public void withdrawPlayer(Player player, double amount) { + economy.withdrawPlayer(player, amount); + } + + @Override + public void setPlayer(Player player, double amount) { + throw new UnsupportedOperationException(); + } + } diff --git a/src/main/java/sh/okx/rankup/economy/VaultEconomyProvider.java b/src/main/java/sh/okx/rankup/economy/VaultEconomyProvider.java index 1efdfaa..1c36b66 100644 --- a/src/main/java/sh/okx/rankup/economy/VaultEconomyProvider.java +++ b/src/main/java/sh/okx/rankup/economy/VaultEconomyProvider.java @@ -1,4 +1,17 @@ package sh.okx.rankup.economy; -public class VaultEconomyProvider { +import org.bukkit.Bukkit; +import org.bukkit.plugin.RegisteredServiceProvider; + +public class VaultEconomyProvider implements EconomyProvider { + @Override + public Economy getEconomy() { + RegisteredServiceProvider rsp = Bukkit.getServer().getServicesManager() + .getRegistration(net.milkbowl.vault.economy.Economy.class); + if (rsp != null) { + return new VaultEconomy(rsp.getProvider()); + } else { + return null; + } + } } diff --git a/src/main/java/sh/okx/rankup/gui/Gui.java b/src/main/java/sh/okx/rankup/gui/Gui.java index 40bf4f9..275e91c 100644 --- a/src/main/java/sh/okx/rankup/gui/Gui.java +++ b/src/main/java/sh/okx/rankup/gui/Gui.java @@ -41,6 +41,11 @@ public class Gui implements InventoryHolder { String type = gui.prestige ? "prestige" : "rankup"; String basePath = type + ".gui"; ConfigurationSection config = plugin.getSection(oldRank, basePath); + if (config == null) { + plugin.getLogger().severe("You must update your config.yml and locale/en.yml to be able to use the GUI! Your configuration files are outdated."); + return null; + } + ItemStack[] items = new ItemStack[config.getInt("rows", 1) * 9]; ItemStack fill = getItem(plugin, plugin.getSection(oldRank, basePath + ".fill"), player, oldRank, rank); diff --git a/src/main/java/sh/okx/rankup/hook/PermissionManager.java b/src/main/java/sh/okx/rankup/hook/PermissionManager.java index f094e3c..db52475 100644 --- a/src/main/java/sh/okx/rankup/hook/PermissionManager.java +++ b/src/main/java/sh/okx/rankup/hook/PermissionManager.java @@ -1,6 +1,7 @@ package sh.okx.rankup.hook; -public interface PermisionManager { +public interface PermissionManager { + 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 index 0c4a007..68d50c4 100644 --- a/src/main/java/sh/okx/rankup/hook/VaultPermissionManager.java +++ b/src/main/java/sh/okx/rankup/hook/VaultPermissionManager.java @@ -4,13 +4,14 @@ import net.milkbowl.vault.permission.Permission; import org.bukkit.plugin.RegisteredServiceProvider; import sh.okx.rankup.RankupPlugin; -public class PermissionManager { +public class VaultPermissionManager implements PermissionManager { private final RankupPlugin plugin; - public PermissionManager(RankupPlugin plugin) { + public VaultPermissionManager(RankupPlugin plugin) { this.plugin = plugin; } + @Override public GroupProvider findPermissionProvider() { return getVaultPermissionProvider(); } @@ -28,6 +29,7 @@ public class PermissionManager { return new VaultGroupProvider(provider); } + @Override 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 index 2d19f46..6986758 100644 --- a/src/main/java/sh/okx/rankup/placeholders/Expansion.java +++ b/src/main/java/sh/okx/rankup/placeholders/Expansion.java @@ -1,4 +1,7 @@ package sh.okx.rankup.placeholders; -public class Expansion { +import org.bukkit.entity.Player; + +public interface Expansion { + String placeholder(Player player, String placeholder); } diff --git a/src/main/java/sh/okx/rankup/placeholders/Placeholders.java b/src/main/java/sh/okx/rankup/placeholders/Placeholders.java index 3ef7127..73d8baf 100644 --- a/src/main/java/sh/okx/rankup/placeholders/Placeholders.java +++ b/src/main/java/sh/okx/rankup/placeholders/Placeholders.java @@ -27,9 +27,10 @@ public class Placeholders { } public void register() { + expansion = new RankupExpansion(plugin, this); if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { - expansion = new RankupExpansion(plugin, this); - expansion.register(); + RankupPlaceholderExpansion placeholderExpansion = new RankupPlaceholderExpansion(plugin, expansion); + placeholderExpansion.register(); registered = true; } else { registered = false; diff --git a/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java b/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java index 14da5d1..8592731 100644 --- a/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java +++ b/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java @@ -1,4 +1,218 @@ package sh.okx.rankup.placeholders; -public class RankupExpansion { +import lombok.RequiredArgsConstructor; +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 implements Expansion { + private static final Pattern PATTERN = Pattern.compile("(.*)#(.*)"); + + private final RankupPlugin plugin; + private final Placeholders placeholders; + + @Override + public String placeholder(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); + } } diff --git a/src/main/java/sh/okx/rankup/placeholders/RankupPlaceholderExpansion.java b/src/main/java/sh/okx/rankup/placeholders/RankupPlaceholderExpansion.java index f04401e..4b754f1 100644 --- a/src/main/java/sh/okx/rankup/placeholders/RankupPlaceholderExpansion.java +++ b/src/main/java/sh/okx/rankup/placeholders/RankupPlaceholderExpansion.java @@ -4,217 +4,15 @@ 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("(.*)#(.*)"); - +public class RankupPlaceholderExpansion extends PlaceholderExpansion { private final RankupPlugin plugin; - private final Placeholders placeholders; + private final RankupExpansion expansion; @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); + return expansion.placeholder(player, params); } @Override diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/AdvancementRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/AdvancementRequirement.java index c025f21..aa352c3 100644 --- a/src/main/java/sh/okx/rankup/requirements/requirement/AdvancementRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/AdvancementRequirement.java @@ -1,4 +1,57 @@ package sh.okx.rankup.requirements.requirement; -public class AdvancementRequirement { +import org.bukkit.Bukkit; +import org.bukkit.advancement.Advancement; +import org.bukkit.advancement.AdvancementProgress; +import org.bukkit.entity.Player; +import sh.okx.rankup.RankupPlugin; +import sh.okx.rankup.requirements.Requirement; + +import java.util.Iterator; +import java.util.regex.Pattern; + +/** + * Advancement requirement + * @author Link, with modifications from Okx + */ +public class AdvancementRequirement extends Requirement { + public AdvancementRequirement(RankupPlugin plugin) { + super(plugin, "advancement"); + } + + protected AdvancementRequirement(Requirement clone) { + super(clone); + } + + @Override + public boolean check(Player player) { + for (String string : getValuesString()) { + Iterator advancementIterator = Bukkit.advancementIterator(); + while (advancementIterator.hasNext()) { + Advancement adv = advancementIterator.next(); + String key = adv.getKey().getKey(); + Pattern pattern = Pattern.compile(string.replace("*", ".*").replace("-", "")); + boolean positive = false; + if (pattern.matcher(key).find()) { + positive = !string.startsWith("-"); + } + + AdvancementProgress progress = player.getAdvancementProgress(adv); + if (progress.isDone() == positive) { + return true; + } + } + } + return false; + } + + @Override + public Requirement clone() { + return new AdvancementRequirement(this); + } + + @Override + public double getValueDouble() { + return 1; + } } diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/MoneyDeductibleRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/MoneyDeductibleRequirement.java index beca336..2b442ba 100644 --- a/src/main/java/sh/okx/rankup/requirements/requirement/MoneyDeductibleRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/MoneyDeductibleRequirement.java @@ -1,8 +1,8 @@ package sh.okx.rankup.requirements.requirement; -import net.milkbowl.vault.economy.Economy; import org.bukkit.entity.Player; import sh.okx.rankup.RankupPlugin; +import sh.okx.rankup.economy.Economy; import sh.okx.rankup.requirements.DeductibleRequirement; import sh.okx.rankup.requirements.Requirement; diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/XpLevelDeductibleRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/XpLevelDeductibleRequirement.java index 6da7bbd..1887292 100644 --- a/src/main/java/sh/okx/rankup/requirements/requirement/XpLevelDeductibleRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/XpLevelDeductibleRequirement.java @@ -1,8 +1,9 @@ -package sh.okx.rankup.requirements; +package sh.okx.rankup.requirements.requirement; import org.bukkit.entity.Player; import sh.okx.rankup.RankupPlugin; -import sh.okx.rankup.requirements.requirement.XpLevelRequirement; +import sh.okx.rankup.requirements.DeductibleRequirement; +import sh.okx.rankup.requirements.Requirement; public class XpLevelDeductibleRequirement extends XpLevelRequirement implements DeductibleRequirement { diff --git a/src/test/java/sh/okx/rankup/RankupPlaceholderTest.java b/src/test/java/sh/okx/rankup/RankupPlaceholderTest.java index 027b73b..59ed812 100644 --- a/src/test/java/sh/okx/rankup/RankupPlaceholderTest.java +++ b/src/test/java/sh/okx/rankup/RankupPlaceholderTest.java @@ -1,4 +1,55 @@ package sh.okx.rankup; -public class RankupPlaceholderTest { +import be.seeseemelk.mockbukkit.entity.PlayerMock; +import org.junit.Test; +import sh.okx.rankup.placeholders.RankupExpansion; + +import static org.junit.Assert.assertEquals; + +public class RankupPlaceholderTest extends RankupTest { + @Test + public void testCurrentRank() { + PlayerMock player = server.addPlayer(); + groupProvider.addGroup(player.getUniqueId(), "C"); + + RankupExpansion expansion = plugin.getPlaceholders().getExpansion(); + + assertEquals("C", expansion.placeholder(player, "current_rank")); + } + + @Test + public void testNextRank() { + PlayerMock player = server.addPlayer(); + groupProvider.addGroup(player.getUniqueId(), "C"); + + RankupExpansion expansion = plugin.getPlaceholders().getExpansion(); + assertEquals("D", expansion.placeholder(player, "next_rank")); + } + + @Test + public void testStatusCurrent() { + PlayerMock player = server.addPlayer(); + groupProvider.addGroup(player.getUniqueId(), "B"); + + RankupExpansion expansion = plugin.getPlaceholders().getExpansion(); + assertEquals("Current", expansion.placeholder(player, "status_b")); + } + + @Test + public void testStatusComplete() { + PlayerMock player = server.addPlayer(); + groupProvider.addGroup(player.getUniqueId(), "D"); + + RankupExpansion expansion = plugin.getPlaceholders().getExpansion(); + assertEquals("Complete", expansion.placeholder(player, "status_b")); + } + + @Test + public void testStatusIncomplete() { + PlayerMock player = server.addPlayer(); + groupProvider.addGroup(player.getUniqueId(), "A"); + + RankupExpansion expansion = plugin.getPlaceholders().getExpansion(); + assertEquals("Incomplete", expansion.placeholder(player, "status_b")); + } } diff --git a/src/test/java/sh/okx/rankup/RankupTest.java b/src/test/java/sh/okx/rankup/RankupTest.java index 37639e5..ba83ad9 100644 --- a/src/test/java/sh/okx/rankup/RankupTest.java +++ b/src/test/java/sh/okx/rankup/RankupTest.java @@ -1,4 +1,101 @@ package sh.okx.rankup; +import be.seeseemelk.mockbukkit.MockBukkit; +import be.seeseemelk.mockbukkit.ServerMock; +import be.seeseemelk.mockbukkit.entity.PlayerMock; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import sh.okx.rankup.economy.TestEconomyProvider; +import sh.okx.rankup.hook.GroupProvider; +import sh.okx.rankup.hook.TestGroupProvider; +import sh.okx.rankup.hook.TestPermissionManager; +import sh.okx.rankup.messages.Message; +import sh.okx.rankup.messages.Variable; +import sh.okx.rankup.ranks.Rank; +import sh.okx.rankup.ranks.RankElement; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + public class RankupTest { + protected GroupProvider groupProvider; + protected ServerMock server; + protected RankupPlugin plugin; + + @Before + public void setup() { + System.setProperty("TEST", "true"); + + try { + groupProvider = new TestGroupProvider(); + + server = MockBukkit.mock(); + plugin = MockBukkit.load(RankupPlugin.class, new TestPermissionManager(groupProvider), new TestEconomyProvider()); + // let rankup finish setting up + server.getScheduler().performTicks(1); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Test + public void testAutoRankup() { + PlayerMock player = server.addPlayer(); + + // requirement of $1000 + plugin.getEconomy().setPlayer(player, 1000); + // give them group A + groupProvider.addGroup(player.getUniqueId(), "A"); + // give the permission to auto rankup + player.addAttachment(plugin, "rankup.auto", true); + + plugin.autoRankup.run(); + assertTrue(groupProvider.inGroup(player.getUniqueId(), "B")); + assertEquals(0, plugin.getEconomy().getBalance(player), 0); + } + + @Test + public void testNotInLadder() { + PlayerMock player = server.addPlayer(); + + plugin.getHelper().rankup(player); + + player.assertSaid(plugin.getMessage(Message.NOT_IN_LADDER).replace(Variable.PLAYER, player.getName()).toString()); + player.assertNoMoreSaid(); + } + + @Test + public void testLastRank() { + PlayerMock player = server.addPlayer(); + + groupProvider.addGroup(player.getUniqueId(), "D"); + + plugin.getHelper().rankup(player); + + player.assertSaid(plugin.getMessage(Message.NO_RANKUP).replaceRanks(player, plugin.getRankups().getTree().last().getRank().getRank()).toString()); + player.assertNoMoreSaid(); + } + + @Test + public void testMoneyRequirement() { + PlayerMock player = server.addPlayer(); + + plugin.getEconomy().setPlayer(player, 500); + + groupProvider.addGroup(player.getUniqueId(), "A"); + plugin.getHelper().rankup(player); + + RankElement element = plugin.getRankups().getTree().getFirst(); + Rank rank = element.getRank(); + + player.assertSaid(plugin.replaceMoneyRequirements(plugin.getMessage(rank, Message.REQUIREMENTS_NOT_MET).replaceRanks(player, rank, element.getNext().getRank()), player, rank).toString()); + player.assertNoMoreSaid(); + } + + @After + public void tearDown() { + MockBukkit.unmock(); + System.clearProperty("TEST"); + } } diff --git a/src/test/java/sh/okx/rankup/economy/TestEconomy.java b/src/test/java/sh/okx/rankup/economy/TestEconomy.java index 40cd1ef..c7bc5e8 100644 --- a/src/test/java/sh/okx/rankup/economy/TestEconomy.java +++ b/src/test/java/sh/okx/rankup/economy/TestEconomy.java @@ -1,4 +1,25 @@ package sh.okx.rankup.economy; -public class TestEconomy { +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class TestEconomy implements Economy { + private final Map balances = new HashMap<>(); + + @Override + public double getBalance(Player player) { + return balances.get(player.getUniqueId()); + } + + @Override + public void withdrawPlayer(Player player, double amount) { + balances.put(player.getUniqueId(), balances.getOrDefault(player.getUniqueId(), 0D) - amount); + } + + public void setPlayer(Player player, double amount) { + balances.put(player.getUniqueId(), amount); + } } diff --git a/src/test/java/sh/okx/rankup/economy/TestEconomyProvider.java b/src/test/java/sh/okx/rankup/economy/TestEconomyProvider.java index 5f91a78..1de1970 100644 --- a/src/test/java/sh/okx/rankup/economy/TestEconomyProvider.java +++ b/src/test/java/sh/okx/rankup/economy/TestEconomyProvider.java @@ -1,4 +1,8 @@ package sh.okx.rankup.economy; -public class TestEconomyProvider { +public class TestEconomyProvider implements EconomyProvider { + @Override + public Economy getEconomy() { + return new TestEconomy(); + } } diff --git a/src/test/java/sh/okx/rankup/hook/TestGroupProvider.java b/src/test/java/sh/okx/rankup/hook/TestGroupProvider.java index afd8f9a..a8734b0 100644 --- a/src/test/java/sh/okx/rankup/hook/TestGroupProvider.java +++ b/src/test/java/sh/okx/rankup/hook/TestGroupProvider.java @@ -1,4 +1,25 @@ package sh.okx.rankup.hook; -public class TestGroupProvider { +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; + +import java.util.UUID; + +public class TestGroupProvider implements GroupProvider { + private Multimap groups = ArrayListMultimap.create(); + + @Override + public boolean inGroup(UUID uuid, String group) { + return groups.containsEntry(uuid, group.toLowerCase()); + } + + @Override + public void addGroup(UUID uuid, String group) { + groups.put(uuid, group.toLowerCase()); + } + + @Override + public void removeGroup(UUID uuid, String group) { + groups.remove(uuid, group.toLowerCase()); + } } diff --git a/src/test/java/sh/okx/rankup/hook/TestPermissionManager.java b/src/test/java/sh/okx/rankup/hook/TestPermissionManager.java index acf7166..c79977e 100644 --- a/src/test/java/sh/okx/rankup/hook/TestPermissionManager.java +++ b/src/test/java/sh/okx/rankup/hook/TestPermissionManager.java @@ -1,4 +1,19 @@ package sh.okx.rankup.hook; -public class TestPermissionManager { +public class TestPermissionManager implements PermissionManager { + private final GroupProvider groupProvider; + + public TestPermissionManager(GroupProvider groupProvider) { + this.groupProvider = groupProvider; + } + + @Override + public GroupProvider findPermissionProvider() { + return groupProvider; + } + + @Override + public GroupProvider permissionOnlyProvider() { + return groupProvider; + } } diff --git a/src/test/java/sh/okx/rankup/messages/MessageBuilderTest.java b/src/test/java/sh/okx/rankup/messages/MessageBuilderTest.java index 9b42281..f48d205 100644 --- a/src/test/java/sh/okx/rankup/messages/MessageBuilderTest.java +++ b/src/test/java/sh/okx/rankup/messages/MessageBuilderTest.java @@ -5,7 +5,6 @@ import org.junit.Test; import static org.hamcrest.CoreMatchers.instanceOf; import static org.junit.Assert.assertThat; - public class MessageBuilderTest { @Test public void testFailIfEmpty() {