Compare commits

..

56 Commits

Author SHA1 Message Date
extendedclip
2c15b4dfcf Update to 2.10.0 2019-05-04 00:19:29 -04:00
darbyjack
b943c6fd21 Added support for 1.14 NMS for expansions to hook into 2019-05-03 22:51:34 -05:00
extendedclip
15b142ed64 Remove unused imports 2019-05-03 23:48:00 -04:00
extendedclip
b2a488c694 Sort expansions alphabetically without errors Fixes #102 2019-05-03 23:44:51 -04:00
Funnycube
8447395c7b As per request, daddy has been removed.
Rip Daddy,
2018 - 2019
"Bastards"
2019-04-29 16:36:08 +10:00
darbyjack
0ad11cd755 Push to 1.14-R0.1-SNAPSHOT 2019-04-27 22:08:57 -05:00
Mitchell Cook
29c61373b0 Implementing #93 (#94)
Testing required before PR.
2019-04-13 16:34:03 -04:00
Andre_601
e53cad219e Changed "being made" to "to be made" 2019-01-26 17:54:41 +01:00
Glare Masters
c7d05eff24 Merge pull request #63 from Andre601/master
Adding issue templates and updating readme.md
2019-01-22 11:20:21 -06:00
Andre_601
540a0952e7 "changes being made" sounds better imo 2019-01-22 16:18:00 +01:00
Andre_601
cef0a203dc Links can be made like that 2019-01-22 16:10:52 +01:00
Andre_601
8f1ba895b2 Updating links 2019-01-02 18:08:39 +01:00
Andre_601
4d570aa526 Update bug_report.md 2019-01-02 18:03:24 +01:00
Andre_601
4c127f325b Update feature_request.md 2019-01-02 18:02:05 +01:00
Andre_601
71f5e11b03 Update bug_report.md 2019-01-02 17:59:00 +01:00
Andre_601
1129f3d902 Update change_request.md 2019-01-02 17:58:09 +01:00
Andre_601
84a8029d7d Create bug_report.md 2019-01-02 17:52:09 +01:00
Andre_601
dd6d90dbb6 Create change_request.md 2019-01-02 17:04:29 +01:00
Andre_601
0df9eeb2cc Create feature_request.md 2019-01-02 17:04:04 +01:00
Ryan
05ce2fb5bf Merge pull request #61 from Phoenix616/patch-1
Load at startup
2018-12-27 09:14:31 -05:00
Max Lee
cb7fbb7820 Load at startup
By default plugins are loaded later. (post world) This complicates hooking into PlaceholderAPI from other plugins that load directly at startup as PlaceholderAPI isn't available yet at that point.
2018-12-27 13:56:09 +01:00
darbyjack
ce5bb28247 Push to 1.13.2 2018-10-22 22:02:50 -05:00
darbyjack
639b7967e3 Refresh on download to fix the gold bug 2018-10-20 15:43:38 -05:00
darbyjack
90bc3c8da1 Fixed a bug in /papi installed 2018-10-20 15:30:10 -05:00
darbyjack
556faf4290 Changed the Discord Link 2018-10-18 23:06:52 -05:00
darbyjack
4af2a1c7be Update to 2.9.2-DEV and add in more info when typing /papi 2018-10-17 02:53:39 -05:00
Glare Masters
6ff7be5d64 Merge pull request #46 from Sxtanna/master
Changed to be slightly less trash
2018-10-17 02:22:11 -05:00
Sxtanna
80c6a6d377 This class was trash 2018-10-12 12:43:57 -04:00
Ranald
27f8586d76 Merge pull request #2 from PlaceholderAPI/master
Update
2018-10-12 11:31:47 -04:00
extendedclip
d0b4669d1f Update to 2.9.2 release 2018-08-27 00:08:16 -04:00
extendedclip
c205a9a1b9 Just make the damn directory 2018-08-27 00:05:51 -04:00
extendedclip
ce1ca35ee5 Merge branch 'master' of https://github.com/PlaceholderAPI/PlaceholderAPI 2018-08-26 23:57:28 -04:00
extendedclip
0bfd42d607 Set 1.13.1 Spigot API as dependency, Shade and relocate GSON 2018-08-26 23:56:37 -04:00
extendedclip
197aa5dfe0 Added 1.13 R2 NMS to the enum 2018-08-26 22:58:02 -04:00
darbyjack
efa97ce049 Undone for time being 2018-08-26 14:46:05 -05:00
darbyjack
e2423cdd70 Added support to versions less than 1.8.3 2018-08-26 14:37:17 -05:00
Ranald
0d30c8ac50 Merge pull request #1 from PlaceholderAPI/master
daddy
2018-08-26 15:08:23 -04:00
extendedclip
589712f7e4 daddy 2018-08-10 23:32:07 -04:00
extendedclip
dd5ec37055 try with resources cuz haters 2018-07-22 16:52:36 -04:00
extendedclip
49eceaae50 Use 1.13 spigot-api 2018-07-22 16:52:12 -04:00
extendedclip
7ea2bd94a7 Do not deprecate legacy setPlaceholder methods for now 2018-07-21 22:00:33 -04:00
extendedclip
736b8ada3d Add v1_13_R1 to the NMSVersion enum 2018-07-21 21:59:02 -04:00
extendedclip
d08de32852 Add api-version entry for 1.13 2018-07-21 21:58:26 -04:00
Ryan
83e64ee883 Merge pull request #33 from Mishyy/master
Bug fixes, and cosmetic modifications.
2018-07-16 04:06:26 -04:00
Mitchell Cook
27ca32b14c Updated .gitignore to ignore .iml project files. 2018-07-16 18:01:40 +10:00
Mitchell Cook
838f947a05 Resolve expansion loading bug. 2018-07-16 17:50:12 +10:00
Mitchell Cook
efc6a6337b Added compareTo method for easier comparison in expasions. 2018-07-16 17:50:12 +10:00
Mitchell Cook
9cc5a9678f Reformatted project to conform to google style guide. 2018-07-16 17:50:07 +10:00
extendedclip
bc915af13e Added subcommand to register an expansion by specifying the name of the file, or unregistering by specifying the name of the expansion. 2018-06-29 15:03:53 -04:00
extendedclip
43b8013c29 Added method to register expansion by specifying the file name 2018-06-29 15:02:05 -04:00
extendedclip
adca215ea7 Added method to get all class files of a certain type from a specific jar 2018-06-29 14:40:48 -04:00
extendedclip
d0445e231d Added register/unregister perm, removed injector perms 2018-06-29 14:34:25 -04:00
extendedclip
be96238800 Added ability to use parse subcommand from console when targeting a player, Added ability to broadcast a parse message with bcparse subcommand 2018-06-16 20:05:12 -04:00
extendedclip
0f51b4f2a5 Added broadcast method 2018-06-16 19:57:22 -04:00
extendedclip
287ab16d3a Set version for 2.9.1 dev builds 2018-06-14 15:21:18 -04:00
extendedclip
e4a672e57e Require a player be specified when using /papi parse command 2018-06-14 15:17:46 -04:00
36 changed files with 2303 additions and 2077 deletions

38
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,38 @@
---
name: Bug Report
about: Found a bug with PlaceholderAPI? Report it through this form!
---
[New placeholders/plugin]: https://github.com/PlaceholderAPI/PlaceholderAPI/issues/new?template=feature_request.md
[Request change]: https://github.com/PlaceholderAPI/PlaceholderAPI/issues/new?template=change_request.md
[Spigot page]: https://www.spigotmc.org/resources/6245/
[Jenkins page]: http://ci.extendedclip.com/job/PlaceholderAPI/
[issue]: https://github.com/PlaceholderAPI/PlaceholderAPI/issues
### Notes
This template is for **reporting a bug** and not for requesting changes to the wiki!
If you want your placeholders added or updated, use the [New placeholders/plugin] or [Request change] template.
Also make sure, that you use the latest version of PlaceholderAPI from either the [Spigot page] or the [Jenkins page] and that your
issue isn't already listed in the [issue] page.
### Issue
> What is the issue? Describe it like you would tell a friend.
<!-- Please type below this like -->
### Expected behaviour
> What should PlaceholderAPI do?
<!-- Please type below this like -->
### Actual behaviour
> What does PlaceholderAPI actually do?
<!-- Please type below this like -->
### How to reproduce
> What steps did you made, to get this bug?
<!-- Please type below this like -->
1.

View File

@@ -0,0 +1,36 @@
---
name: Request change
about: Request a update/change of a wiki-page
---
[New placeholders/plugin]: https://github.com/PlaceholderAPI/PlaceholderAPI/issues/new?template=feature_request.md
[Bug report]: https://github.com/PlaceholderAPI/PlaceholderAPI/issues/new?template=bug_report.md
[issues]: https://github.com/PlaceholderAPI/PlaceholderAPI/issues
[wiki]: https://github.com/PlaceholderAPI/PlaceholderAPI/wiki
### Notes
This template is for **requesting changes to the wiki** and not for reporting bugs or requesting additions for the wiki!
If you want your placeholders added, use the [New placeholders/plugin] template.
For bug reports, use the [Bug report] template.
Also make sure, that your requested change isn't already made in the [wiki] or listed in the [issues] page.
### Type
> What kind of change is it? (Multiple selections possible)
<!-- Please select the right one, by changing the [ ] to [x] -->
- [ ] Placeholder(s) changed.
- [ ] New placeholder(s).
- [ ] Plugin no longer supports PlaceholderAPI and/or was deleted.
### Plugin
> What is the name of the plugin?
<!-- Please type below this line -->
### What is the new value?
> **Placeholder(s) changed**: Type what the old and the new placeholder(s) is/are.
> **New Placeholder(s)**: Type the new placeholder(s).
> **Plugin no longer supports PlaceholderAPI**: Leave this blank.
<!-- Please type below this line -->

View File

@@ -0,0 +1,35 @@
---
name: New placeholders/plugin
about: Do you have a plugin that supports and/or adds placeholders from/to PlaceholderAPI and that isn't on the wiki? Use this template!
---
[Request change]: https://github.com/PlaceholderAPI/PlaceholderAPI/issues/new?template=change_request.md
[Bug report]: https://github.com/PlaceholderAPI/PlaceholderAPI/issues/new?template=bug_report.md
[issues]: https://github.com/PlaceholderAPI/PlaceholderAPI/issues
[wiki]: https://github.com/PlaceholderAPI/PlaceholderAPI/wiki
### Notes
This template is for **requesting additions for the wiki** and not for reporting bugs or requesting changes for the wiki!
If you want changes to be made to the wiki, use the [Request change] template.
For bug reports, use the [Bug report] template.
Also make sure, that your requested placeholders/plugin isn't already added in the [wiki] or listed in the [issues] page.
### Type
> What kind of request is this? (Multiple selections possible)
<!-- Select the right option by replacing [ ] with [x] -->
<!-- For an update of an already listed plugin, use the "Request change" template -->
- [ ] New expansion providing placeholders.
- [ ] New plugin providing placeholders.
- [ ] New plugin supporting PlaceholderAPI.
### Plugin
> What is the name of the plugin/expansion?
> Provide also a link to it.
<!-- Please type below this line -->
### Placeholders/others
> What are the new placeholders/Any additional info?
<!-- Please type below this line -->

2
.gitignore vendored
View File

@@ -114,7 +114,7 @@ fabric.properties
### Intellij Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
# *.iml
*.iml
# modules.xml
# .idea/misc.xml
# *.ipr

View File

@@ -1,6 +1,26 @@
[![PlaceholderAPI Logo](https://i.imgur.com/Ea4PURv.png)][spigot]
[issues]: https://github.com/PlaceholderAPI/PlaceholderAPI/issues
[licenseImg]: https://img.shields.io/github/license/PlaceholderAPI/PlaceholderAPI.svg
[license]: https://github.com/PlaceholderAPI/PlaceholderAPI/blob/master/LICENSE
[![Build Status](http://ci.extendedclip.com/buildStatus/icon?job=PlaceholderAPI)][ci]
[releaseImg]: https://img.shields.io/github/release/PlaceholderAPI/PlaceholderAPI.svg?label=github%20release
[release]: https://github.com/PlaceholderAPI/PlaceholderAPI/releases/latest
[discord]: https://helpch.at/discord
[spigot]: https://www.spigotmc.org/resources/6245/
[Expansions cloud]: https://api.extendedclip.com/home
[placeholder list]: https://helpch.at/placeholders
[statistics]: https://bstats.org/plugin/bukkit/PlaceholderAPI
[ci]: http://ci.extendedclip.com/job/PlaceholderAPI/
[ciImg]: http://ci.extendedclip.com/buildStatus/icon?job=PlaceholderAPI
[APIversionImg]: https://img.shields.io/nexus/r/http/repo.extendedclip.com/me.clip/placeholderapi.svg?label=API-Version
[logo]: https://i.imgur.com/Ea4PURv.png
<!-- The stuff above isn't visible in the readme -->
[![logo]][spigot]
[![ciImg]][ci] [![releaseImg]][release] ![APIversionImg] [![licenseImg]][license]
# Information
[PlaceholderAPI][spigot] is a plugin for Spigot servers that allows server owners to display information from various plugins with a uniform format.
@@ -18,20 +38,7 @@ PlaceholderAPI has been downloaded over 100,000 times and has been used concurre
## Quick Links
- [CI Server][ci]
- [Expansions Website][expansions]
- [Placeholder List][placeholder-list]
- [Expansions cloud]
- [Placeholder List]
- [Spigot Page][spigot]
- [Plugin Statistics][statistics]
## License
PlaceholderAPI is licensed under the __GNU GPLv3__ license. Refer to the [LICENSE](LICENSE) file for more information.
<!-- Page Links - Placed here to be easier to change later on. -->
[issues]: https://github.com/PlaceholderAPI/PlaceholderAPI/issues
[discord]: https://discord.gg/7sndK3q
[spigot]: https://www.spigotmc.org/resources/placeholderapi.6245/
[ci]: http://ci.extendedclip.com/job/PlaceholderAPI/
[expansions]: https://api.extendedclip.com/all/
[placeholder-list]: https://www.spigotmc.org/wiki/placeholderapi-placeholders/
[statistics]: https://bstats.org/plugin/bukkit/PlaceholderAPI

17
pom.xml
View File

@@ -1,10 +1,12 @@
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.9.1</version>
<version>2.10.0</version>
<name>PlaceholderAPI</name>
<description>An awesome placeholder provider!</description>
<url>http://extendedclip.com</url>
@@ -32,8 +34,13 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.12.2-R0.1-SNAPSHOT</version>
<version>1.14-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>org.bstats</groupId>
@@ -92,6 +99,10 @@
<pattern>me.rayzr522</pattern>
<shadedPattern>me.clip.placeholderapi.util</shadedPattern>
</relocation>
<relocation>
<pattern>com.google.code.gson</pattern>
<shadedPattern>me.clip.placeholderapi.libs.gson</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>

View File

@@ -48,6 +48,7 @@ public class PlaceholderAPI {
private static final Pattern BRACKET_PLACEHOLDER_PATTERN = Pattern.compile("[{]([^{}]+)[}]");
private static final Pattern RELATIONAL_PLACEHOLDER_PATTERN = Pattern.compile("[%](rel_)([^%]+)[%]");
private static final Map<String, PlaceholderHook> placeholders = new HashMap<>();
private PlaceholderAPI() {
}
@@ -372,22 +373,18 @@ public class PlaceholderAPI {
return plugin != null && unregisterPlaceholderHook(plugin.getName());
}
@Deprecated
public static String setPlaceholders(Player p, String text) {
return setPlaceholders((OfflinePlayer) p, text, PLACEHOLDER_PATTERN);
}
@Deprecated
public static List<String> setPlaceholders(Player p, List<String> text) {
return setPlaceholders((OfflinePlayer) p, text, PLACEHOLDER_PATTERN);
}
@Deprecated
public static String setBracketPlaceholders(Player p, String text) {
return setPlaceholders((OfflinePlayer) p, text, BRACKET_PLACEHOLDER_PATTERN);
}
@Deprecated
public static List<String> setBracketPlaceholders(Player p, List<String> text) {
return setPlaceholders((OfflinePlayer) p, text, BRACKET_PLACEHOLDER_PATTERN);
}

View File

@@ -20,6 +20,10 @@
*/
package me.clip.placeholderapi;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import me.clip.placeholderapi.commands.PlaceholderAPICommands;
import me.clip.placeholderapi.configuration.PlaceholderAPIConfig;
import me.clip.placeholderapi.expansion.ExpansionManager;
@@ -34,38 +38,85 @@ import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* Yes I have a shit load of work to do...
*
* @author Ryan McCarthy
*
*/
public class PlaceholderAPIPlugin extends JavaPlugin {
private static PlaceholderAPIPlugin instance;
private PlaceholderAPIConfig config;
private ExpansionManager expansionManager;
private ExpansionCloudManager expansionCloud;
private static SimpleDateFormat dateFormat;
private static String booleanTrue;
private static String booleanFalse;
private static Version serverVersion;
private PlaceholderAPIConfig config;
private ExpansionManager expansionManager;
private ExpansionCloudManager expansionCloud;
private long startTime;
private static Version getVersion() {
String v = "unknown";
boolean spigot = false;
try {
v = Bukkit.getServer().getClass().getPackage().getName()
.split("\\.")[3];
} catch (ArrayIndexOutOfBoundsException ex) {
}
try {
Class.forName("org.spigotmc.SpigotConfig");
Class.forName("net.md_5.bungee.api.chat.BaseComponent");
spigot = true;
} catch (ExceptionInInitializerError | ClassNotFoundException exception) {
}
return new Version(v, spigot);
}
/**
* Gets the static instance of the main class for PlaceholderAPI. This class is not the actual API
* class, this is the main class that extends JavaPlugin. For most API methods, use static methods
* available from the class: {@link PlaceholderAPI}
*
* @return PlaceholderAPIPlugin instance
*/
public static PlaceholderAPIPlugin getInstance() {
return instance;
}
/**
* Get the configurable {@linkplain SimpleDateFormat} object that is used to parse time for
* generic time based placeholders
*
* @return date format
*/
public static SimpleDateFormat getDateFormat() {
return dateFormat != null ? dateFormat : new SimpleDateFormat(
"MM/dd/yy HH:mm:ss");
}
/**
* Get the configurable {@linkplain String} value that should be returned when a boolean is true
*
* @return string value of true
*/
public static String booleanTrue() {
return booleanTrue != null ? booleanTrue : "true";
}
/**
* Get the configurable {@linkplain String} value that should be returned when a boolean is false
*
* @return string value of false
*/
public static String booleanFalse() {
return booleanFalse != null ? booleanFalse : "false";
}
public static Version getServerVersion() {
return serverVersion != null ? serverVersion : getVersion();
}
@Override
public void onLoad() {
startTime = System.currentTimeMillis();
@@ -115,7 +166,9 @@ public class PlaceholderAPIPlugin extends JavaPlugin {
} else if (!cloudEnabled) {
enableCloud();
}
s.sendMessage(ChatColor.translateAlternateColorCodes('&', PlaceholderAPI.getRegisteredIdentifiers().size() + " &aplaceholder hooks successfully registered!"));
s.sendMessage(ChatColor.translateAlternateColorCodes('&',
PlaceholderAPI.getRegisteredIdentifiers().size()
+ " &aplaceholder hooks successfully registered!"));
}
private void setupOptions() {
@@ -136,9 +189,11 @@ public class PlaceholderAPIPlugin extends JavaPlugin {
private void setupMetrics() {
Metrics m = new Metrics(this);
m.addCustomChart(new Metrics.SimplePie("using_expansion_cloud", () -> getExpansionCloud() != null ? "yes" : "no"));
m.addCustomChart(new Metrics.SimplePie("using_expansion_cloud",
() -> getExpansionCloud() != null ? "yes" : "no"));
m.addCustomChart(new Metrics.SimplePie("using_spigot", () -> getServerVersion().isSpigot() ? "yes" : "no"));
m.addCustomChart(
new Metrics.SimplePie("using_spigot", () -> getServerVersion().isSpigot() ? "yes" : "no"));
m.addCustomChart(new Metrics.AdvancedPie("expansions_used", () -> {
Map<String, Integer> map = new HashMap<>();
@@ -160,23 +215,6 @@ public class PlaceholderAPIPlugin extends JavaPlugin {
}
private static Version getVersion() {
String v = "unknown";
boolean spigot = false;
try {
v = Bukkit.getServer().getClass().getPackage().getName()
.split("\\.")[3];
} catch (ArrayIndexOutOfBoundsException ex) {
}
try {
Class.forName("org.spigotmc.SpigotConfig");
Class.forName("net.md_5.bungee.api.chat.BaseComponent");
spigot = true;
} catch (ExceptionInInitializerError | ClassNotFoundException exception) {
}
return new Version(v, spigot);
}
public void enableCloud() {
if (expansionCloud == null) {
expansionCloud = new ExpansionCloudManager(this);
@@ -194,53 +232,6 @@ public class PlaceholderAPIPlugin extends JavaPlugin {
}
}
/**
* Gets the static instance of the main class for PlaceholderAPI. This class
* is not the actual API class, this is the main class that extends
* JavaPlugin. For most API methods, use static methods available from the
* class: {@link PlaceholderAPI}
*
* @return PlaceholderAPIPlugin instance
*/
public static PlaceholderAPIPlugin getInstance() {
return instance;
}
/**
* Get the configurable {@linkplain SimpleDateFormat} object that is used to
* parse time for generic time based placeholders
*
* @return date format
*/
public static SimpleDateFormat getDateFormat() {
return dateFormat != null ? dateFormat : new SimpleDateFormat(
"MM/dd/yy HH:mm:ss");
}
/**
* Get the configurable {@linkplain String} value that should be returned
* when a boolean is true
*
* @return string value of true
*/
public static String booleanTrue() {
return booleanTrue != null ? booleanTrue : "true";
}
/**
* Get the configurable {@linkplain String} value that should be returned
* when a boolean is false
*
* @return string value of false
*/
public static String booleanFalse() {
return booleanFalse != null ? booleanFalse : "false";
}
public static Version getServerVersion() {
return serverVersion != null ? serverVersion : getVersion();
}
/**
* Obtain the configuration class for PlaceholderAPI.
*
@@ -259,7 +250,8 @@ public class PlaceholderAPIPlugin extends JavaPlugin {
}
public String getUptime() {
return TimeUtil.getTime((int) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - startTime));
return TimeUtil
.getTime((int) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - startTime));
}
public long getUptimeMillis() {

View File

@@ -27,7 +27,9 @@ public abstract class PlaceholderHook {
/**
* called when a placeholder value is requested from this hook
* @param p {@link OfflinePlayer} to request the placeholder value for, null if not needed for a player
*
* @param p {@link OfflinePlayer} to request the placeholder value for, null if not needed for a
* player
* @param params String passed to the hook to determine what value to return
* @return value for the requested player and params
*/
@@ -40,6 +42,7 @@ public abstract class PlaceholderHook {
/**
* called when a placeholder is requested from this hook
*
* @param p {@link Player} to request the placeholder value for, null if not needed for a player
* @param params String passed to the hook to determine what value to return
* @return value for the requested player and params

View File

@@ -20,9 +20,15 @@
*/
package me.clip.placeholderapi;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import me.clip.placeholderapi.events.ExpansionUnregisterEvent;
import me.clip.placeholderapi.events.PlaceholderHookUnloadEvent;
import me.clip.placeholderapi.expansion.*;
import me.clip.placeholderapi.expansion.Cacheable;
import me.clip.placeholderapi.expansion.Cleanable;
import me.clip.placeholderapi.expansion.ExpansionManager;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import me.clip.placeholderapi.expansion.Taskable;
import me.clip.placeholderapi.expansion.cloud.CloudExpansion;
import me.clip.placeholderapi.external.EZPlaceholderHook;
import org.bukkit.Bukkit;
@@ -34,10 +40,6 @@ import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.server.PluginDisableEvent;
import org.bukkit.event.server.PluginEnableEvent;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class PlaceholderListener implements Listener {
@@ -65,7 +67,8 @@ public class PlaceholderListener implements Listener {
if (plugin.getExpansionCloud() != null) {
CloudExpansion ex = plugin.getExpansionCloud().getCloudExpansion(event.getExpansion().getName());
CloudExpansion ex = plugin.getExpansionCloud()
.getCloudExpansion(event.getExpansion().getName());
if (ex != null) {
ex.setHasExpansion(false);
@@ -114,7 +117,8 @@ public class PlaceholderListener implements Listener {
if (h.getPluginName().equalsIgnoreCase(n)) {
if (PlaceholderAPI.unregisterPlaceholderHook(hook.getKey())) {
plugin.getLogger().info("Unregistered placeholder hook for placeholder: " + h.getPlaceholderName());
plugin.getLogger()
.info("Unregistered placeholder hook for placeholder: " + h.getPlaceholderName());
break;
}
}

View File

@@ -20,6 +20,13 @@
*/
package me.clip.placeholderapi.commands;
import static me.clip.placeholderapi.util.Msg.color;
import static me.clip.placeholderapi.util.Msg.msg;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import me.clip.placeholderapi.PlaceholderAPI;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
@@ -30,13 +37,6 @@ import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import static me.clip.placeholderapi.util.Msg.color;
import static me.clip.placeholderapi.util.Msg.msg;
public class ExpansionCloudCommands implements CommandExecutor {
private PlaceholderAPIPlugin plugin;
@@ -70,7 +70,8 @@ public class ExpansionCloudCommands implements CommandExecutor {
return true;
}
if (args[1].equalsIgnoreCase("refresh") || args[1].equalsIgnoreCase("update") || args[1].equalsIgnoreCase("fetch")) {
if (args[1].equalsIgnoreCase("refresh") || args[1].equalsIgnoreCase("update") || args[1]
.equalsIgnoreCase("fetch")) {
msg(s, "&aRefresh task started. Use &f/papi ecloud list all &ain a few!!");
plugin.getExpansionCloud().clean();
plugin.getExpansionCloud().fetch(plugin.getPlaceholderAPIConfig().cloudAllowUnverifiedExpansions());
@@ -90,8 +91,10 @@ public class ExpansionCloudCommands implements CommandExecutor {
if (args[1].equalsIgnoreCase("status")) {
msg(s, "&bThere are &f" + plugin.getExpansionCloud().getCloudExpansions().size() + " &bexpansions available on the cloud.",
"&7A total of &f" + plugin.getExpansionCloud().getCloudAuthorCount() + " &7authors have contributed to the expansion cloud.");
msg(s, "&bThere are &f" + plugin.getExpansionCloud().getCloudExpansions().size()
+ " &bexpansions available on the cloud.",
"&7A total of &f" + plugin.getExpansionCloud().getCloudAuthorCount()
+ " &7authors have contributed to the expansion cloud.");
if (plugin.getExpansionCloud().getToUpdateCount() > 0) {
msg(s, "&eYou have &f" + plugin.getExpansionCloud().getToUpdateCount()
+ " &eexpansions installed that have updates available.");
@@ -115,7 +118,9 @@ public class ExpansionCloudCommands implements CommandExecutor {
}
if (!(s instanceof Player)) {
msg(s, (expansion.shouldUpdate() ? "&e" : "") + expansion.getName() + " &8&m-- &r" + expansion.getVersion().getUrl());
msg(s,
(expansion.shouldUpdate() ? "&e" : "") + expansion.getName() + " &8&m-- &r" + expansion
.getVersion().getUrl());
return true;
}
@@ -127,21 +132,25 @@ public class ExpansionCloudCommands implements CommandExecutor {
);
// latest version
JSONMessage latestVersion = JSONMessage.create(color("&bLatest version: &f" + expansion.getLatestVersion()));
JSONMessage latestVersion = JSONMessage
.create(color("&bLatest version: &f" + expansion.getLatestVersion()));
latestVersion.tooltip(color("&bReleased: &f" + expansion.getTimeSinceLastUpdate()
+ "\n&bUpdate information: &f" + expansion.getVersion().getReleaseNotes()
));
latestVersion.send(p);
// versions
JSONMessage versions = JSONMessage.create(color("&bVersions available: &f" + expansion.getVersions().size()));
JSONMessage versions = JSONMessage
.create(color("&bVersions available: &f" + expansion.getVersions().size()));
versions.tooltip(color(String.join("&b, &f", expansion.getAvailableVersions())));
versions.suggestCommand("/papi ecloud versioninfo " + expansion.getName() + " " + expansion.getLatestVersion());
versions.suggestCommand(
"/papi ecloud versioninfo " + expansion.getName() + " " + expansion.getLatestVersion());
versions.send(p);
// placeholders
if (expansion.getPlaceholders() != null) {
JSONMessage placeholders = JSONMessage.create(color("&bPlaceholders: &f" + expansion.getPlaceholders().size()));
JSONMessage placeholders = JSONMessage
.create(color("&bPlaceholders: &f" + expansion.getPlaceholders().size()));
placeholders.tooltip(color(String.join("&b, &f", expansion.getPlaceholders())));
placeholders.suggestCommand("/papi ecloud placeholders " + expansion.getName());
placeholders.send(p);
@@ -182,7 +191,8 @@ public class ExpansionCloudCommands implements CommandExecutor {
Player p = (Player) s;
JSONMessage download = JSONMessage.create(color("&7Click to download this version"));
download.suggestCommand("/papi ecloud download " + expansion.getName() + " " + version.getVersion());
download.suggestCommand(
"/papi ecloud download " + expansion.getName() + " " + version.getVersion());
download.send(p);
return true;
}
@@ -204,12 +214,14 @@ public class ExpansionCloudCommands implements CommandExecutor {
List<String> placeholders = expansion.getPlaceholders();
if (placeholders == null) {
msg(s, "&cThe expansion: &f" + expansion.getName() + " &cdoes not have any placeholders listed.",
msg(s, "&cThe expansion: &f" + expansion.getName()
+ " &cdoes not have any placeholders listed.",
"&7You should contact &f" + expansion.getAuthor() + " &7and ask for them to be added.");
return true;
}
if (!(s instanceof Player) || plugin.getExpansionManager().getRegisteredExpansion(expansion.getName()) == null) {
if (!(s instanceof Player)
|| plugin.getExpansionManager().getRegisteredExpansion(expansion.getName()) == null) {
msg(s, "&bPlaceholders: &f" + placeholders.size(),
String.join("&a, &f", placeholders));
return true;
@@ -287,11 +299,14 @@ public class ExpansionCloudCommands implements CommandExecutor {
avail = plugin.getExpansionCloud().getPagesAvailable(ex, 10);
if (page > avail) {
msg(s, "&cThere " + ((avail == 1) ? " is only &f" + avail + " &cpage available!" : "are only &f" + avail + " &cpages available!"));
msg(s, "&cThere " + ((avail == 1) ? " is only &f" + avail + " &cpage available!"
: "are only &f" + avail + " &cpages available!"));
return true;
}
msg(s, "&bShowing expansions for&7: &f" + (author != null ? author : (installed ? "all installed" : "all available"))+ " &8&m--&r &bamount&7: &f" + ex.size() + " &bpage&7: &f" + page + "&7/&f" + avail);
msg(s, "&bShowing expansions for&7: &f" + (author != null ? author
: (installed ? "all installed" : "all available")) + " &8&m--&r &bamount&7: &f" + ex
.size() + " &bpage&7: &f" + page + "&7/&f" + avail);
ex = plugin.getExpansionCloud().getPage(ex, page, 10);
@@ -304,10 +319,25 @@ public class ExpansionCloudCommands implements CommandExecutor {
msg(s, "&6Gold = Expansions which need updated");
if (!(s instanceof Player)) {
for (Entry<Integer, CloudExpansion> expansion : ex.entrySet()) {
if (expansion == null || expansion.getValue() == null) continue;
msg(s, "&b" + (expansion.getKey()+1) + "&7: " + (expansion.getValue().shouldUpdate() ? "&6" : (expansion.getValue().hasExpansion() ? "&a" : "&7")) + expansion.getValue().getName() + " &8&m-- &r" + expansion.getValue().getVersion().getUrl());
Map<String, CloudExpansion> expansions = new HashMap<>();
for (CloudExpansion exp : ex.values()) {
if (exp == null || exp.getName() == null) {
continue;
}
expansions.put(exp.getName(), exp);
}
List<String> ce = expansions.keySet().stream().sorted().collect(Collectors.toList());
int i = 1;
for (String name : ce) {
if (expansions.get(name) == null) {
continue;
}
CloudExpansion expansion = expansions.get(name);
msg(s,
"&b" + i + "&7: " + (expansion.shouldUpdate() ? "&6"
: (expansion.hasExpansion() ? "&a" : "&7")) + expansion
.getName() + " &8&m-- &r" + expansion.getVersion().getUrl());
i++;
}
return true;
@@ -315,40 +345,55 @@ public class ExpansionCloudCommands implements CommandExecutor {
Player p = (Player) s;
for (Entry<Integer, CloudExpansion> expansion : ex.entrySet()) {
if (expansion == null || expansion.getValue() == null) {
Map<String, CloudExpansion> expansions = new HashMap<>();
for (CloudExpansion exp : ex.values()) {
if (exp == null || exp.getName() == null) {
continue;
}
expansions.put(exp.getName(), exp);
}
List<String> ce = expansions.keySet().stream().sorted().collect(Collectors.toList());
int i = 1;
for (String name : ce) {
if (expansions.get(name) == null) {
continue;
}
CloudExpansion expansion = expansions.get(name);
StringBuilder sb = new StringBuilder();
if (expansion.getValue().shouldUpdate()) {
if (expansion.shouldUpdate()) {
sb.append("&6Click to update to the latest version of this expansion\n\n");
} else if (!expansion.getValue().hasExpansion()) {
} else if (!expansion.hasExpansion()) {
sb.append("&bClick to download this expansion\n\n");
} else {
sb.append("&aYou have the latest version of this expansion\n\n");
}
sb.append("&bAuthor&7: &f" + expansion.getValue().getAuthor() + "\n");
sb.append("&bVerified&7: &f" + expansion.getValue().isVerified() + "\n");
sb.append("&bLatest version&7: &f" + expansion.getValue().getVersion().getVersion() + "\n");
sb.append("&bLast updated&7: &f" + expansion.getValue().getTimeSinceLastUpdate() + " ago\n");
sb.append("\n" + expansion.getValue().getDescription());
sb.append("&bAuthor&7: &f" + expansion.getAuthor() + "\n");
sb.append("&bVerified&7: &f" + expansion.isVerified() + "\n");
sb.append("&bLatest version&7: &f" + expansion.getVersion().getVersion() + "\n");
sb.append(
"&bLast updated&7: &f" + expansion.getTimeSinceLastUpdate() + " ago\n");
sb.append("\n" + expansion.getDescription());
String msg = color("&b" + (expansion.getKey()+1) + "&7: " + (expansion.getValue().shouldUpdate() ? "&6" : (expansion.getValue().hasExpansion() ? "&a" : "")) + expansion.getValue().getName());
String msg = color(
"&b" + (i + 1) + "&7: " + (expansion.shouldUpdate() ? "&6"
: (expansion.hasExpansion() ? "&a" : "")) + expansion.getName());
String hover = color(sb.toString());
JSONMessage line = JSONMessage.create(msg);
line.tooltip(hover);
line.suggestCommand("/papi ecloud info " + expansion.getValue().getName());
line.send(p);
if (expansion.shouldUpdate()) {
line.suggestCommand("/papi ecloud download " + expansion.getName());
}
else {
line.suggestCommand("/papi ecloud info " + expansion.getName());
}
line.send(p);
i++;
}
return true;
}
if (args[1].equalsIgnoreCase("download")) {
if (args.length < 3) {
@@ -381,9 +426,12 @@ public class ExpansionCloudCommands implements CommandExecutor {
}
}
msg(s, "&aDownload starting for expansion: &f" + expansion.getName() + " &aversion: &f" + version);
msg(s, "&aDownload starting for expansion: &f" + expansion.getName() + " &aversion: &f"
+ version);
String player = ((s instanceof Player) ? s.getName() : null);
plugin.getExpansionCloud().downloadExpansion(player, expansion, version);
plugin.getExpansionCloud().clean();
plugin.getExpansionCloud().fetch(plugin.getPlaceholderAPIConfig().cloudAllowUnverifiedExpansions());
return true;
}
@@ -392,5 +440,4 @@ public class ExpansionCloudCommands implements CommandExecutor {
}
}

View File

@@ -20,23 +20,23 @@
*/
package me.clip.placeholderapi.commands;
import java.util.Set;
import java.util.stream.Collectors;
import me.clip.placeholderapi.PlaceholderAPI;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import me.clip.placeholderapi.util.Msg;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Set;
public class PlaceholderAPICommands implements CommandExecutor {
private PlaceholderAPIPlugin plugin;
private CommandExecutor eCloud;
public PlaceholderAPICommands(PlaceholderAPIPlugin i) {
@@ -46,15 +46,17 @@ public class PlaceholderAPICommands implements CommandExecutor {
@Override
public boolean onCommand(CommandSender s, Command c, String label, String[] args) {
if (args.length == 0) {
Msg.msg(s, "PlaceholderAPI &7version &b&o" + plugin.getDescription().getVersion(),
"&fCreated by&7: &bextended_clip");
return true;
Msg.msg(s, "PlaceholderAPI &7version &b&o" + plugin.getDescription().getVersion(),
"&fCreated by&7: &bextended_clip",
"&fPapi commands: &b/papi help",
"&fEcloud commands: &b/papi ecloud");
return true;
} else {
if (args[0].equalsIgnoreCase("help")) {
Msg.msg(s, "PlaceholderAPI &aHelp &e(&f" + plugin.getDescription().getVersion() + "&e)",
"&b/papi",
"&fView plugin info/version info",
@@ -62,13 +64,18 @@ public class PlaceholderAPICommands implements CommandExecutor {
"&fList all placeholder expansions that are currently active",
"&b/papi info <placeholder name>",
"&fView information for a specific expansion",
"&b/papi parse <...args>",
"&b/papi parse <(playername)/me> <...args>",
"&fParse a String with placeholders",
"&b/papi bcparse <(playername)/me> <...args>",
"&fParse a String with placeholders and broadcast the message",
"&b/papi parserel <player one> <player two> <...args>",
"&fParse a String with relational placeholders",
"&b/papi register <fileName>",
"&fRegister an expansion by the name of the file",
"&b/papi unregister <Expansion name>",
"&fUnregister an expansion by name",
"&b/papi reload",
"&fReload the config settings");
if (s.hasPermission("placeholderapi.ecloud")) {
if (plugin.getExpansionCloud() == null) {
Msg.msg(s, "&b/papi enablecloud",
@@ -80,111 +87,107 @@ public class PlaceholderAPICommands implements CommandExecutor {
"&fView ecloud command usage");
}
}
return true;
} else if (args[0].equalsIgnoreCase("ecloud")) {
if (!s.hasPermission("placeholderapi.ecloud")) {
Msg.msg(s, "&cYou don't have permission to do that!");
return true;
}
if (plugin.getExpansionCloud() == null) {
Msg.msg(s, "&7The expansion cloud is not enabled!");
return true;
}
return eCloud.onCommand(s, c, label, args);
} else if (args[0].equalsIgnoreCase("enablecloud")) {
if (!s.hasPermission("placeholderapi.ecloud")) {
Msg.msg(s, "&cYou don't have permission to do that!");
return true;
}
if (plugin.getExpansionCloud() != null) {
Msg.msg(s, "&7The cloud is already enabled!");
return true;
}
plugin.enableCloud();
plugin.getPlaceholderAPIConfig().setCloudEnabled(true);
Msg.msg(s, "&aThe cloud has been enabled!");
return true;
} else if (args[0].equalsIgnoreCase("disablecloud")) {
if (!s.hasPermission("placeholderapi.ecloud")) {
Msg.msg(s, "&cYou don't have permission to do that!");
return true;
}
if (plugin.getExpansionCloud() == null) {
Msg.msg(s, "&7The cloud is already disabled!");
return true;
}
plugin.disableCloud();
plugin.getPlaceholderAPIConfig().setCloudEnabled(false);
Msg.msg(s, "&aThe cloud has been disabled!");
return true;
} else if (args.length > 1 && args[0].equalsIgnoreCase("info")) {
if (!s.hasPermission("placeholderapi.info")) {
Msg.msg(s, "&cYou don't have permission to do that!");
return true;
}
PlaceholderExpansion ex = plugin.getExpansionManager().getRegisteredExpansion(args[1]);
if (ex == null) {
Msg.msg(s, "&cThere is no expansion loaded with the identifier: &f" + args[1]);
return true;
}
Msg.msg(s, "&7Placeholder expansion info for: &f" + ex.getName());
Msg.msg(s, "&7Status: " + (ex.isRegistered() ? "&aRegistered" : "&cNot registered"));
if (ex.getAuthor() != null) {
Msg.msg(s, "&7Created by: &f" + ex.getAuthor());
}
if (ex.getVersion() != null) {
Msg.msg(s, "&7Version: &f" + ex.getVersion());
}
if (ex.getRequiredPlugin() != null) {
Msg.msg(s, "&7Requires plugin: &f" + ex.getRequiredPlugin());
}
if (ex.getPlaceholders() != null) {
Msg.msg(s, "&8&m-- &r&7Placeholders &8&m--");
for (String placeholder : ex.getPlaceholders()) {
Msg.msg(s, placeholder);
}
}
return true;
} else if (args.length > 1 && args[0].equalsIgnoreCase("parse")) {
} else if (args.length > 2 && args[0].equalsIgnoreCase("parse")
|| args.length > 2 && args[0].equalsIgnoreCase("bcparse")) {
if (!(s instanceof Player)) {
Msg.msg(s, "&cThis command can only be used in game!");
return true;
} else {
if (!s.hasPermission("placeholderapi.parse")) {
Msg.msg(s, "&cYou don't have permission to do that!");
return true;
}
OfflinePlayer pl = null;
if (args[1].equalsIgnoreCase("me")) {
if (s instanceof Player) {
pl = (Player) s;
} else {
Msg.msg(s, "&cThis command must target a player when used by console");
return true;
}
} else {
if (Bukkit.getPlayer(args[1]) != null) {
pl = Bukkit.getPlayer(args[1]);
} else {
pl = Bukkit.getOfflinePlayer(args[1]);
}
}
if (pl == null || !pl.hasPlayedBefore()) {
Msg.msg(s, "&cFailed to find player: &f" + args[1]);
return true;
}
String parse = StringUtils.join(args, " ", 2, args.length);
if (args[0].equalsIgnoreCase("bcparse")) {
Msg.broadcast("&r" + PlaceholderAPI.setPlaceholders(pl, parse));
} else {
Msg.msg(s, "&r" + PlaceholderAPI.setPlaceholders(pl, parse));
}
Player p = (Player) s;
String parse = StringUtils.join(args, " ", 1, args.length);
Msg.msg(s, "&r" + PlaceholderAPI.setPlaceholders(p, parse));
return true;
} else if (args.length > 3 && args[0].equalsIgnoreCase("parserel")) {
@@ -197,24 +200,18 @@ public class PlaceholderAPICommands implements CommandExecutor {
return true;
}
}
Player one = Bukkit.getPlayer(args[1]);
if (one == null) {
Msg.msg(s, args[1] + " &cis not online!");
return true;
}
Player two = Bukkit.getPlayer(args[2]);
if (two == null) {
Msg.msg(s, args[2] + " &cis not online!");
return true;
}
String parse = StringUtils.join(args, " ", 3, args.length);
Msg.msg(s, "&r" + PlaceholderAPI.setRelationalPlaceholders(one, two, parse));
return true;
} else if (args[0].equalsIgnoreCase("reload")) {
@@ -224,11 +221,8 @@ public class PlaceholderAPICommands implements CommandExecutor {
return true;
}
}
Msg.msg(s, "&fPlaceholder&7API &bconfiguration reloaded!");
plugin.reloadConf(s);
} else if (args[0].equalsIgnoreCase("list")) {
if (s instanceof Player) {
@@ -239,18 +233,56 @@ public class PlaceholderAPICommands implements CommandExecutor {
}
Set<String> registered = PlaceholderAPI.getRegisteredIdentifiers();
if (registered.isEmpty()) {
Msg.msg(s, "&7There are no placeholder hooks currently registered!");
return true;
}
Msg.msg(s, registered.size() + " &7Placeholder hooks registered:");
Msg.msg(s, registered.toString());
Msg.msg(s, registered.stream().sorted().collect(Collectors.joining(", ")));
} else if (args.length > 1 && args[0].equalsIgnoreCase("register")) {
if (s instanceof Player) {
if (!s.hasPermission("placeholderapi.register")) {
Msg.msg(s, "&cYou don't have permission to do that!");
return true;
}
}
String fileName = args[1].replace(".jar", "");
PlaceholderExpansion ex = plugin.getExpansionManager().registerExpansion(fileName);
if (ex == null) {
Msg.msg(s, "&cFailed to register expansion from " + fileName);
return true;
}
Msg.msg(s, "&aSuccessfully registered expansion: &f" + ex.getName());
} else if (args.length > 1 && args[0].equalsIgnoreCase("unregister")) {
if (s instanceof Player) {
if (!s.hasPermission("placeholderapi.register")) {
Msg.msg(s, "&cYou don't have permission to do that!");
return true;
}
}
PlaceholderExpansion ex = plugin.getExpansionManager().getRegisteredExpansion(args[1]);
if (ex == null) {
Msg.msg(s, "&cFailed to find expansion: &f" + args[1]);
return true;
}
if (PlaceholderAPI.unregisterExpansion(ex)) {
Msg.msg(s, "&aSuccessfully unregistered expansion: &f" + ex.getName());
} else {
Msg.msg(s, "&cFailed to unregister expansion: &f" + ex.getName());
}
} else {
Msg.msg(s, "&cIncorrect usage! &7/papi help");
}
}
return true;
}

View File

@@ -33,12 +33,12 @@ public class ExpansionRegisterEvent extends Event {
this.expansion = expansion;
}
@Override
public HandlerList getHandlers() {
public static HandlerList getHandlerList() {
return HANDLERS;
}
public static HandlerList getHandlerList() {
@Override
public HandlerList getHandlers() {
return HANDLERS;
}

View File

@@ -20,7 +20,6 @@
*/
package me.clip.placeholderapi.events;
import me.clip.placeholderapi.PlaceholderHook;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
@@ -34,12 +33,12 @@ public class ExpansionUnregisterEvent extends Event {
this.expansion = expansion;
}
@Override
public HandlerList getHandlers() {
public static HandlerList getHandlerList() {
return HANDLERS;
}
public static HandlerList getHandlerList() {
@Override
public HandlerList getHandlers() {
return HANDLERS;
}

View File

@@ -36,12 +36,12 @@ public class PlaceholderHookUnloadEvent extends Event {
this.hook = placeholderHook;
}
@Override
public HandlerList getHandlers() {
public static HandlerList getHandlerList() {
return HANDLERS;
}
public static HandlerList getHandlerList() {
@Override
public HandlerList getHandlers() {
return HANDLERS;
}

View File

@@ -21,12 +21,11 @@
package me.clip.placeholderapi.expansion;
/**
* This interface allows a class which extends a {@link PlaceholderExpansion}
* to have the clear method called when the implementing expansion is unregistered
* from PlaceholderAPI.
* This is useful if we want to do things when the implementing hook is unregistered
* @author Ryan McCarthy
* This interface allows a class which extends a {@link PlaceholderExpansion} to have the clear
* method called when the implementing expansion is unregistered from PlaceholderAPI. This is useful
* if we want to do things when the implementing hook is unregistered
*
* @author Ryan McCarthy
*/
public interface Cacheable {

View File

@@ -23,16 +23,17 @@ package me.clip.placeholderapi.expansion;
import org.bukkit.entity.Player;
/**
* This interface allows a class which extends a {@link PlaceholderExpansion}
* to have the cleanup method called every time a player leaves the server.
* This is useful if we want to clean up after the player
* @author Ryan McCarthy
* This interface allows a class which extends a {@link PlaceholderExpansion} to have the cleanup
* method called every time a player leaves the server. This is useful if we want to clean up after
* the player
*
* @author Ryan McCarthy
*/
public interface Cleanable {
/**
* Called when a player leaves the server
*
* @param p (@link Player} who left the server
*/
void cleanup(Player p);

View File

@@ -23,19 +23,21 @@ package me.clip.placeholderapi.expansion;
import java.util.Map;
/**
* Any {@link PlaceholderExpansion} class which implements configurable will
* have any options listed in the getDefaults map automatically added to the PlaceholderAPI config.yml file
* @author Ryan McCarthy
* Any {@link PlaceholderExpansion} class which implements configurable will have any options listed
* in the getDefaults map automatically added to the PlaceholderAPI config.yml file
*
* @author Ryan McCarthy
*/
public interface Configurable {
/**
* This method will be called before the implementing class is registered
* to obtain a map of configuration options that the implementing class needs
* These paths and values will be added to the PlaceholderAPI config.yml in the configuration section
* expansions.(placeholder identifier).(your key): (your value)
* @return Map of config path / values which need to be added / removed from the PlaceholderAPI config.yml file
* This method will be called before the implementing class is registered to obtain a map of
* configuration options that the implementing class needs These paths and values will be added to
* the PlaceholderAPI config.yml in the configuration section expansions.(placeholder
* identifier).(your key): (your value)
*
* @return Map of config path / values which need to be added / removed from the PlaceholderAPI
* config.yml file
*/
Map<String, Object> getDefaults();
}

View File

@@ -20,6 +20,12 @@
*/
package me.clip.placeholderapi.expansion;
import java.io.File;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import me.clip.placeholderapi.PlaceholderAPI;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
import me.clip.placeholderapi.PlaceholderHook;
@@ -29,20 +35,17 @@ import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.event.Listener;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public final class ExpansionManager {
private PlaceholderAPIPlugin plugin;
private final Map<String, PlaceholderExpansion> cache = new HashMap<>();
private PlaceholderAPIPlugin plugin;
public ExpansionManager(PlaceholderAPIPlugin instance) {
plugin = instance;
File f = new File(PlaceholderAPIPlugin.getInstance().getDataFolder(), "expansions");
if (!f.exists()) {
f.mkdirs();
}
}
public void clean() {
@@ -68,25 +71,19 @@ public final class ExpansionManager {
return null;
}
public boolean registerExpansion(PlaceholderExpansion c) {
if (c == null || c.getIdentifier() == null) {
public boolean registerExpansion(PlaceholderExpansion expansion) {
if (expansion == null || expansion.getIdentifier() == null) {
return false;
}
if (c instanceof Configurable) {
Map<String, Object> defaults = ((Configurable) c).getDefaults();
String pre = "expansions." + c.getIdentifier() + ".";
if (expansion instanceof Configurable) {
Map<String, Object> defaults = ((Configurable) expansion).getDefaults();
String pre = "expansions." + expansion.getIdentifier() + ".";
FileConfiguration cfg = plugin.getConfig();
boolean save = false;
for (Entry<String, Object> entries : defaults.entrySet()) {
if (entries.getKey() == null || entries.getKey().isEmpty()) {
continue;
}
if (entries.getValue() == null) {
if (cfg.contains(pre + entries.getKey())) {
save = true;
@@ -99,70 +96,91 @@ public final class ExpansionManager {
}
}
}
if (save) {
plugin.saveConfig();
plugin.reloadConfig();
}
}
if (c instanceof VersionSpecific) {
VersionSpecific nms = (VersionSpecific) c;
if (expansion instanceof VersionSpecific) {
VersionSpecific nms = (VersionSpecific) expansion;
if (!nms.isCompatibleWith(PlaceholderAPIPlugin.getServerVersion())) {
plugin.getLogger().info("Your server version is not compatible with expansion: " + c.getIdentifier()
+ " version: " + c.getVersion());
plugin.getLogger()
.info(
"Your server version is not compatible with expansion: " + expansion.getIdentifier()
+ " version: " + expansion.getVersion());
return false;
}
}
if (!c.canRegister()) {
if (c.getRequiredPlugin() != null) {
cache.put(c.getRequiredPlugin().toLowerCase(), c);
if (!expansion.canRegister()) {
if (expansion.getRequiredPlugin() != null) {
cache.put(expansion.getRequiredPlugin().toLowerCase(), expansion);
}
return false;
}
if (!c.register()) {
if (!expansion.register()) {
return false;
}
if (c instanceof Listener) {
Listener l = (Listener) c;
if (expansion instanceof Listener) {
Listener l = (Listener) expansion;
Bukkit.getPluginManager().registerEvents(l, plugin);
}
plugin.getLogger().info("Successfully registered expansion: " + c.getIdentifier());
if (c instanceof Taskable) {
((Taskable) c).start();
plugin.getLogger().info("Successfully registered expansion: " + expansion.getIdentifier());
if (expansion instanceof Taskable) {
((Taskable) expansion).start();
}
if (plugin.getExpansionCloud() != null) {
CloudExpansion ce = plugin.getExpansionCloud().getCloudExpansion(expansion.getIdentifier());
if (ce != null) {
ce.setHasExpansion(true);
if (!ce.getLatestVersion().equals(expansion.getVersion())) {
ce.setShouldUpdate(true);
}
}
}
return true;
}
public void registerAllExpansions() {
public PlaceholderExpansion registerExpansion(String fileName) {
List<Class<?>> subs = FileUtil.getClasses("expansions", fileName, PlaceholderExpansion.class);
if (subs == null || subs.isEmpty()) {
return null;
}
// only register the first instance found as an expansion jar should only have 1 class
// extending PlaceholderExpansion
PlaceholderExpansion ex = createInstance(subs.get(0));
if (registerExpansion(ex)) {
return ex;
}
return null;
}
public void registerAllExpansions() {
if (plugin == null) {
return;
}
List<Class<?>> subs = FileUtil.getClasses("expansions", PlaceholderExpansion.class);
List<Class<?>> subs = FileUtil.getClasses("expansions", null, PlaceholderExpansion.class);
if (subs == null || subs.isEmpty()) {
return;
}
for (Class<?> klass : subs) {
if (klass == null) {
continue;
PlaceholderExpansion ex = createInstance(klass);
if (ex != null) {
registerExpansion(ex);
}
}
}
try {
private PlaceholderExpansion createInstance(Class<?> klass) {
if (klass == null) {
return null;
}
PlaceholderExpansion ex = null;
if (!PlaceholderExpansion.class.isAssignableFrom(klass)) {
return null;
}
try {
Constructor<?>[] c = klass.getConstructors();
if (c.length == 0) {
ex = (PlaceholderExpansion) klass.newInstance();
} else {
@@ -173,27 +191,11 @@ public final class ExpansionManager {
}
}
}
if (ex == null) {
continue;
}
if (registerExpansion(ex)) {
if (plugin.getExpansionCloud() != null) {
CloudExpansion ce = plugin.getExpansionCloud().getCloudExpansion(ex.getIdentifier());
if (ce != null) {
ce.setHasExpansion(true);
if (!ce.getVersion().equals(ex.getVersion())) {
ce.setShouldUpdate(true);
}
}
}
}
} catch (Throwable t) {
plugin.getLogger().severe("Failed to load placeholder expansion from class: " + klass.getName());
plugin.getLogger()
.severe("Failed to init placeholder expansion from class: " + klass.getName());
plugin.getLogger().severe(t.getMessage());
}
}
return ex;
}
}

View File

@@ -34,7 +34,10 @@ public enum NMSVersion {
SPIGOT_1_9_R2("v1_9_R2"),
SPIGOT_1_10_R1("v1_10_R1"),
SPIGOT_1_11_R1("v1_11_R1"),
SPIGOT_1_12_R1("v1_12_R1");
SPIGOT_1_12_R1("v1_12_R1"),
SPIGOT_1_13_R1("v1_13_R1"),
SPIGOT_1_13_R2("v1_13_R2"),
SPIGOT_1_14_R1("v1_14_R1");
private String version;
@@ -42,10 +45,6 @@ public enum NMSVersion {
this.version = version;
}
public String getVersion() {
return version;
}
public static NMSVersion getVersion(String version) {
for (NMSVersion v : values()) {
if (v.getVersion().equalsIgnoreCase(version)) {
@@ -54,4 +53,9 @@ public enum NMSVersion {
}
return NMSVersion.UNKNOWN;
}
public String getVersion() {
return version;
}
}

View File

@@ -20,6 +20,7 @@
*/
package me.clip.placeholderapi.expansion;
import java.util.List;
import me.clip.placeholderapi.PlaceholderAPI;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
import me.clip.placeholderapi.PlaceholderHook;
@@ -27,12 +28,11 @@ import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.configuration.ConfigurationSection;
import java.util.List;
public abstract class PlaceholderExpansion extends PlaceholderHook {
/**
* The name of this expansion
*
* @return {@link #getIdentifier()} by default, name of this expansion if specified
*/
public String getName() {
@@ -41,25 +41,29 @@ public abstract class PlaceholderExpansion extends PlaceholderHook {
/**
* The placeholder identifier of this expanion
*
* @return placeholder identifier that is associated with this expansion
*/
public abstract String getIdentifier();
/**
* The author of this expansion
*
* @return name of the author for this expansion
*/
public abstract String getAuthor();
/**
* The version of this expansion
*
* @return current version of this expansion
*/
public abstract String getVersion();
/**
* The name of the plugin that this expansion hooks into.
* by default will return the deprecated {@link #getPlugin()} method
* The name of the plugin that this expansion hooks into. by default will return the deprecated
* {@link #getPlugin()} method
*
* @return plugin name that this expansion requires to function
*/
public String getRequiredPlugin() {
@@ -68,6 +72,7 @@ public abstract class PlaceholderExpansion extends PlaceholderHook {
/**
* The placeholders associated with this expansion
*
* @return placeholder list that this expansion provides
*/
public List<String> getPlaceholders() {
@@ -75,8 +80,10 @@ public abstract class PlaceholderExpansion extends PlaceholderHook {
}
/**
* Expansions that do not use the ecloud and instead register from the dependency should set this to true
* to ensure that your placeholder expansion is not unregistered when the papi reload command is used
* Expansions that do not use the ecloud and instead register from the dependency should set this
* to true to ensure that your placeholder expansion is not unregistered when the papi reload
* command is used
*
* @return if this expansion should persist through placeholder reloads
*/
public boolean persist() {
@@ -85,6 +92,7 @@ public abstract class PlaceholderExpansion extends PlaceholderHook {
/**
* Check if this placeholder identfier has already been registered
*
* @return true if the identifier for this expansion is already registered
*/
public boolean isRegistered() {
@@ -93,16 +101,19 @@ public abstract class PlaceholderExpansion extends PlaceholderHook {
}
/**
* If any requirements need to be checked before this expansion should register,
* you can check them here
* If any requirements need to be checked before this expansion should register, you can check
* them here
*
* @return true if this hook meets all the requirements to register
*/
public boolean canRegister() {
return getRequiredPlugin() == null || Bukkit.getPluginManager().getPlugin(getRequiredPlugin()) != null;
return getRequiredPlugin() == null
|| Bukkit.getPluginManager().getPlugin(getRequiredPlugin()) != null;
}
/**
* Attempt to register this PlaceholderExpansion
*
* @return true if this expansion is now registered with PlaceholderAPI
*/
public boolean register() {
@@ -112,6 +123,7 @@ public abstract class PlaceholderExpansion extends PlaceholderHook {
/**
* Quick getter for the {@link PlaceholderAPIPlugin} instance
*
* @return {@link PlaceholderAPIPlugin} instance
*/
public PlaceholderAPIPlugin getPlaceholderAPI() {
@@ -119,23 +131,28 @@ public abstract class PlaceholderExpansion extends PlaceholderHook {
}
public String getString(String path, String def) {
return getPlaceholderAPI().getConfig().getString("expansions." + getIdentifier() + "." + path, def);
return getPlaceholderAPI().getConfig()
.getString("expansions." + getIdentifier() + "." + path, def);
}
public int getInt(String path, int def) {
return getPlaceholderAPI().getConfig().getInt("expansions." + getIdentifier() + "." + path, def);
return getPlaceholderAPI().getConfig()
.getInt("expansions." + getIdentifier() + "." + path, def);
}
public long getLong(String path, long def) {
return getPlaceholderAPI().getConfig().getLong("expansions." + getIdentifier() + "." + path, def);
return getPlaceholderAPI().getConfig()
.getLong("expansions." + getIdentifier() + "." + path, def);
}
public double getDouble(String path, double def) {
return getPlaceholderAPI().getConfig().getDouble("expansions." + getIdentifier() + "." + path, def);
return getPlaceholderAPI().getConfig()
.getDouble("expansions." + getIdentifier() + "." + path, def);
}
public List<String> getStringList(String path) {
return getPlaceholderAPI().getConfig().getStringList("expansions." + getIdentifier() + "." + path);
return getPlaceholderAPI().getConfig()
.getStringList("expansions." + getIdentifier() + "." + path);
}
public Object get(String path, Object def) {
@@ -143,7 +160,8 @@ public abstract class PlaceholderExpansion extends PlaceholderHook {
}
public ConfigurationSection getConfigSection(String path) {
return getPlaceholderAPI().getConfig().getConfigurationSection("expansions." + getIdentifier() + "." + path);
return getPlaceholderAPI().getConfig()
.getConfigurationSection("expansions." + getIdentifier() + "." + path);
}
public ConfigurationSection getConfigSection() {
@@ -167,11 +185,15 @@ public abstract class PlaceholderExpansion extends PlaceholderHook {
* @deprecated As of versions greater than 2.8.7, use the expansion cloud to show a description
*/
@Deprecated
public String getDescription() { return null; }
public String getDescription() {
return null;
}
/**
* @deprecated As of versions greater than 2.8.7, use the expansion cloud to display a link
*/
@Deprecated
public String getLink() { return null; }
public String getLink() {
return null;
}
}

View File

@@ -23,5 +23,6 @@ package me.clip.placeholderapi.expansion;
import org.bukkit.entity.Player;
public interface Relational {
String onPlaceholderRequest(Player one, Player two, String identifier);
}

View File

@@ -30,8 +30,8 @@ public interface Taskable {
void start();
/**
* Called when the implementing class has been unregistered from PlaceholderAPI
* Tasks that need to be performed when this expansion has unregistered should go here
* Called when the implementing class has been unregistered from PlaceholderAPI Tasks that need to
* be performed when this expansion has unregistered should go here
*/
void stop();
}

View File

@@ -20,7 +20,7 @@
*/
package me.clip.placeholderapi.expansion;
public class Version {
public final class Version {
private boolean isSpigot;
@@ -38,4 +38,9 @@ public class Version {
public boolean isSpigot() {
return isSpigot;
}
public boolean compareTo(String version) {
return getVersion().equalsIgnoreCase(version);
}
}

View File

@@ -21,17 +21,18 @@
package me.clip.placeholderapi.expansion;
/**
* Placeholder expansions which use NMS code should be version specific.
* Implementing this class allows you to perform checks based on the version the server is running.
* The isCompatibleWith method will be passed the server version and allow you to return if your expansion is compatible with that version.
* @author Ryan McCarthy
* Placeholder expansions which use NMS code should be version specific. Implementing this class
* allows you to perform checks based on the version the server is running. The isCompatibleWith
* method will be passed the server version and allow you to return if your expansion is compatible
* with that version.
*
* @author Ryan McCarthy
*/
public interface VersionSpecific {
/**
* This method is called before the expansion is attempted to be registered
* The server version will be passed to this method so you know what version the server is currently running.
* This method is called before the expansion is attempted to be registered The server version
* will be passed to this method so you know what version the server is currently running.
*
* @return true if your expansion is compatible with the version the server is running.
*/

View File

@@ -20,11 +20,10 @@
*/
package me.clip.placeholderapi.expansion.cloud;
import me.clip.placeholderapi.util.TimeUtil;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import me.clip.placeholderapi.util.TimeUtil;
public class CloudExpansion {
@@ -173,6 +172,7 @@ public class CloudExpansion {
}
public class Version {
private String url, version, release_notes;
public String getUrl() {

View File

@@ -21,118 +21,116 @@
package me.clip.placeholderapi.expansion.cloud;
import com.google.gson.Gson;
import me.clip.placeholderapi.PlaceholderAPI;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import me.clip.placeholderapi.util.Msg;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.io.*;
import java.net.HttpURLConnection;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import com.google.gson.reflect.TypeToken;
import me.clip.placeholderapi.PlaceholderAPI;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import me.clip.placeholderapi.util.Msg;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class ExpansionCloudManager {
private PlaceholderAPIPlugin plugin;
private final String API = "http://api.extendedclip.com/v2/";
private final File dir;
private final TreeMap<Integer, CloudExpansion> remote = new TreeMap<>();
private final List<String> downloading = new ArrayList<>();
private Gson gson;
private static final String API_URL = "http://api.extendedclip.com/v2/";
private static final Gson GSON = new Gson();
public ExpansionCloudManager(PlaceholderAPIPlugin instance) {
plugin = instance;
gson = new Gson();
dir = new File(instance.getDataFolder() + File.separator + "expansions");
if (!dir.exists()) {
try {
dir.mkdirs();
} catch (Exception ex) {
ex.printStackTrace();
}
private final PlaceholderAPIPlugin plugin;
private final File expansionsDir;
private final List<String> downloading = new ArrayList<>();
private final Map<Integer, CloudExpansion> remote = new TreeMap<>();
public ExpansionCloudManager(PlaceholderAPIPlugin plugin) {
this.plugin = plugin;
expansionsDir = new File(plugin.getDataFolder(), "expansions");
final boolean result = expansionsDir.mkdirs();
if (result) {
plugin.getLogger().info("Created Expansions Directory");
}
}
public void clean() {
remote.clear();
downloading.clear();
}
public boolean isDownloading(String expansion) {
return downloading.contains(expansion);
}
public Map<Integer, CloudExpansion> getCloudExpansions() {
return remote;
}
public CloudExpansion getCloudExpansion(String name) {
return remote.values().stream().filter(ex -> ex.getName().equalsIgnoreCase(name)).findFirst().orElse(null);
return remote.values()
.stream()
.filter(ex -> ex.getName().equalsIgnoreCase(name))
.findFirst()
.orElse(null);
}
public int getCloudAuthorCount() {
return remote.values().stream().collect(Collectors.groupingBy(CloudExpansion::getAuthor, Collectors.counting())).size();
return remote.values()
.stream()
.collect(Collectors.groupingBy(CloudExpansion::getAuthor, Collectors.counting()))
.size();
}
public long getToUpdateCount() {
return PlaceholderAPI.getExpansions().stream().filter(ex -> getCloudExpansion(ex.getName()) != null && getCloudExpansion(ex.getName()).shouldUpdate()).count();
public int getToUpdateCount() {
return ((int) PlaceholderAPI.getExpansions()
.stream()
.filter(ex -> getCloudExpansion(ex.getName()) != null && getCloudExpansion(ex.getName()).shouldUpdate())
.count());
}
public Map<Integer, CloudExpansion> getAllByAuthor(String author) {
if (remote.isEmpty()) {
return null;
}
TreeMap<Integer, CloudExpansion> byAuthor = new TreeMap<>();
boolean first = true;
if (remote.isEmpty()) return new HashMap<>();
Map<Integer, CloudExpansion> byAuthor = new TreeMap<>();
for (CloudExpansion ex : remote.values()) {
if (ex.getAuthor().equalsIgnoreCase(author)) {
if (first) {
first = false;
byAuthor.put(0, ex);
} else {
byAuthor.put(byAuthor.lastKey() + 1, ex);
}
}
if (!ex.getAuthor().equalsIgnoreCase(author)) continue;
byAuthor.put(byAuthor.size(), ex);
}
if (byAuthor.isEmpty()) {
return null;
}
return byAuthor;
}
public Map<Integer, CloudExpansion> getAllInstalled() {
if (remote.isEmpty()) {
return null;
}
TreeMap<Integer, CloudExpansion> has = new TreeMap<>();
boolean first = true;
if (remote.isEmpty()) return new HashMap<>();
Map<Integer, CloudExpansion> has = new TreeMap<>();
for (CloudExpansion ex : remote.values()) {
if (ex.hasExpansion()) {
if (first) {
first = false;
has.put(1, ex);
} else {
has.put(has.lastKey() + 1, ex);
}
}
if (!ex.hasExpansion()) continue;
has.put(has.size(), ex);
}
if (has.isEmpty()) {
return null;
}
return has;
}
public int getPagesAvailable(Map<Integer, CloudExpansion> map, int amount) {
if (map == null) {
return 0;
@@ -152,108 +150,54 @@ public class ExpansionCloudManager {
public Map<Integer, CloudExpansion> getPage(Map<Integer, CloudExpansion> map, int page, int size) {
if (map == null || map.size() == 0 || page > getPagesAvailable(map, size)) {
return null;
return new HashMap<>();
}
int end = size * page;
int start = end - size;
TreeMap<Integer, CloudExpansion> ex = new TreeMap<>();
Map<Integer, CloudExpansion> ex = new TreeMap<>();
IntStream.range(start, end).forEach(n -> ex.put(n, map.get(n)));
return ex;
}
public void fetch(boolean allowUnverified) {
plugin.getLogger().info("Fetching available expansion information...");
new BukkitRunnable() {
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
@Override
public void run() {
final String readJson = URLReader.read(API_URL);
final Map<String, CloudExpansion> data = GSON.fromJson(readJson, new TypeToken<Map<String, CloudExpansion>>() {
}.getType());
StringBuilder sb;
final List<CloudExpansion> unsorted = new ArrayList<>();
try {
data.forEach((name, cexp) -> {
URL site = new URL(API);
if ((allowUnverified || cexp.isVerified()) && cexp.getLatestVersion() != null && cexp.getVersion(cexp.getLatestVersion()) != null) {
cexp.setName(name);
HttpURLConnection connection = (HttpURLConnection) site.openConnection();
connection.setRequestMethod("GET");
connection.connect();
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
br.close();
connection.disconnect();
} catch (Exception e) {
return;
}
String json = sb.toString();
JSONParser parser = new JSONParser();
Object obj = null;
try {
obj = parser.parse(json);
} catch (ParseException e) {
e.printStackTrace();
}
if (obj == null) {
return;
}
List<CloudExpansion> unsorted = new ArrayList<>();
if (obj instanceof JSONObject) {
JSONObject jo = (JSONObject) obj;
for (Object o : jo.keySet()) {
JSONObject sub = (JSONObject) jo.get(o);
CloudExpansion ce = gson.fromJson(sub.toJSONString(), CloudExpansion.class);
if (!allowUnverified && !ce.isVerified()) {
continue;
}
if (ce.getLatestVersion() == null || ce.getVersion(ce.getLatestVersion()) == null) {
continue;
}
ce.setName(o.toString());
PlaceholderExpansion ex = plugin.getExpansionManager().getRegisteredExpansion(ce.getName());
PlaceholderExpansion ex = plugin.getExpansionManager().getRegisteredExpansion(cexp.getName());
if (ex != null && ex.isRegistered()) {
ce.setHasExpansion(true);
if (!ex.getVersion().equals(ce.getLatestVersion())) {
ce.setShouldUpdate(true);
cexp.setHasExpansion(true);
if (!ex.getVersion().equals(cexp.getLatestVersion())) {
cexp.setShouldUpdate(true);
}
}
unsorted.add(ce);
unsorted.add(cexp);
}
int count = 0;
});
unsorted.sort(Comparator.comparing(CloudExpansion::getLastUpdate).reversed());
int count = 0;
for (CloudExpansion e : unsorted) {
remote.put(count, e);
count++;
remote.put(count++, e);
}
plugin.getLogger().info(count + " placeholder expansions are available on the cloud.");
@@ -263,9 +207,13 @@ public class ExpansionCloudManager {
if (updates > 0) {
plugin.getLogger().info(updates + " installed expansions have updates available.");
}
});
}
}
}.runTaskAsynchronously(plugin);
public boolean isDownloading(String expansion) {
return downloading.contains(expansion);
}
private void download(URL url, String name) throws IOException {
@@ -280,7 +228,8 @@ public class ExpansionCloudManager {
is = urlConn.getInputStream();
fos = new FileOutputStream(dir.getAbsolutePath() + File.separator + "Expansion-" + name + ".jar");
fos = new FileOutputStream(
expansionsDir.getAbsolutePath() + File.separator + "Expansion-" + name + ".jar");
byte[] buffer = new byte[is.available()];
@@ -302,6 +251,7 @@ public class ExpansionCloudManager {
}
}
public void downloadExpansion(final String player, final CloudExpansion ex) {
downloadExpansion(player, ex, ex.getLatestVersion());
}
@@ -336,7 +286,8 @@ public class ExpansionCloudManager {
} catch (Exception e) {
plugin.getLogger().warning("Failed to download expansion: " + ex.getName() + " from: " + ver.getUrl());
plugin.getLogger()
.warning("Failed to download expansion: " + ex.getName() + " from: " + ver.getUrl());
Bukkit.getScheduler().runTask(plugin, () -> {
@@ -370,4 +321,25 @@ public class ExpansionCloudManager {
});
}
private static class URLReader {
static String read(String url) {
StringBuilder builder = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new URL(url).openStream()))) {
String inputLine;
while ((inputLine = reader.readLine()) != null) {
builder.append(inputLine);
}
} catch (Exception ex) {
builder.setLength(0);
}
return builder.toString();
}
}
}

View File

@@ -1,5 +1,9 @@
package me.clip.placeholderapi.updatechecker;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
import me.clip.placeholderapi.util.Msg;
import org.bukkit.Bukkit;
@@ -8,15 +12,10 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import javax.net.ssl.HttpsURLConnection;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
public class UpdateChecker implements Listener {
private PlaceholderAPIPlugin plugin;
private final int RESOURCE_ID = 6245;
private PlaceholderAPIPlugin plugin;
private String spigotVersion, pluginVersion;
private boolean updateAvailable;
@@ -25,7 +24,9 @@ public class UpdateChecker implements Listener {
pluginVersion = i.getDescription().getVersion();
}
public boolean hasUpdateAvailable() { return updateAvailable; }
public boolean hasUpdateAvailable() {
return updateAvailable;
}
public String getSpigotVersion() {
return spigotVersion;
@@ -34,7 +35,8 @@ public class UpdateChecker implements Listener {
public void fetch() {
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
try {
HttpsURLConnection con = (HttpsURLConnection) new URL("https://api.spigotmc.org/legacy/update.php?resource=" + RESOURCE_ID).openConnection();
HttpsURLConnection con = (HttpsURLConnection) new URL(
"https://api.spigotmc.org/legacy/update.php?resource=" + RESOURCE_ID).openConnection();
con.setRequestMethod("GET");
spigotVersion = new BufferedReader(new InputStreamReader(con.getInputStream())).readLine();
} catch (Exception ex) {
@@ -53,15 +55,19 @@ public class UpdateChecker implements Listener {
}
Bukkit.getScheduler().runTask(plugin, () -> {
plugin.getLogger().info("An update for PlaceholderAPI (v" + getSpigotVersion() + ") is available at:");
plugin.getLogger().info("https://www.spigotmc.org/resources/placeholderapi." + RESOURCE_ID + "/");
plugin.getLogger()
.info("An update for PlaceholderAPI (v" + getSpigotVersion() + ") is available at:");
plugin.getLogger()
.info("https://www.spigotmc.org/resources/placeholderapi." + RESOURCE_ID + "/");
Bukkit.getPluginManager().registerEvents(this, plugin);
});
});
}
private boolean spigotIsNewer() {
if (spigotVersion == null || spigotVersion.isEmpty()) return false;
if (spigotVersion == null || spigotVersion.isEmpty()) {
return false;
}
String plV = toReadable(pluginVersion);
String spV = toReadable(spigotVersion);
return plV.compareTo(spV) < 0;
@@ -77,8 +83,11 @@ public class UpdateChecker implements Listener {
@EventHandler(priority = EventPriority.MONITOR)
public void onJoin(PlayerJoinEvent e) {
if (e.getPlayer().hasPermission("placeholderapi.updatenotify")) {
Msg.msg(e.getPlayer(), "&bAn update for &fPlaceholder&7API &e(&fPlaceholder&7API &fv" + getSpigotVersion() + "&e)"
, "&bis available at &ehttps://www.spigotmc.org/resources/placeholderapi." + RESOURCE_ID + "/");
Msg.msg(e.getPlayer(),
"&bAn update for &fPlaceholder&7API &e(&fPlaceholder&7API &fv" + getSpigotVersion()
+ "&e)"
, "&bis available at &ehttps://www.spigotmc.org/resources/placeholderapi." + RESOURCE_ID
+ "/");
}
}
}

View File

@@ -20,8 +20,6 @@
*/
package me.clip.placeholderapi.util;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
import java.io.File;
import java.io.FilenameFilter;
import java.net.URL;
@@ -30,22 +28,27 @@ import java.util.ArrayList;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
public class FileUtil {
public static List<Class<?>> getClasses(String folder, Class<?> type) {
return getClasses(folder, null, type);
}
public static List<Class<?>> getClasses(String folder, String fileName, Class<?> type) {
List<Class<?>> list = new ArrayList<>();
try {
File f = new File(PlaceholderAPIPlugin.getInstance().getDataFolder(), folder);
if (!f.exists()) {
if (!f.mkdir()) {
PlaceholderAPIPlugin.getInstance().getLogger().severe("Failed to create " + folder + " folder!");
}
return list;
}
FilenameFilter fileNameFilter = (dir, name) -> {
int i = name.lastIndexOf('.');
return i > 0 && name.substring(i).equals(".jar");
if (fileName != null) {
return name.endsWith(".jar") && name.replace(".jar", "")
.equalsIgnoreCase(fileName.replace(".jar", ""));
}
return name.endsWith(".jar");
};
File[] jars = f.listFiles(fileNameFilter);
if (jars == null) {
@@ -55,7 +58,8 @@ public class FileUtil {
list = gather(file.toURI().toURL(), list, type);
}
return list;
} catch (Throwable t) {}
} catch (Throwable t) {
}
return null;
}
@@ -63,9 +67,7 @@ public class FileUtil {
if (list == null) {
list = new ArrayList<>();
}
try {
URLClassLoader cl = new URLClassLoader(new URL[]{jar}, clazz.getClassLoader());
JarInputStream jis = new JarInputStream(jar.openStream());
try (URLClassLoader cl = new URLClassLoader(new URL[]{jar}, clazz.getClassLoader()); JarInputStream jis = new JarInputStream(jar.openStream())) {
while (true) {
JarEntry j = jis.getNextJarEntry();
if (j == null) {
@@ -84,8 +86,6 @@ public class FileUtil {
}
}
}
cl.close();
jis.close();
} catch (Throwable t) {
}
return list;

View File

@@ -20,17 +20,21 @@
*/
package me.clip.placeholderapi.util;
import java.util.Arrays;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import java.util.Arrays;
public class Msg {
public static void msg(CommandSender s, String... msg) {
Arrays.stream(msg).map(Msg::color).forEach(s::sendMessage);
}
public static void broadcast(String... msg) {
Arrays.stream(msg).map(Msg::color).forEach(Bukkit::broadcastMessage);
}
public static String color(String text) {
return ChatColor.translateAlternateColorCodes('&', text);
}

View File

@@ -5,7 +5,7 @@
# Issues: https://github.com/PlaceholderAPI/PlaceholderAPI/issues
# Expansions: https://api.extendedclip.com/all/
# Wiki: https://github.com/PlaceholderAPI/PlaceholderAPI/wiki
# Discord: https://discordapp.com/invite/7sndK3q
# Discord: https://helpch.at/discord
# No placeholders are provided with this plugin by default.
# Download placeholders: /papi ecloud
check_updates: true

View File

@@ -3,6 +3,8 @@ main: me.clip.placeholderapi.PlaceholderAPIPlugin
version: ${project.version}
author: [extended_clip]
description: ${project.description}
api-version: 1.13
load: STARTUP
permissions:
placeholderapi.*:
description: ability to use all commands
@@ -15,9 +17,7 @@ permissions:
placeholderapi.reload: true
placeholderapi.ecloud: true
placeholderapi.parse: true
placeholderapi.injector.chat.bypass: true
placeholderapi.injector.signs.bypass: true
placeholderapi.injector.anvil.bypass: true
placeholderapi.register: true
placeholderapi.updatenotify: true
placeholderapi.list:
description: ability to use the list command
@@ -28,6 +28,9 @@ permissions:
placeholderapi.parse:
description: ability to use parse command
default: op
placeholderapi.register:
description: ability to register or unregister placeholder expansions
default: op
placeholderapi.ecloud:
description: allows the usage of ecloud commands
default: op