Pebble text processing engine
This commit is contained in:
@@ -51,11 +51,15 @@ public class RankupHelper {
|
||||
public void sendRankupMessages(Player player, RankElement<Rank> rank) {
|
||||
plugin.getMessage(rank.getRank(), Message.SUCCESS_PUBLIC)
|
||||
.failIfEmpty()
|
||||
.replaceRanks(player, rank.getRank(), rank.getNext().getRank())
|
||||
.replacePlayer(player)
|
||||
.replaceOldRank(rank.getRank())
|
||||
.replaceRank(rank.getNext().getRank())
|
||||
.broadcast();
|
||||
plugin.getMessage(rank.getRank(), Message.SUCCESS_PRIVATE)
|
||||
.failIfEmpty()
|
||||
.replaceRanks(player, rank.getRank(), rank.getNext().getRank())
|
||||
.replacePlayer(player)
|
||||
.replaceOldRank(rank.getRank())
|
||||
.replaceRank(rank.getNext().getRank())
|
||||
.send(player);
|
||||
}
|
||||
|
||||
@@ -81,13 +85,15 @@ public class RankupHelper {
|
||||
|
||||
plugin.getMessage(prestige.getRank(), Message.PRESTIGE_SUCCESS_PUBLIC)
|
||||
.failIfEmpty()
|
||||
.replaceRanks(player, prestige.getRank(), prestige.getNext().getRank())
|
||||
.replaceFromTo(prestige.getRank())
|
||||
.replacePlayer(player)
|
||||
.replaceOldRank(prestige.getRank())
|
||||
.replaceRank(prestige.getNext().getRank())
|
||||
.broadcast();
|
||||
plugin.getMessage(prestige.getRank(), Message.PRESTIGE_SUCCESS_PRIVATE)
|
||||
.failIfEmpty()
|
||||
.replaceRanks(player, prestige.getRank(), prestige.getNext().getRank())
|
||||
.replaceFromTo(prestige.getRank())
|
||||
.replacePlayer(player)
|
||||
.replaceOldRank(prestige.getRank())
|
||||
.replaceRank(prestige.getNext().getRank())
|
||||
.send(player);
|
||||
}
|
||||
|
||||
@@ -102,10 +108,10 @@ public class RankupHelper {
|
||||
plugin
|
||||
.getMessage(rank, secondsLeft > 1 ? Message.COOLDOWN_PLURAL : Message.COOLDOWN_SINGULAR)
|
||||
.failIfEmpty()
|
||||
.replaceRanks(player, rank)
|
||||
.replaceFromTo(rank)
|
||||
.replace(Variable.SECONDS, cooldownSeconds)
|
||||
.replace(Variable.SECONDS_LEFT, secondsLeft)
|
||||
.replacePlayer(player)
|
||||
.replaceRank(rank)
|
||||
.replaceKey(Variable.SECONDS.toString(), cooldownSeconds)
|
||||
.replaceKey(Variable.SECONDS_LEFT.toString(), secondsLeft)
|
||||
.send(player);
|
||||
return true;
|
||||
}
|
||||
@@ -151,22 +157,27 @@ public class RankupHelper {
|
||||
if (rankElement == null) { // check if in ladder
|
||||
plugin.getMessage(Message.NOT_IN_LADDER)
|
||||
.failIf(!message)
|
||||
.replace(Variable.PLAYER, player.getName())
|
||||
.replacePlayer(player)
|
||||
.send(player);
|
||||
return false;
|
||||
}
|
||||
Rank rank = rankElement.getRank();
|
||||
if (!rankElement.hasNext()) {
|
||||
Prestiges prestiges = plugin.getPrestiges();
|
||||
plugin.getMessage(prestiges == null || !prestiges.getByPlayer(player).hasNext() ? Message.NO_RANKUP : Message.MUST_PRESTIGE)
|
||||
plugin.getMessage(
|
||||
prestiges == null || !prestiges.getByPlayer(player).hasNext() ? Message.NO_RANKUP
|
||||
: Message.MUST_PRESTIGE)
|
||||
.failIf(!message)
|
||||
.replaceRanks(player, rankups.getTree().last().getRank())
|
||||
.replacePlayer(player)
|
||||
.replaceRank(rankups.getTree().last().getRank())
|
||||
.send(player);
|
||||
return false;
|
||||
} else if (!rank.hasRequirements(player)) { // check if they can afford it
|
||||
if (message) {
|
||||
plugin.replaceMoneyRequirements(plugin.getMessage(rank, Message.REQUIREMENTS_NOT_MET)
|
||||
.replaceRanks(player, rank, rankElement.getNext().getRank()), player, rank)
|
||||
plugin.getMessage(rank, Message.REQUIREMENTS_NOT_MET)
|
||||
.replacePlayer(player)
|
||||
.replaceOldRank(rank)
|
||||
.replaceRank(rankElement.getNext().getRank())
|
||||
.send(player);
|
||||
}
|
||||
return false;
|
||||
@@ -198,25 +209,26 @@ public class RankupHelper {
|
||||
public boolean checkPrestige(Player player, boolean message) {
|
||||
Prestiges prestiges = plugin.getPrestiges();
|
||||
RankElement<Prestige> prestigeElement = prestiges.getByPlayer(player);
|
||||
if (prestigeElement == null || !prestigeElement.getRank().isEligible(player)) { // check if in ladder
|
||||
if (prestigeElement == null || !prestigeElement.getRank()
|
||||
.isEligible(player)) { // check if in ladder
|
||||
plugin.getMessage(Message.NOT_HIGH_ENOUGH)
|
||||
.failIf(!message)
|
||||
.replace(Variable.PLAYER, player.getName())
|
||||
.replacePlayer(player)
|
||||
.send(player);
|
||||
return false;
|
||||
} else if (!prestigeElement.hasNext()) { // check if they are at the highest rank
|
||||
plugin.getMessage(prestigeElement.getRank(), Message.PRESTIGE_NO_PRESTIGE)
|
||||
.failIf(!message)
|
||||
.replaceRanks(player, prestigeElement.getRank())
|
||||
.replaceFromTo(prestigeElement.getRank())
|
||||
.replacePlayer(player)
|
||||
.replaceRank(prestigeElement.getRank())
|
||||
.send(player);
|
||||
return false;
|
||||
} else if (!prestigeElement.getRank().hasRequirements(player)) { // check if they can afford it
|
||||
plugin.replaceMoneyRequirements(
|
||||
plugin.getMessage(prestigeElement.getRank(), Message.PRESTIGE_REQUIREMENTS_NOT_MET)
|
||||
.failIf(!message)
|
||||
.replaceRanks(player, prestigeElement.getRank(), prestigeElement.getNext().getRank()), player, prestigeElement.getRank())
|
||||
.replaceFromTo(prestigeElement.getRank())
|
||||
plugin.getMessage(prestigeElement.getRank(), Message.PRESTIGE_REQUIREMENTS_NOT_MET)
|
||||
.failIf(!message)
|
||||
.replacePlayer(player)
|
||||
.replaceOldRank(prestigeElement.getRank())
|
||||
.replaceRank(prestigeElement.getNext().getRank())
|
||||
.send(player);
|
||||
return false;
|
||||
} else if (checkCooldown(player, prestigeElement.getRank())) {
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
package sh.okx.rankup;
|
||||
|
||||
import java.io.File;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Supplier;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
@@ -37,8 +35,7 @@ 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;
|
||||
import sh.okx.rankup.messages.Variable;
|
||||
import sh.okx.rankup.messages.pebble.PebbleMessageBuilder;
|
||||
import sh.okx.rankup.placeholders.Placeholders;
|
||||
import sh.okx.rankup.prestige.Prestige;
|
||||
import sh.okx.rankup.prestige.Prestiges;
|
||||
@@ -88,7 +85,7 @@ import sh.okx.rankup.util.VersionChecker;
|
||||
|
||||
public class RankupPlugin extends JavaPlugin {
|
||||
|
||||
public static final int CONFIG_VERSION = 8;
|
||||
public static final int CONFIG_VERSION = 10;
|
||||
|
||||
@Getter
|
||||
private GroupProvider permissions;
|
||||
@@ -132,7 +129,7 @@ public class RankupPlugin extends JavaPlugin {
|
||||
|
||||
reload(true);
|
||||
|
||||
if (System.getProperty("TEST") == null) {
|
||||
if (System.getProperty("RANKUP_TEST") == null) {
|
||||
Metrics metrics = new Metrics(this);
|
||||
metrics.addCustomChart(new Metrics.SimplePie("confirmation",
|
||||
() -> config.getString("confirmation-type", "unknown")));
|
||||
@@ -235,6 +232,10 @@ public class RankupPlugin extends JavaPlugin {
|
||||
helper = new RankupHelper(this);
|
||||
}
|
||||
|
||||
public MessageBuilder newMessageBuilder(String message) {
|
||||
return new PebbleMessageBuilder(this, message);
|
||||
}
|
||||
|
||||
public boolean error() {
|
||||
return error(null);
|
||||
}
|
||||
@@ -408,7 +409,7 @@ public class RankupPlugin extends JavaPlugin {
|
||||
new TokensRequirement(this, "tokenmanager-tokensh"),
|
||||
new TokensDeductibleRequirement(this, "tokenmanager-tokens"));
|
||||
}
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("SuperbVotes")) {
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("SuperbVote")) {
|
||||
requirements.addRequirements(new SuperbVoteVotesRequirement(this));
|
||||
}
|
||||
}
|
||||
@@ -445,94 +446,25 @@ public class RankupPlugin extends JavaPlugin {
|
||||
if (messages == null || !messages.isSet(message.getName())) {
|
||||
messages = this.messages;
|
||||
}
|
||||
return MessageBuilder.of(messages, message);
|
||||
return newMessageBuilder(messages.getString(message.getName()));
|
||||
}
|
||||
|
||||
public MessageBuilder getMessage(Message message) {
|
||||
return MessageBuilder.of(messages, message);
|
||||
return newMessageBuilder(messages.getString(message.getName()));
|
||||
}
|
||||
|
||||
public MessageBuilder replaceMoneyRequirements(MessageBuilder builder, CommandSender sender,
|
||||
Rank rank) {
|
||||
if (builder instanceof NullMessageBuilder || rank == null) {
|
||||
return builder;
|
||||
}
|
||||
|
||||
Requirement money = rank.getRequirement(sender instanceof Player ? (Player) sender : null, "money");
|
||||
if (money != null) {
|
||||
Double amount = null;
|
||||
Double total = null;
|
||||
if (sender instanceof Player && rank.isIn((Player) sender)) {
|
||||
if (economy != null) {
|
||||
amount = money.getRemaining((Player) sender);
|
||||
total = money.getTotal((Player) sender);
|
||||
}
|
||||
} else {
|
||||
amount = money.getValueDouble();
|
||||
total = 0D;
|
||||
}
|
||||
if (amount != null && economy != null) {
|
||||
builder.replace(Variable.MONEY_NEEDED, formatMoney(amount));
|
||||
builder.replace(Variable.MONEY, formatMoney(money.getValueDouble()));
|
||||
builder.replace(Variable.MONEY_DONE, formatMoney(total - amount));
|
||||
}
|
||||
}
|
||||
if (sender instanceof Player) {
|
||||
replaceRequirements(builder, (Player) sender, rank);
|
||||
}
|
||||
return builder;
|
||||
}
|
||||
|
||||
public MessageBuilder replaceRequirements(MessageBuilder builder, Player player, Rank rank) {
|
||||
DecimalFormat simpleFormat = placeholders.getSimpleFormat();
|
||||
DecimalFormat percentFormat = placeholders.getPercentFormat();
|
||||
for (Requirement requirement : rank.getRequirements().getRequirements(player)) {
|
||||
try {
|
||||
replaceRequirements(builder, Variable.AMOUNT, requirement,
|
||||
() -> simpleFormat.format(requirement.getTotal(player)));
|
||||
if (rank.isIn(player)) {
|
||||
replaceRequirements(builder, Variable.AMOUNT_NEEDED, requirement,
|
||||
() -> simpleFormat.format(requirement.getRemaining(player)));
|
||||
replaceRequirements(builder, Variable.PERCENT_LEFT, requirement,
|
||||
() -> percentFormat.format(Math.max(0,
|
||||
(requirement.getRemaining(player) / requirement.getTotal(player)) * 100)));
|
||||
replaceRequirements(builder, Variable.PERCENT_DONE, requirement,
|
||||
() -> percentFormat.format(Math.min(100,
|
||||
(1 - (requirement.getRemaining(player) / requirement.getTotal(player))) * 100)));
|
||||
replaceRequirements(builder, Variable.AMOUNT_DONE, requirement,
|
||||
() -> simpleFormat
|
||||
.format(requirement.getTotal(player) - requirement.getRemaining(player)));
|
||||
}
|
||||
} catch (NumberFormatException ignored) {
|
||||
}
|
||||
}
|
||||
return builder;
|
||||
}
|
||||
|
||||
private void replaceRequirements(MessageBuilder builder, Variable variable, Requirement requirement, Supplier<Object> value) {
|
||||
try {
|
||||
builder.replace(variable + " " + requirement.getFullName(), value.get());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public MessageBuilder getMessage(CommandSender player, Message message, Rank oldRank, Rank rankName) {
|
||||
String oldRankName;
|
||||
String oldRankDisplayName;
|
||||
public MessageBuilder getMessage(CommandSender player, Message message, Rank oldRank, Rank rank) {
|
||||
Rank actualOldRank;
|
||||
if (oldRank instanceof Prestige && oldRank.getRank() == null) {
|
||||
oldRankName = ((Prestige) oldRank).getFrom();
|
||||
oldRankDisplayName = rankups.getTree().last().getRank().getDisplayName();
|
||||
actualOldRank = rankups.getByName(((Prestige) oldRank).getFrom()).getRank();
|
||||
} else {
|
||||
oldRankName = oldRank.getRank();
|
||||
oldRankDisplayName = oldRank.getDisplayName();
|
||||
actualOldRank = oldRank;
|
||||
}
|
||||
|
||||
return replaceMoneyRequirements(getMessage(oldRank, message)
|
||||
.replaceRanks(player, rankName)
|
||||
.replace(Variable.OLD_RANK, oldRankName)
|
||||
.replace(Variable.OLD_RANK_NAME, oldRankDisplayName), player, oldRank)
|
||||
.replaceFromTo(oldRank);
|
||||
return getMessage(oldRank, message)
|
||||
.replacePlayer(player)
|
||||
.replaceRank(rank)
|
||||
.replaceOldRank(actualOldRank);
|
||||
}
|
||||
|
||||
public void sendHeaderFooter(CommandSender sender, Rank rank, Message type) {
|
||||
@@ -540,12 +472,12 @@ public class RankupPlugin extends JavaPlugin {
|
||||
if (rank == null) {
|
||||
builder = getMessage(type)
|
||||
.failIfEmpty()
|
||||
.replace(Variable.PLAYER, sender.getName());
|
||||
.replacePlayer(sender);
|
||||
} else {
|
||||
builder = getMessage(rank, type)
|
||||
.failIfEmpty()
|
||||
.replaceRanks(sender, rank)
|
||||
.replaceFromTo(rank);
|
||||
.replacePlayer(sender)
|
||||
.replaceRank(rank);
|
||||
}
|
||||
builder.send(sender);
|
||||
}
|
||||
|
||||
@@ -58,9 +58,10 @@ public class PrestigeCommand implements CommandExecutor {
|
||||
Prestige next = rankElement.getNext().getRank();
|
||||
Rank nextRank = next == null ? prestiges.getTree().last().getRank() : next;
|
||||
|
||||
plugin.replaceMoneyRequirements(plugin.getMessage(prestige, Message.PRESTIGE_CONFIRMATION)
|
||||
.replaceRanks(player, prestige, nextRank), player, prestige)
|
||||
.replaceFromTo(prestige)
|
||||
plugin.getMessage(prestige, Message.PRESTIGE_CONFIRMATION)
|
||||
.replacePlayer(player)
|
||||
.replaceOldRank(prestige)
|
||||
.replaceRank(nextRank)
|
||||
.send(player);
|
||||
break;
|
||||
case "gui":
|
||||
|
||||
@@ -7,6 +7,8 @@ import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import sh.okx.rankup.RankupPlugin;
|
||||
import sh.okx.rankup.messages.Message;
|
||||
import sh.okx.rankup.messages.MessageBuilder;
|
||||
import sh.okx.rankup.messages.Variable;
|
||||
import sh.okx.rankup.prestige.Prestige;
|
||||
import sh.okx.rankup.prestige.Prestiges;
|
||||
import sh.okx.rankup.ranks.RankElement;
|
||||
@@ -38,9 +40,12 @@ public class PrestigesCommand implements CommandExecutor {
|
||||
.send(sender);
|
||||
message = Message.PRESTIGES_INCOMPLETE;
|
||||
} else {
|
||||
plugin.getMessage(sender, message, prestige.getRank(), next.getRank())
|
||||
.replaceFirstPrestige(prestige.getRank(), prestiges, prestige.getRank().getFrom())
|
||||
.send(sender);
|
||||
MessageBuilder builder = plugin
|
||||
.getMessage(sender, message, prestige.getRank(), next.getRank());
|
||||
if (prestiges.getFirst().equals(prestige.getRank())) {
|
||||
builder.replaceKey(Variable.OLD_RANK.toString(), prestige.getRank().getFrom());
|
||||
}
|
||||
builder.send(sender);
|
||||
}
|
||||
prestige = next;
|
||||
}
|
||||
|
||||
@@ -58,8 +58,10 @@ public class RankupCommand implements CommandExecutor {
|
||||
switch (confirmationType) {
|
||||
case "text":
|
||||
confirming.put(player, System.currentTimeMillis());
|
||||
plugin.replaceMoneyRequirements(plugin.getMessage(rankElement.getRank(), Message.CONFIRMATION)
|
||||
.replaceRanks(player, rankElement.getRank(), rankElement.getNext().getRank()), player, rankElement.getRank())
|
||||
plugin.getMessage(rankElement.getRank(), Message.CONFIRMATION)
|
||||
.replacePlayer(player)
|
||||
.replaceOldRank(rankElement.getRank())
|
||||
.replaceRank(rankElement.getNext().getRank())
|
||||
.send(player);
|
||||
break;
|
||||
case "gui":
|
||||
|
||||
@@ -26,6 +26,7 @@ import sh.okx.rankup.util.ItemUtil;
|
||||
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class Gui implements InventoryHolder {
|
||||
|
||||
@Getter
|
||||
private final boolean returnToRanksGui;
|
||||
@Getter
|
||||
@@ -37,7 +38,8 @@ public class Gui implements InventoryHolder {
|
||||
@Getter
|
||||
private boolean prestige;
|
||||
|
||||
public static Gui of(Player player, Rank oldRank, Rank rank, RankupPlugin plugin, boolean returnToRanksGui) {
|
||||
public static Gui of(Player player, Rank oldRank, Rank rank, RankupPlugin plugin,
|
||||
boolean returnToRanksGui) {
|
||||
Gui gui = new Gui(returnToRanksGui);
|
||||
gui.prestige = oldRank instanceof Prestige;
|
||||
|
||||
@@ -45,15 +47,19 @@ public class Gui implements InventoryHolder {
|
||||
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.");
|
||||
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);
|
||||
ItemStack cancel = getItem(plugin, plugin.getSection(oldRank, basePath + ".cancel"), player, oldRank, rank);
|
||||
ItemStack rankup = getItem(plugin, plugin.getSection(oldRank, basePath + ".rankup"), player, oldRank, rank);
|
||||
ItemStack fill = getItem(plugin, plugin.getSection(oldRank, basePath + ".fill"), player,
|
||||
oldRank, rank);
|
||||
ItemStack cancel = getItem(plugin, plugin.getSection(oldRank, basePath + ".cancel"), player,
|
||||
oldRank, rank);
|
||||
ItemStack rankup = getItem(plugin, plugin.getSection(oldRank, basePath + ".rankup"), player,
|
||||
oldRank, rank);
|
||||
|
||||
addItem(items, plugin.getSection(oldRank, basePath + ".rankup"), rankup);
|
||||
addItem(items, plugin.getSection(oldRank, basePath + ".cancel"), cancel);
|
||||
@@ -63,26 +69,30 @@ public class Gui implements InventoryHolder {
|
||||
gui.cancel = cancel;
|
||||
|
||||
Inventory inventory = Bukkit.createInventory(gui, items.length,
|
||||
Colour.translate(plugin.replaceMoneyRequirements(
|
||||
Colour.translate(
|
||||
plugin.getMessage(oldRank, gui.prestige ? Message.PRESTIGE_TITLE : Message.TITLE)
|
||||
.replaceRanks(player, oldRank, rank)
|
||||
.replaceFromTo(oldRank), player, oldRank).toString()));
|
||||
.replacePlayer(player)
|
||||
.replaceOldRank(oldRank)
|
||||
.replaceRank(rank).toString(player)));
|
||||
inventory.setContents(items);
|
||||
gui.inventory = inventory;
|
||||
return gui;
|
||||
}
|
||||
|
||||
public static ItemStack getItem(RankupPlugin plugin, ConfigurationSection section, Player player, RankElement<Rank> element) {
|
||||
public static ItemStack getItem(RankupPlugin plugin, ConfigurationSection section, Player player,
|
||||
RankElement<Rank> element) {
|
||||
if (element == null) {
|
||||
return getItem(plugin, section, player, null, null);
|
||||
} else {
|
||||
RankElement<Rank> next = element.getNext();
|
||||
return getItem(plugin, section, player, element.getRank(), (next == null ? element : next).getRank());
|
||||
return getItem(plugin, section, player, element.getRank(),
|
||||
(next == null ? element : next).getRank());
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public static ItemStack getItem(RankupPlugin plugin, ConfigurationSection section, Player player, Rank oldRank, Rank rank) {
|
||||
public static ItemStack getItem(RankupPlugin plugin, ConfigurationSection section, Player player,
|
||||
Rank oldRank, Rank rank) {
|
||||
if (section == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -111,23 +121,26 @@ public class Gui implements InventoryHolder {
|
||||
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (section.contains("lore")) {
|
||||
meta.setLore(Arrays.stream(format(plugin, section.getString("lore"), player, oldRank, rank).split("\n"))
|
||||
meta.setLore(Arrays
|
||||
.stream(format(plugin, section.getString("lore"), player, oldRank, rank).split("\n"))
|
||||
.map(string -> ChatColor.RESET + string)
|
||||
.collect(Collectors.toList()));
|
||||
}
|
||||
if (section.contains("name")) {
|
||||
meta.setDisplayName(ChatColor.RESET + format(plugin, section.getString("name"), player, oldRank, rank));
|
||||
meta.setDisplayName(
|
||||
ChatColor.RESET + format(plugin, section.getString("name"), player, oldRank, rank));
|
||||
}
|
||||
item.setItemMeta(meta);
|
||||
return item;
|
||||
}
|
||||
|
||||
private static String format(RankupPlugin plugin, String message, Player player, Rank oldRank, Rank rank) {
|
||||
MessageBuilder builder = new MessageBuilder(message);
|
||||
private static String format(RankupPlugin plugin, String message, Player player, Rank oldRank,
|
||||
Rank rank) {
|
||||
MessageBuilder builder = plugin.newMessageBuilder(message);
|
||||
if (oldRank != null && rank != null) {
|
||||
builder = builder.replaceRanks(player, oldRank, rank);
|
||||
builder = builder.replacePlayer(player).replaceOldRank(oldRank).replaceRank(rank);
|
||||
}
|
||||
return Colour.translate(plugin.replaceMoneyRequirements(builder, player, oldRank).toString());
|
||||
return builder.toString(player);
|
||||
}
|
||||
|
||||
private static void addItem(ItemStack[] items, ConfigurationSection section, ItemStack item) {
|
||||
|
||||
@@ -1,156 +1,30 @@
|
||||
package sh.okx.rankup.messages;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import me.clip.placeholderapi.PlaceholderAPI;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.entity.Player;
|
||||
import sh.okx.rankup.prestige.Prestige;
|
||||
import sh.okx.rankup.prestige.Prestiges;
|
||||
import sh.okx.rankup.ranks.Rank;
|
||||
import sh.okx.rankup.util.Colour;
|
||||
|
||||
public class MessageBuilder {
|
||||
private String message;
|
||||
public interface MessageBuilder {
|
||||
MessageBuilder replaceKey(String key, Object value);
|
||||
MessageBuilder replacePlayer(CommandSender sender);
|
||||
MessageBuilder replaceRank(Rank rank);
|
||||
MessageBuilder replaceOldRank(Rank rank);
|
||||
|
||||
public MessageBuilder(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
void send(CommandSender sender);
|
||||
void broadcast();
|
||||
|
||||
public static MessageBuilder of(ConfigurationSection config, Message message) {
|
||||
return MessageBuilder.of(config, message.getName());
|
||||
}
|
||||
String toString();
|
||||
|
||||
private static MessageBuilder of(ConfigurationSection config, String message) {
|
||||
String string = config.getString(message);
|
||||
Objects.requireNonNull(string, "Configuration message '" + message + "' not found!");
|
||||
return new MessageBuilder(Colour.translate(string));
|
||||
}
|
||||
|
||||
public MessageBuilder replace(Variable variable, Object value) {
|
||||
return replace(variable.name(), value);
|
||||
}
|
||||
|
||||
public MessageBuilder replace(String name, Object value) {
|
||||
if (value == null) {
|
||||
return this;
|
||||
}
|
||||
Pattern pattern = Pattern.compile("\\{" + name + "}", Pattern.CASE_INSENSITIVE);
|
||||
Matcher matcher = pattern.matcher(message);
|
||||
this.message = matcher.replaceAll(String.valueOf(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageBuilder replaceFirstPrestige(Rank rank, Prestiges prestiges, String with) {
|
||||
if (prestiges != null && prestiges.getFirst().equals(rank)) {
|
||||
replace(Variable.OLD_RANK, with);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public MessageBuilder replaceRanks(CommandSender player, String rankName) {
|
||||
replace(Variable.PLAYER, player.getName());
|
||||
replaceRanks(rankName);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public MessageBuilder replaceRanks(CommandSender player, Rank oldRank, String rankName) {
|
||||
replace(Variable.PLAYER, player.getName());
|
||||
replaceRanks(oldRank, rankName);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageBuilder replaceRanks(CommandSender player, Rank rank) {
|
||||
replace(Variable.PLAYER, player.getName());
|
||||
replaceRanks(rank);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageBuilder replaceRanks(CommandSender player, Rank oldRank, Rank rank) {
|
||||
replace(Variable.PLAYER, player.getName());
|
||||
replaceRanks(oldRank, rank);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public MessageBuilder replaceRanks(String rankName) {
|
||||
replace(Variable.RANK, rankName);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageBuilder replaceRanks(Rank rank) {
|
||||
replace(Variable.RANK, rank.getRank());
|
||||
replace(Variable.RANK_NAME, rank.getDisplayName());
|
||||
return this;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public MessageBuilder replaceRanks(Rank oldRank, String rankName) {
|
||||
replaceRanks(rankName);
|
||||
replace(Variable.OLD_RANK, oldRank.getRank());
|
||||
replace(Variable.OLD_RANK_NAME, oldRank.getDisplayName());
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageBuilder replaceRanks(Rank oldRank, Rank rank) {
|
||||
replaceRanks(rank);
|
||||
replace(Variable.OLD_RANK, oldRank.getRank());
|
||||
replace(Variable.OLD_RANK_NAME, oldRank.getDisplayName());
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageBuilder replaceFromTo(Rank rank) {
|
||||
if (rank instanceof Prestige) {
|
||||
Prestige prestige = (Prestige) rank;
|
||||
replace(Variable.FROM, prestige.getFrom());
|
||||
replace(Variable.TO, prestige.getTo());
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fails the MessageBuilder if the message is empty.
|
||||
* if this fails, all subsequent calls to that MessageBuilder will do nothing
|
||||
* @return a NullMessageBuilder if the message is empty, itself otherwise
|
||||
*/
|
||||
public MessageBuilder failIfEmpty() {
|
||||
return failIf(message.isEmpty());
|
||||
}
|
||||
|
||||
public MessageBuilder failIf(boolean value) {
|
||||
if (value) {
|
||||
MessageBuilder failIfEmpty();
|
||||
default MessageBuilder failIf(boolean b) {
|
||||
if (b) {
|
||||
return new NullMessageBuilder();
|
||||
} else {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
public void send(CommandSender sender) {
|
||||
String msg = message;
|
||||
if (sender instanceof Player && Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
|
||||
msg = PlaceholderAPI.setPlaceholders((Player) sender, msg);
|
||||
}
|
||||
sender.sendMessage(msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the message to all players
|
||||
* ie, calls MessageBuilder#send(Player) for all players online, and sends the message in the console.
|
||||
*/
|
||||
public void broadcast() {
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
send(player);
|
||||
}
|
||||
send(Bukkit.getConsoleSender());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return message;
|
||||
default String toString(Player player) {
|
||||
return toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,35 +1,50 @@
|
||||
package sh.okx.rankup.messages;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
import sh.okx.rankup.ranks.Rank;
|
||||
|
||||
/**
|
||||
* A no-op implementation of MessageBuilder
|
||||
*/
|
||||
public class NullMessageBuilder extends MessageBuilder {
|
||||
NullMessageBuilder() {
|
||||
super(null);
|
||||
}
|
||||
public class NullMessageBuilder implements MessageBuilder {
|
||||
|
||||
@Override
|
||||
public MessageBuilder failIf(boolean value) {
|
||||
public MessageBuilder replaceKey(String key, Object value) {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageBuilder replace(Variable variable, Object value) {
|
||||
public MessageBuilder replacePlayer(CommandSender sender) {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageBuilder replaceRank(Rank rank) {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageBuilder replaceOldRank(Rank rank) {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void send(CommandSender sender) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void broadcast() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageBuilder failIfEmpty() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
package sh.okx.rankup.messages;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import me.clip.placeholderapi.PlaceholderAPI;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.entity.Player;
|
||||
import sh.okx.rankup.prestige.Prestige;
|
||||
import sh.okx.rankup.prestige.Prestiges;
|
||||
import sh.okx.rankup.ranks.Rank;
|
||||
import sh.okx.rankup.util.Colour;
|
||||
|
||||
public class StringMessageBuilder implements MessageBuilder {
|
||||
|
||||
private String message;
|
||||
|
||||
public StringMessageBuilder(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public static StringMessageBuilder of(ConfigurationSection config, Message message) {
|
||||
return StringMessageBuilder.of(config, message.getName());
|
||||
}
|
||||
|
||||
private static StringMessageBuilder of(ConfigurationSection config, String message) {
|
||||
String string = config.getString(message);
|
||||
Objects.requireNonNull(string, "Configuration message '" + message + "' not found!");
|
||||
return new StringMessageBuilder(Colour.translate(string));
|
||||
}
|
||||
|
||||
public StringMessageBuilder replace(Variable variable, Object value) {
|
||||
return replaceKey(variable.name(), value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public StringMessageBuilder replaceKey(String name, Object value) {
|
||||
if (value == null) {
|
||||
return this;
|
||||
}
|
||||
Pattern pattern = Pattern.compile("\\{" + name + "}", Pattern.CASE_INSENSITIVE);
|
||||
Matcher matcher = pattern.matcher(message);
|
||||
this.message = matcher.replaceAll(String.valueOf(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
public StringMessageBuilder replaceFirstPrestige(Rank rank, Prestiges prestiges, String with) {
|
||||
if (prestiges != null && prestiges.getFirst().equals(rank)) {
|
||||
replace(Variable.OLD_RANK, with);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fails the MessageBuilder if the message is empty. if this fails, all subsequent calls to that
|
||||
* MessageBuilder will do nothing
|
||||
*
|
||||
* @return a NullMessageBuilder if the message is empty, itself otherwise
|
||||
*/
|
||||
public MessageBuilder failIfEmpty() {
|
||||
return failIf(message.isEmpty());
|
||||
}
|
||||
|
||||
public MessageBuilder failIf(boolean value) {
|
||||
if (value) {
|
||||
return new NullMessageBuilder();
|
||||
} else {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageBuilder replacePlayer(CommandSender sender) {
|
||||
return replace(Variable.PLAYER, sender.getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageBuilder replaceRank(Rank rank) {
|
||||
return replace(Variable.RANK, rank.getRank())
|
||||
.replace(Variable.RANK_NAME, rank.getDisplayName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageBuilder replaceOldRank(Rank rank) {
|
||||
if (rank instanceof Prestige) {
|
||||
Prestige prestige = (Prestige) rank;
|
||||
replace(Variable.FROM, prestige.getFrom());
|
||||
replace(Variable.TO, prestige.getTo());
|
||||
}
|
||||
return replace(Variable.OLD_RANK, rank.getRank())
|
||||
.replace(Variable.OLD_RANK_NAME, rank.getDisplayName());
|
||||
}
|
||||
|
||||
public void send(CommandSender sender) {
|
||||
String msg = message;
|
||||
if (sender instanceof Player && Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
|
||||
msg = PlaceholderAPI.setPlaceholders((Player) sender, msg);
|
||||
}
|
||||
sender.sendMessage(msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the message to all players ie, calls MessageBuilder#send(Player) for all players online,
|
||||
* and sends the message in the console.
|
||||
*/
|
||||
public void broadcast() {
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
send(player);
|
||||
}
|
||||
send(Bukkit.getConsoleSender());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return message;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,141 @@
|
||||
package sh.okx.rankup.messages.pebble;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import sh.okx.rankup.RankupPlugin;
|
||||
import sh.okx.rankup.messages.MessageBuilder;
|
||||
import sh.okx.rankup.messages.NullMessageBuilder;
|
||||
import sh.okx.rankup.placeholders.Placeholders;
|
||||
import sh.okx.rankup.prestige.Prestige;
|
||||
import sh.okx.rankup.ranks.Rank;
|
||||
import sh.okx.rankup.text.TextProcessor;
|
||||
import sh.okx.rankup.text.TextProcessorBuilder;
|
||||
import sh.okx.rankup.text.pebble.PebbleOptions;
|
||||
|
||||
public class PebbleMessageBuilder implements MessageBuilder {
|
||||
|
||||
private final RankupPlugin plugin;
|
||||
private final String message;
|
||||
private final Map<String, Object> context = new HashMap<>();
|
||||
private final Map<String, Function<Player, Object>> lastMinuteContext = new HashMap<>();
|
||||
|
||||
public PebbleMessageBuilder(RankupPlugin plugin, String message) {
|
||||
this.plugin = plugin;
|
||||
this.message = message;
|
||||
replaceInitial();
|
||||
}
|
||||
|
||||
private void replaceInitial() {
|
||||
Function<Player, Object> lastMinute = player -> {
|
||||
List<RankContext> ranks = new ArrayList<>();
|
||||
for (Rank rank : plugin.getRankups().getTree()) {
|
||||
ranks.add(new RankContext(plugin, player, rank));
|
||||
}
|
||||
return ranks;
|
||||
};
|
||||
lastMinuteContext.put("ranks", lastMinute);
|
||||
lastMinuteContext.put("player", HumanEntity::getName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PebbleMessageBuilder replaceKey(String key, Object value) {
|
||||
context.put(key, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PebbleMessageBuilder replacePlayer(CommandSender sender) {
|
||||
context.put("player", sender.getName());
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PebbleMessageBuilder replaceRank(Rank rank) {
|
||||
lastMinuteContext.put("next", player -> new RankContext(plugin, player, rank));
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PebbleMessageBuilder replaceOldRank(Rank rank) {
|
||||
Function<Player, Object> object;
|
||||
if (rank instanceof Prestige) {
|
||||
object = player -> new PrestigeContext(plugin, player, (Prestige) rank);
|
||||
} else {
|
||||
object = player -> new RankContext(plugin, player, rank);
|
||||
}
|
||||
lastMinuteContext.put("rank", object);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void send(CommandSender sender) {
|
||||
Player player = null;
|
||||
if (sender instanceof Player) {
|
||||
player = (Player) sender;
|
||||
}
|
||||
sender.sendMessage(processor(player).process(message));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void broadcast() {
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
send(player);
|
||||
}
|
||||
send(Bukkit.getConsoleSender());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return processor(null).process(message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(Player player) {
|
||||
return processor(player).process(message);
|
||||
}
|
||||
|
||||
private TextProcessor processor(Player player) {
|
||||
Map<String, Object> context = getContext(player);
|
||||
PebbleOptions options = getOptions();
|
||||
return new TextProcessorBuilder()
|
||||
.legacy(context, options)
|
||||
.papi(player)
|
||||
.pebble(context, options)
|
||||
.papi(player)
|
||||
.colour()
|
||||
.create();
|
||||
}
|
||||
|
||||
private Map<String, Object> getContext(Player player) {
|
||||
Map<String, Object> context = new HashMap<>(this.context);
|
||||
if (player != null) {
|
||||
for (Map.Entry<String, Function<Player, Object>> lastMinute : lastMinuteContext.entrySet()) {
|
||||
context.putIfAbsent(lastMinute.getKey(), lastMinute.getValue().apply(player));
|
||||
}
|
||||
}
|
||||
return context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageBuilder failIfEmpty() {
|
||||
if (message.isEmpty()) {
|
||||
return new NullMessageBuilder();
|
||||
} else {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
private PebbleOptions getOptions() {
|
||||
Placeholders placeholders = plugin.getPlaceholders();
|
||||
return new PebbleOptions(placeholders.getMoneyFormat(),
|
||||
placeholders.getPercentFormat(),
|
||||
placeholders.getSimpleFormat());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package sh.okx.rankup.messages.pebble;
|
||||
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import sh.okx.rankup.RankupPlugin;
|
||||
import sh.okx.rankup.prestige.Prestige;
|
||||
|
||||
public class PrestigeContext extends RankContext {
|
||||
|
||||
private final Prestige rank;
|
||||
|
||||
public PrestigeContext(RankupPlugin plugin, Player player, Prestige rank) {
|
||||
super(plugin, player, rank);
|
||||
this.rank = rank;
|
||||
}
|
||||
|
||||
public String getFrom() {
|
||||
return rank.getFrom();
|
||||
}
|
||||
|
||||
public String getTo() {
|
||||
return rank.getTo();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
package sh.okx.rankup.messages.pebble;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.bukkit.entity.Player;
|
||||
import sh.okx.rankup.RankupPlugin;
|
||||
import sh.okx.rankup.ranks.Rank;
|
||||
import sh.okx.rankup.ranks.RankTree;
|
||||
import sh.okx.rankup.requirements.Requirement;
|
||||
|
||||
public class RankContext {
|
||||
private final RankupPlugin plugin;
|
||||
private final Player player;
|
||||
private final Rank rank;
|
||||
|
||||
public RankContext(RankupPlugin plugin, Player player, Rank rank) {
|
||||
this.plugin = plugin;
|
||||
this.player = player;
|
||||
this.rank = rank;
|
||||
}
|
||||
|
||||
public String getRank() {
|
||||
return rank.getRank();
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return rank.getDisplayName();
|
||||
}
|
||||
|
||||
public RequirementContext getRequirement(String requirement) {
|
||||
return new RequirementContext(player, rank.getRequirement(player, requirement));
|
||||
}
|
||||
|
||||
public RequirementContext getRequirement(String requirement, String sub) {
|
||||
return new RequirementContext(player, rank.getRequirement(player, requirement + "#" + sub));
|
||||
}
|
||||
|
||||
public RequirementContext getReq(String requirement) {
|
||||
return getRequirement(requirement);
|
||||
}
|
||||
|
||||
public RequirementContext getReq(String requirement, String sub) {
|
||||
return getRequirement(requirement, sub);
|
||||
}
|
||||
|
||||
public List<RequirementContext> getRequirements() {
|
||||
List<RequirementContext> list = new ArrayList<>();
|
||||
for (Requirement requirement : rank.getRequirements().getRequirements(player)) {
|
||||
list.add(new RequirementContext(player, requirement));
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public boolean getDone() {
|
||||
for (RequirementContext context : getRequirements()) {
|
||||
if (!context.getDone()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public int getIndex() {
|
||||
RankTree<Rank> tree = plugin.getRankups().getTree();
|
||||
int index = 0;
|
||||
for (Rank rank : tree) {
|
||||
if (rank == this.rank) {
|
||||
return index;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return rank.getRank();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package sh.okx.rankup.messages.pebble;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import sh.okx.rankup.requirements.Requirement;
|
||||
|
||||
public class RequirementContext {
|
||||
|
||||
private final Player player;
|
||||
private final Requirement requirement;
|
||||
|
||||
public RequirementContext(Player player, Requirement requirement) {
|
||||
this.player = player;
|
||||
this.requirement = requirement;
|
||||
}
|
||||
|
||||
public double getTotal() {
|
||||
return requirement.getTotal(player);
|
||||
}
|
||||
|
||||
public boolean getDone() {
|
||||
return requirement.check(player);
|
||||
}
|
||||
|
||||
public double getRemaining() {
|
||||
return requirement.getRemaining(player);
|
||||
}
|
||||
|
||||
public double getProgress() {
|
||||
return requirement.getTotal(player) - requirement.getRemaining(player);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return requirement.getName();
|
||||
}
|
||||
|
||||
public double getPercent() {
|
||||
return getProgress() / getTotal();
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "Requirement[" + requirement.getFullName() + "]";
|
||||
}
|
||||
}
|
||||
@@ -47,19 +47,19 @@ public class RankupExpansion implements Expansion {
|
||||
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]),
|
||||
return getPlaceholderRequirement(player, rankups.getRankByName(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();
|
||||
double amount = Objects.requireNonNull(rankups.getRankByName(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]);
|
||||
Rank statusRank = rankups.getRankByName(parts[1]);
|
||||
|
||||
if (statusRank == null) {
|
||||
return null;
|
||||
|
||||
@@ -9,7 +9,7 @@ import org.bukkit.Bukkit;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.entity.Player;
|
||||
import sh.okx.rankup.RankupPlugin;
|
||||
import sh.okx.rankup.messages.MessageBuilder;
|
||||
import sh.okx.rankup.messages.pebble.PebbleMessageBuilder;
|
||||
import sh.okx.rankup.ranks.Rank;
|
||||
import sh.okx.rankup.ranks.requirements.ListRankRequirements;
|
||||
import sh.okx.rankup.ranks.requirements.RankRequirements;
|
||||
@@ -45,9 +45,10 @@ public class Prestige extends Rank {
|
||||
@Override
|
||||
public void runCommands(Player player, Rank next) {
|
||||
for (String command : commands) {
|
||||
String string = new MessageBuilder(command)
|
||||
.replaceRanks(player, this, next)
|
||||
.replaceFromTo(this)
|
||||
String string = new PebbleMessageBuilder(this.plugin, command)
|
||||
.replacePlayer(player)
|
||||
.replaceOldRank(this)
|
||||
.replaceRank(next)
|
||||
.toString();
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
|
||||
string = PlaceholderAPI.setPlaceholders(player, string);
|
||||
|
||||
@@ -1,20 +1,17 @@
|
||||
package sh.okx.rankup.ranks;
|
||||
|
||||
import java.util.List;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import me.clip.placeholderapi.PlaceholderAPI;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.entity.Player;
|
||||
import sh.okx.rankup.RankupPlugin;
|
||||
import sh.okx.rankup.messages.MessageBuilder;
|
||||
import sh.okx.rankup.ranks.requirements.RankRequirements;
|
||||
import sh.okx.rankup.requirements.Requirement;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@EqualsAndHashCode
|
||||
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
|
||||
public class Rank {
|
||||
@@ -50,10 +47,7 @@ public class Rank {
|
||||
|
||||
public void runCommands(Player player, Rank next) {
|
||||
for (String command : commands) {
|
||||
String string = new MessageBuilder(command).replaceRanks(player, this, next).toString();
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
|
||||
string = PlaceholderAPI.setPlaceholders(player, string);
|
||||
}
|
||||
String string = plugin.newMessageBuilder(command).replacePlayer(player).replaceOldRank(this).replaceRank(next).toString(player);
|
||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), string);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ public abstract class RankList<T extends Rank> {
|
||||
return tree.getFirst().getRank();
|
||||
}
|
||||
|
||||
public T getByName(String name) {
|
||||
public T getRankByName(String name) {
|
||||
if (name == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -103,6 +103,20 @@ public abstract class RankList<T extends Rank> {
|
||||
return null;
|
||||
}
|
||||
|
||||
public RankElement<T> getByName(String name) {
|
||||
if (name == null) {
|
||||
return null;
|
||||
}
|
||||
List<RankElement<T>> rankElements = tree.asList();
|
||||
for (RankElement<T> rank : rankElements) {
|
||||
if (name.equalsIgnoreCase(rank.getRank().getRank())) {
|
||||
return rank;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public RankElement<T> getByPlayer(Player player) {
|
||||
List<RankElement<T>> list = tree.asList();
|
||||
Collections.reverse(list);
|
||||
|
||||
@@ -2,10 +2,9 @@ package sh.okx.rankup.requirements.requirement.mcmmo;
|
||||
|
||||
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.util.player.UserManager;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
/**
|
||||
* Because mcMMO like changing the name of their skill types.
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
package sh.okx.rankup.text;
|
||||
|
||||
public class ChainedTextProcessor implements TextProcessor {
|
||||
private final TextProcessor[] processors;
|
||||
|
||||
public ChainedTextProcessor(TextProcessor... processors) {
|
||||
this.processors = processors;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String process(String string) {
|
||||
for (TextProcessor processor : processors) {
|
||||
string = processor.process(string);
|
||||
}
|
||||
return string;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package sh.okx.rankup.text;
|
||||
|
||||
import sh.okx.rankup.util.Colour;
|
||||
|
||||
public class ColourTextProcessor implements TextProcessor {
|
||||
|
||||
@Override
|
||||
public String process(String string) {
|
||||
return Colour.translate(string);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
package sh.okx.rankup.text;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import sh.okx.rankup.messages.pebble.RankContext;
|
||||
import sh.okx.rankup.text.pebble.PebbleOptions;
|
||||
|
||||
public class LegacyTextProcessor implements TextProcessor {
|
||||
|
||||
private final Map<String, Object> pebbleContext;
|
||||
private final PebbleOptions options;
|
||||
|
||||
public LegacyTextProcessor(Map<String, Object> pebbleContext, PebbleOptions options) {
|
||||
this.pebbleContext = pebbleContext;
|
||||
this.options = options;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String process(String string) {
|
||||
StringBuilder output = new StringBuilder();
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
boolean isPlaceholder = false;
|
||||
|
||||
char[] chars = string.toCharArray();
|
||||
for (int i = 0; i < chars.length; i++) {
|
||||
char c = chars[i];
|
||||
if (c == '{') {
|
||||
if (i + 1 < chars.length) {
|
||||
if (chars[i + 1] != '{') {
|
||||
isPlaceholder = true;
|
||||
} else {
|
||||
output.append(c).append(chars[i + 1]);
|
||||
i++;
|
||||
}
|
||||
} else {
|
||||
output.append(c);
|
||||
}
|
||||
} else if (c == '}' && isPlaceholder) {
|
||||
output.append(replacePlaceholder(buffer.toString()));
|
||||
buffer.delete(0, buffer.length());
|
||||
isPlaceholder = false;
|
||||
} else if (isPlaceholder) {
|
||||
buffer.append(c);
|
||||
} else {
|
||||
output.append(c);
|
||||
}
|
||||
}
|
||||
|
||||
return output.toString();
|
||||
}
|
||||
|
||||
private String replacePlaceholder(String p) {
|
||||
if ("player".equalsIgnoreCase(p)) {
|
||||
return get("player", p);
|
||||
} else if ("old_rank".equalsIgnoreCase(p)) {
|
||||
return get("rank", p, o -> ((RankContext) o).getRank());
|
||||
} else if ("rank".equalsIgnoreCase(p)) {
|
||||
return get("next", p, o -> ((RankContext) o).getRank());
|
||||
} else if ("old_rank_name".equalsIgnoreCase(p)) {
|
||||
return get("rank", p, o -> ((RankContext) o).getName());
|
||||
} else if ("rank_name".equalsIgnoreCase(p)) {
|
||||
return get("next", p, o -> ((RankContext) o).getName());
|
||||
} else if ("money".equalsIgnoreCase(p)) {
|
||||
return get("rank", p, o -> this.options.getMoneyFormat().format(
|
||||
((RankContext) o).getReq("money").getTotal()));
|
||||
} else if ("money_needed".equalsIgnoreCase(p)) {
|
||||
return get("rank", p, o -> this.options.getMoneyFormat().format(
|
||||
((RankContext) o).getReq("money").getRemaining()));
|
||||
} else if (p.toLowerCase().startsWith("amount ")) {
|
||||
String requirement = p.substring("amount ".length());
|
||||
return get("rank", p, o -> this.options.getSimpleFormat()
|
||||
.format(((RankContext) o).getReq(requirement).getTotal()));
|
||||
} else if (p.toLowerCase().startsWith("amount_done ")) {
|
||||
String requirement = p.substring("amount_done ".length());
|
||||
return get("rank", p, o -> this.options.getSimpleFormat()
|
||||
.format(((RankContext) o).getReq(requirement).getProgress()));
|
||||
} else if (p.toLowerCase().startsWith("amount_needed ")) {
|
||||
String requirement = p.substring("amount_needed ".length());
|
||||
return get("rank", p, o -> this.options.getSimpleFormat()
|
||||
.format(((RankContext) o).getReq(requirement).getRemaining()));
|
||||
} else if (p.toLowerCase().startsWith("percent_done ")) {
|
||||
String requirement = p.substring("percent_done ".length());
|
||||
return get("rank", p, o -> this.options.getPercentFormat()
|
||||
.format(((RankContext) o).getReq(requirement).getPercent() * 100));
|
||||
} else if (p.toLowerCase().startsWith("percent_left ")) {
|
||||
String requirement = p.substring("percent_left ".length());
|
||||
return get("rank", p, o -> this.options.getPercentFormat()
|
||||
.format(100 - ((RankContext) o).getReq(requirement).getPercent() * 100));
|
||||
}
|
||||
|
||||
return get(p, "{" + p + "}");
|
||||
}
|
||||
|
||||
private String get(String key, String def) {
|
||||
return get(key, def, String::valueOf);
|
||||
}
|
||||
|
||||
private String get(String key, String def, Function<Object, String> mapper) {
|
||||
Object val = pebbleContext.get(key);
|
||||
if (val == null) {
|
||||
return def;
|
||||
} else {
|
||||
return mapper.apply(val);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package sh.okx.rankup.text;
|
||||
|
||||
import me.clip.placeholderapi.PlaceholderAPI;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PlaceholderApiTextProcessor implements TextProcessor {
|
||||
|
||||
private final Player player;
|
||||
|
||||
public PlaceholderApiTextProcessor(Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String process(String string) {
|
||||
if (player == null || !Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
|
||||
return string;
|
||||
} else {
|
||||
return PlaceholderAPI.setPlaceholders(player, string);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package sh.okx.rankup.text;
|
||||
|
||||
public interface TextProcessor {
|
||||
String process(String string);
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package sh.okx.rankup.text;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import sh.okx.rankup.text.pebble.PebbleOptions;
|
||||
import sh.okx.rankup.text.pebble.PebbleTextProcessor;
|
||||
|
||||
public class TextProcessorBuilder {
|
||||
|
||||
private final List<TextProcessor> processors = new ArrayList<>();
|
||||
|
||||
public TextProcessorBuilder colour() {
|
||||
processors.add(new ColourTextProcessor());
|
||||
return this;
|
||||
}
|
||||
|
||||
public TextProcessorBuilder pebble(Map<String, Object> context, PebbleOptions options) {
|
||||
processors.add(new PebbleTextProcessor(context, options));
|
||||
return this;
|
||||
}
|
||||
|
||||
public TextProcessorBuilder papi(@Nullable Player player) {
|
||||
processors.add(new PlaceholderApiTextProcessor(player));
|
||||
return this;
|
||||
}
|
||||
|
||||
public TextProcessorBuilder legacy(Map<String, Object> context, PebbleOptions options) {
|
||||
processors.add(new LegacyTextProcessor(context, options));
|
||||
return this;
|
||||
}
|
||||
|
||||
public TextProcessor create() {
|
||||
return new ChainedTextProcessor(processors.toArray(new TextProcessor[0]));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package sh.okx.rankup.text.pebble;
|
||||
|
||||
import com.mitchellbosecke.pebble.error.PebbleException;
|
||||
import com.mitchellbosecke.pebble.extension.Filter;
|
||||
import com.mitchellbosecke.pebble.template.EvaluationContext;
|
||||
import com.mitchellbosecke.pebble.template.PebbleTemplate;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class DecimalFormatFilter implements Filter {
|
||||
|
||||
private final DecimalFormat format;
|
||||
|
||||
public DecimalFormatFilter(DecimalFormat format) {
|
||||
this.format = format;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getArgumentNames() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object apply(Object input, Map<String, Object> args, PebbleTemplate self,
|
||||
EvaluationContext context, int lineNumber) throws PebbleException {
|
||||
if (input == null) {
|
||||
return null;
|
||||
}
|
||||
if (!(input instanceof Number)) {
|
||||
throw new PebbleException(null, "The input for the 'DecimalFormatFilter' filter has to be a number.",
|
||||
lineNumber, self.getName());
|
||||
}
|
||||
|
||||
Number number = (Number) input;
|
||||
return this.format.format(number);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package sh.okx.rankup.text.pebble;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class PebbleOptions {
|
||||
private final DecimalFormat moneyFormat;
|
||||
private final DecimalFormat percentFormat;
|
||||
private final DecimalFormat simpleFormat;
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package sh.okx.rankup.text.pebble;
|
||||
|
||||
import com.mitchellbosecke.pebble.PebbleEngine;
|
||||
import com.mitchellbosecke.pebble.extension.AbstractExtension;
|
||||
import com.mitchellbosecke.pebble.extension.Filter;
|
||||
import com.mitchellbosecke.pebble.loader.StringLoader;
|
||||
import java.io.IOException;
|
||||
import java.io.StringWriter;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import sh.okx.rankup.text.TextProcessor;
|
||||
|
||||
public class PebbleTextProcessor implements TextProcessor {
|
||||
|
||||
private final Map<String, Object> context;
|
||||
private final PebbleOptions options;
|
||||
|
||||
public PebbleTextProcessor(Map<String, Object> context, PebbleOptions options) {
|
||||
this.context = context;
|
||||
this.options = options;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String process(String string) {
|
||||
PebbleEngine engine = new PebbleEngine.Builder().autoEscaping(false).extension(
|
||||
new AbstractExtension() {
|
||||
@Override
|
||||
public Map<String, Filter> getFilters() {
|
||||
Map<String, Filter> filters = new HashMap<>();
|
||||
if (options != null) {
|
||||
DecimalFormat moneyFormat = options.getMoneyFormat();
|
||||
if (moneyFormat != null) filters.put("money", new DecimalFormatFilter(moneyFormat));
|
||||
|
||||
DecimalFormat percentFormat = options.getPercentFormat();
|
||||
if (percentFormat != null) filters.put("percent", new DecimalFormatFilter(percentFormat));
|
||||
|
||||
DecimalFormat simpleFormat = options.getSimpleFormat();
|
||||
if (simpleFormat != null) filters.put("simple", new DecimalFormatFilter(simpleFormat));
|
||||
}
|
||||
return filters;
|
||||
}
|
||||
})
|
||||
.loader(new StringLoader()).build();
|
||||
StringWriter writer = new StringWriter();
|
||||
try {
|
||||
engine.getTemplate(string).evaluate(writer, context);
|
||||
return writer.toString();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return string;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user