diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java index d67e8d9c6fb..3a1971a9973 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java @@ -5,6 +5,7 @@ import com.earth2me.essentials.textreader.TextInput; import com.earth2me.essentials.textreader.TextPager; import com.earth2me.essentials.utils.DateUtil; +import com.earth2me.essentials.utils.FormatUtil; import com.earth2me.essentials.utils.LocationUtil; import net.ess3.api.IEssentials; import net.ess3.nms.refl.ReflUtil; @@ -152,7 +153,12 @@ public void onPlayerQuit(final PlayerQuitEvent event) { event.setQuitMessage(null); } else if (ess.getSettings().isCustomQuitMessage() && event.getQuitMessage() != null) { final Player player = event.getPlayer(); - event.setQuitMessage(ess.getSettings().getCustomQuitMessage().replace("{PLAYER}", player.getDisplayName()).replace("{USERNAME}", player.getName())); + String quitMessage = ess.getSettings().getCustomQuitMessage() + .replace("{PLAYER}", player.getDisplayName()) + .replace("{USERNAME}", player.getName()); + //Untested, should work tho + quitMessage = FormatUtil.placeholderAPIFormat(user, quitMessage); + event.setQuitMessage(quitMessage); } user.startTransaction(); @@ -256,9 +262,11 @@ public void run() { } else if (message == null) { //NOOP } else if (ess.getSettings().isCustomJoinMessage()) { + //Untested, should work tho String msg = ess.getSettings().getCustomJoinMessage() .replace("{PLAYER}", player.getDisplayName()).replace("{USERNAME}", player.getName()) .replace("{UNIQUE}", NumberFormat.getInstance().format(ess.getUserMap().getUniqueUsers())); + msg = FormatUtil.placeholderAPIFormat(player, msg); ess.getServer().broadcastMessage(msg); } else if (ess.getSettings().allowSilentJoinQuit()) { ess.getServer().broadcastMessage(message); diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java index d7543cdc8d5..1499b83bd5d 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java @@ -1,7 +1,9 @@ package com.earth2me.essentials; import com.earth2me.essentials.register.payment.Methods; +import com.earth2me.essentials.utils.FormatUtil; import net.ess3.api.IEssentials; +import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -29,6 +31,10 @@ public void onPluginEnable(final PluginEnableEvent event) { if (!Methods.hasMethod() && Methods.setMethod(ess.getServer().getPluginManager())) { ess.getLogger().log(Level.INFO, "Payment method found (" + Methods.getMethod().getLongName() + " version: " + ess.getPaymentMethod().getMethod().getVersion() + ")"); } + + if((FormatUtil.papiEnabled == null || !FormatUtil.papiEnabled) && event.getPlugin().getName().equals("PlaceholderAPI")) { + FormatUtil.papiEnabled = true; + } } @EventHandler(priority = EventPriority.MONITOR) @@ -42,6 +48,10 @@ public void onPluginDisable(final PluginDisableEvent event) { Methods.reset(); ess.getLogger().log(Level.INFO, "Payment method was disabled. No longer accepting payments."); } + + if(FormatUtil.papiEnabled != null && FormatUtil.papiEnabled && event.getPlugin().getName().equals("PlaceholderAPI")){ + FormatUtil.papiEnabled = false; + } } @Override diff --git a/Essentials/src/com/earth2me/essentials/User.java b/Essentials/src/com/earth2me/essentials/User.java index f6f502b172a..51295378071 100644 --- a/Essentials/src/com/earth2me/essentials/User.java +++ b/Essentials/src/com/earth2me/essentials/User.java @@ -784,6 +784,7 @@ public void setRecipeSee(boolean recipeSee) { @Override public void sendMessage(String message) { if (!message.isEmpty()) { + message = FormatUtil.placeholderAPIFormat(this, message); base.sendMessage(message); } } diff --git a/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java b/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java index 2a1ed4caee2..7f1cf87e7c2 100644 --- a/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java +++ b/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java @@ -6,6 +6,7 @@ import com.earth2me.essentials.User; import com.earth2me.essentials.utils.DateUtil; import com.earth2me.essentials.utils.DescParseTickFormat; +import com.earth2me.essentials.utils.FormatUtil; import com.earth2me.essentials.utils.NumberUtil; import net.ess3.api.IEssentials; import org.bukkit.Location; @@ -74,6 +75,7 @@ private void replaceKeywords(final CommandSource sender) { for (int i = 0; i < input.getLines().size(); i++) { String line = input.getLines().get(i); + line = FormatUtil.placeholderAPIFormat(user, line); final Matcher matcher = KEYWORD.matcher(line); while (matcher.find()) { diff --git a/Essentials/src/com/earth2me/essentials/utils/FormatUtil.java b/Essentials/src/com/earth2me/essentials/utils/FormatUtil.java index 7de0a472688..1fdb725d5a6 100644 --- a/Essentials/src/com/earth2me/essentials/utils/FormatUtil.java +++ b/Essentials/src/com/earth2me/essentials/utils/FormatUtil.java @@ -1,7 +1,10 @@ package com.earth2me.essentials.utils; +import me.clip.placeholderapi.PlaceholderAPI; import net.ess3.api.IUser; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.entity.Player; import java.util.regex.Pattern; @@ -22,6 +25,9 @@ public class FormatUtil { static final transient Pattern URL_PATTERN = Pattern.compile("((?:(?:https?)://)?[\\w-_\\.]{2,})\\.([a-zA-Z]{2,3}(?:/\\S+)?)"); public static final Pattern IPPATTERN = Pattern.compile("^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"); + //If we are going to make this static, should we move it? + public static Boolean papiEnabled = null; + //This method is used to simply strip the native minecraft colour codes public static String stripFormat(final String input) { if (input == null) { @@ -38,6 +44,28 @@ public static String stripEssentialsFormat(final String input) { return stripColor(input, REPLACE_ALL_PATTERN); } + public static String placeholderAPIFormat(final IUser user, final String input) { + return placeholderAPIFormat(user.getBase(), input); + } + + //Formatting PlaceholderAPI Placeholders, returns the original string if the plugin isn't enabled + //Seperate this from #getChatFormat() in ISettings due to the requirement of Player as an argument + public static String placeholderAPIFormat(final Player player, final String input) { + if (input == null) { + return null; + } + + if (papiEnabled == null) { + papiEnabled = Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI"); + } + + //Checking here instead, please tell me if there is a better way + if (papiEnabled) { + return PlaceholderAPI.setPlaceholders(player, input); + } + return input; + } + //This is the general permission sensitive message format function, checks for urls. public static String formatMessage(final IUser user, final String permBase, final String input) { if (input == null) { diff --git a/Essentials/src/plugin.yml b/Essentials/src/plugin.yml index 6012c572722..e7fdba30cf6 100644 --- a/Essentials/src/plugin.yml +++ b/Essentials/src/plugin.yml @@ -5,7 +5,7 @@ main: com.earth2me.essentials.Essentials version: ${full.version} website: http://tiny.cc/EssentialsCommands description: Provides an essential, core set of commands for Bukkit. -softdepend: [Vault] +softdepend: [Vault, PlaceholderAPI] authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, md_5, Iaccidentally, drtshock, vemacs, SupaHam, md678685] commands: afk: diff --git a/Essentials/test/com/earth2me/essentials/FakeServer.java b/Essentials/test/com/earth2me/essentials/FakeServer.java index 41d50879d7d..7d53a3dccc5 100644 --- a/Essentials/test/com/earth2me/essentials/FakeServer.java +++ b/Essentials/test/com/earth2me/essentials/FakeServer.java @@ -989,7 +989,7 @@ public Plugin[] getPlugins() { @Override public boolean isPluginEnabled(String name) { - throw new UnsupportedOperationException("Not supported yet."); + return name.equals("Essentials"); } @Override diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java index 95284e5c965..20d904b76e0 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java @@ -3,6 +3,7 @@ import com.earth2me.essentials.User; import com.earth2me.essentials.utils.FormatUtil; import net.ess3.api.IEssentials; +import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -57,6 +58,8 @@ public void onPlayerChat(final AsyncPlayerChatEvent event) { format = format.replace("{5}", team == null ? "" : team.getDisplayName()); format = format.replace("{6}", prefix); format = format.replace("{7}", suffix); + format = FormatUtil.placeholderAPIFormat(user, format); + synchronized (format) { event.setFormat(format); } diff --git a/EssentialsChat/src/plugin.yml b/EssentialsChat/src/plugin.yml index 5f855228b0e..09249aaa4d1 100644 --- a/EssentialsChat/src/plugin.yml +++ b/EssentialsChat/src/plugin.yml @@ -7,4 +7,4 @@ website: http://tiny.cc/EssentialsCommands description: Provides chat control features for Essentials. Requires Permissions. authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, md_5, Okamosy, Iaccidentally] depend: [Essentials] -#softdepend: [Factions] +softdepend: [PlaceholderAPI] diff --git a/pom.xml b/pom.xml index 3efbf97d14e..14250c2a433 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,10 @@ bukkit-repo https://hub.spigotmc.org/nexus/content/groups/public/ + + placeholderapi + http://repo.extendedclip.com/content/repositories/placeholderapi/ + @@ -68,6 +72,12 @@ 1.12.2 provided + + me.clip + placeholderapi + LATEST + provided +