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 ### ### Intellij Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
# *.iml *.iml
# modules.xml # modules.xml
# .idea/misc.xml # .idea/misc.xml
# *.ipr # *.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 # Information
[PlaceholderAPI][spigot] is a plugin for Spigot servers that allows server owners to display information from various plugins with a uniform format. [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 ## Quick Links
- [CI Server][ci] - [CI Server][ci]
- [Expansions Website][expansions] - [Expansions cloud]
- [Placeholder List][placeholder-list] - [Placeholder List]
- [Spigot Page][spigot] - [Spigot Page][spigot]
- [Plugin Statistics][statistics] - [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"> 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> <modelVersion>4.0.0</modelVersion>
<groupId>me.clip</groupId> <groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId> <artifactId>placeholderapi</artifactId>
<version>2.9.1</version> <version>2.10.0</version>
<name>PlaceholderAPI</name> <name>PlaceholderAPI</name>
<description>An awesome placeholder provider!</description> <description>An awesome placeholder provider!</description>
<url>http://extendedclip.com</url> <url>http://extendedclip.com</url>
@@ -32,8 +34,13 @@
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId> <artifactId>spigot-api</artifactId>
<version>1.12.2-R0.1-SNAPSHOT</version> <version>1.14-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.bstats</groupId> <groupId>org.bstats</groupId>
@@ -92,6 +99,10 @@
<pattern>me.rayzr522</pattern> <pattern>me.rayzr522</pattern>
<shadedPattern>me.clip.placeholderapi.util</shadedPattern> <shadedPattern>me.clip.placeholderapi.util</shadedPattern>
</relocation> </relocation>
<relocation>
<pattern>com.google.code.gson</pattern>
<shadedPattern>me.clip.placeholderapi.libs.gson</shadedPattern>
</relocation>
</relocations> </relocations>
</configuration> </configuration>
</execution> </execution>

View File

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

View File

@@ -20,6 +20,10 @@
*/ */
package me.clip.placeholderapi; 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.commands.PlaceholderAPICommands;
import me.clip.placeholderapi.configuration.PlaceholderAPIConfig; import me.clip.placeholderapi.configuration.PlaceholderAPIConfig;
import me.clip.placeholderapi.expansion.ExpansionManager; import me.clip.placeholderapi.expansion.ExpansionManager;
@@ -34,38 +38,85 @@ import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin; 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... * Yes I have a shit load of work to do...
* *
* @author Ryan McCarthy * @author Ryan McCarthy
*
*/ */
public class PlaceholderAPIPlugin extends JavaPlugin { public class PlaceholderAPIPlugin extends JavaPlugin {
private static PlaceholderAPIPlugin instance; private static PlaceholderAPIPlugin instance;
private PlaceholderAPIConfig config;
private ExpansionManager expansionManager;
private ExpansionCloudManager expansionCloud;
private static SimpleDateFormat dateFormat; private static SimpleDateFormat dateFormat;
private static String booleanTrue; private static String booleanTrue;
private static String booleanFalse; private static String booleanFalse;
private static Version serverVersion; private static Version serverVersion;
private PlaceholderAPIConfig config;
private ExpansionManager expansionManager;
private ExpansionCloudManager expansionCloud;
private long startTime; 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 @Override
public void onLoad() { public void onLoad() {
startTime = System.currentTimeMillis(); startTime = System.currentTimeMillis();
@@ -115,7 +166,9 @@ public class PlaceholderAPIPlugin extends JavaPlugin {
} else if (!cloudEnabled) { } else if (!cloudEnabled) {
enableCloud(); 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() { private void setupOptions() {
@@ -136,9 +189,11 @@ public class PlaceholderAPIPlugin extends JavaPlugin {
private void setupMetrics() { private void setupMetrics() {
Metrics m = new Metrics(this); 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", () -> { m.addCustomChart(new Metrics.AdvancedPie("expansions_used", () -> {
Map<String, Integer> map = new HashMap<>(); 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() { public void enableCloud() {
if (expansionCloud == null) { if (expansionCloud == null) {
expansionCloud = new ExpansionCloudManager(this); 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. * Obtain the configuration class for PlaceholderAPI.
* *
@@ -259,7 +250,8 @@ public class PlaceholderAPIPlugin extends JavaPlugin {
} }
public String getUptime() { 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() { public long getUptimeMillis() {

View File

@@ -27,7 +27,9 @@ public abstract class PlaceholderHook {
/** /**
* called when a placeholder value is requested from this hook * 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 * @param params String passed to the hook to determine what value to return
* @return value for the requested player and params * @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 * 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 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 * @param params String passed to the hook to determine what value to return
* @return value for the requested player and params * @return value for the requested player and params

View File

@@ -20,9 +20,15 @@
*/ */
package me.clip.placeholderapi; 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.ExpansionUnregisterEvent;
import me.clip.placeholderapi.events.PlaceholderHookUnloadEvent; import me.clip.placeholderapi.expansion.Cacheable;
import me.clip.placeholderapi.expansion.*; 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.expansion.cloud.CloudExpansion;
import me.clip.placeholderapi.external.EZPlaceholderHook; import me.clip.placeholderapi.external.EZPlaceholderHook;
import org.bukkit.Bukkit; 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.PluginDisableEvent;
import org.bukkit.event.server.PluginEnableEvent; import org.bukkit.event.server.PluginEnableEvent;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class PlaceholderListener implements Listener { public class PlaceholderListener implements Listener {
@@ -52,7 +54,7 @@ public class PlaceholderListener implements Listener {
public void onExpansionUnregister(ExpansionUnregisterEvent event) { public void onExpansionUnregister(ExpansionUnregisterEvent event) {
if (event.getExpansion() instanceof Listener) { if (event.getExpansion() instanceof Listener) {
HandlerList.unregisterAll((Listener)event.getExpansion()); HandlerList.unregisterAll((Listener) event.getExpansion());
} }
if (event.getExpansion() instanceof Taskable) { if (event.getExpansion() instanceof Taskable) {
@@ -65,7 +67,8 @@ public class PlaceholderListener implements Listener {
if (plugin.getExpansionCloud() != null) { if (plugin.getExpansionCloud() != null) {
CloudExpansion ex = plugin.getExpansionCloud().getCloudExpansion(event.getExpansion().getName()); CloudExpansion ex = plugin.getExpansionCloud()
.getCloudExpansion(event.getExpansion().getName());
if (ex != null) { if (ex != null) {
ex.setHasExpansion(false); ex.setHasExpansion(false);
@@ -114,7 +117,8 @@ public class PlaceholderListener implements Listener {
if (h.getPluginName().equalsIgnoreCase(n)) { if (h.getPluginName().equalsIgnoreCase(n)) {
if (PlaceholderAPI.unregisterPlaceholderHook(hook.getKey())) { 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; break;
} }
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -20,6 +20,12 @@
*/ */
package me.clip.placeholderapi.expansion; 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.PlaceholderAPI;
import me.clip.placeholderapi.PlaceholderAPIPlugin; import me.clip.placeholderapi.PlaceholderAPIPlugin;
import me.clip.placeholderapi.PlaceholderHook; import me.clip.placeholderapi.PlaceholderHook;
@@ -29,20 +35,17 @@ import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.event.Listener; 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 { public final class ExpansionManager {
private PlaceholderAPIPlugin plugin;
private final Map<String, PlaceholderExpansion> cache = new HashMap<>(); private final Map<String, PlaceholderExpansion> cache = new HashMap<>();
private PlaceholderAPIPlugin plugin;
public ExpansionManager(PlaceholderAPIPlugin instance) { public ExpansionManager(PlaceholderAPIPlugin instance) {
plugin = instance; plugin = instance;
File f = new File(PlaceholderAPIPlugin.getInstance().getDataFolder(), "expansions");
if (!f.exists()) {
f.mkdirs();
}
} }
public void clean() { public void clean() {
@@ -68,25 +71,19 @@ public final class ExpansionManager {
return null; return null;
} }
public boolean registerExpansion(PlaceholderExpansion c) { public boolean registerExpansion(PlaceholderExpansion expansion) {
if (expansion == null || expansion.getIdentifier() == null) {
if (c == null || c.getIdentifier() == null) {
return false; return false;
} }
if (expansion instanceof Configurable) {
if (c instanceof Configurable) { Map<String, Object> defaults = ((Configurable) expansion).getDefaults();
String pre = "expansions." + expansion.getIdentifier() + ".";
Map<String, Object> defaults = ((Configurable) c).getDefaults();
String pre = "expansions." + c.getIdentifier() + ".";
FileConfiguration cfg = plugin.getConfig(); FileConfiguration cfg = plugin.getConfig();
boolean save = false; boolean save = false;
for (Entry<String, Object> entries : defaults.entrySet()) { for (Entry<String, Object> entries : defaults.entrySet()) {
if (entries.getKey() == null || entries.getKey().isEmpty()) { if (entries.getKey() == null || entries.getKey().isEmpty()) {
continue; continue;
} }
if (entries.getValue() == null) { if (entries.getValue() == null) {
if (cfg.contains(pre + entries.getKey())) { if (cfg.contains(pre + entries.getKey())) {
save = true; save = true;
@@ -99,70 +96,91 @@ public final class ExpansionManager {
} }
} }
} }
if (save) { if (save) {
plugin.saveConfig(); plugin.saveConfig();
plugin.reloadConfig(); plugin.reloadConfig();
} }
} }
if (expansion instanceof VersionSpecific) {
if (c instanceof VersionSpecific) { VersionSpecific nms = (VersionSpecific) expansion;
VersionSpecific nms = (VersionSpecific) c;
if (!nms.isCompatibleWith(PlaceholderAPIPlugin.getServerVersion())) { if (!nms.isCompatibleWith(PlaceholderAPIPlugin.getServerVersion())) {
plugin.getLogger().info("Your server version is not compatible with expansion: " + c.getIdentifier() plugin.getLogger()
+ " version: " + c.getVersion()); .info(
"Your server version is not compatible with expansion: " + expansion.getIdentifier()
+ " version: " + expansion.getVersion());
return false; return false;
} }
} }
if (!expansion.canRegister()) {
if (!c.canRegister()) { if (expansion.getRequiredPlugin() != null) {
if (c.getRequiredPlugin() != null) { cache.put(expansion.getRequiredPlugin().toLowerCase(), expansion);
cache.put(c.getRequiredPlugin().toLowerCase(), c);
} }
return false; return false;
} }
if (!expansion.register()) {
if (!c.register()) {
return false; return false;
} }
if (expansion instanceof Listener) {
if (c instanceof Listener) { Listener l = (Listener) expansion;
Listener l = (Listener) c;
Bukkit.getPluginManager().registerEvents(l, plugin); Bukkit.getPluginManager().registerEvents(l, plugin);
} }
plugin.getLogger().info("Successfully registered expansion: " + expansion.getIdentifier());
plugin.getLogger().info("Successfully registered expansion: " + c.getIdentifier()); if (expansion instanceof Taskable) {
((Taskable) expansion).start();
if (c instanceof Taskable) { }
((Taskable) c).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; 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) { if (plugin == null) {
return; return;
} }
List<Class<?>> subs = FileUtil.getClasses("expansions", null, PlaceholderExpansion.class);
List<Class<?>> subs = FileUtil.getClasses("expansions", PlaceholderExpansion.class);
if (subs == null || subs.isEmpty()) { if (subs == null || subs.isEmpty()) {
return; return;
} }
for (Class<?> klass : subs) { for (Class<?> klass : subs) {
PlaceholderExpansion ex = createInstance(klass);
if (klass == null) { if (ex != null) {
continue; registerExpansion(ex);
}
}
} }
try { private PlaceholderExpansion createInstance(Class<?> klass) {
if (klass == null) {
return null;
}
PlaceholderExpansion ex = null; PlaceholderExpansion ex = null;
if (!PlaceholderExpansion.class.isAssignableFrom(klass)) {
return null;
}
try {
Constructor<?>[] c = klass.getConstructors(); Constructor<?>[] c = klass.getConstructors();
if (c.length == 0) { if (c.length == 0) {
ex = (PlaceholderExpansion) klass.newInstance(); ex = (PlaceholderExpansion) klass.newInstance();
} else { } 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) { } 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()); 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_9_R2("v1_9_R2"),
SPIGOT_1_10_R1("v1_10_R1"), SPIGOT_1_10_R1("v1_10_R1"),
SPIGOT_1_11_R1("v1_11_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; private String version;
@@ -42,10 +45,6 @@ public enum NMSVersion {
this.version = version; this.version = version;
} }
public String getVersion() {
return version;
}
public static NMSVersion getVersion(String version) { public static NMSVersion getVersion(String version) {
for (NMSVersion v : values()) { for (NMSVersion v : values()) {
if (v.getVersion().equalsIgnoreCase(version)) { if (v.getVersion().equalsIgnoreCase(version)) {
@@ -54,4 +53,9 @@ public enum NMSVersion {
} }
return NMSVersion.UNKNOWN; return NMSVersion.UNKNOWN;
} }
public String getVersion() {
return version;
}
} }

View File

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

View File

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

View File

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

View File

@@ -21,17 +21,18 @@
package me.clip.placeholderapi.expansion; package me.clip.placeholderapi.expansion;
/** /**
* Placeholder expansions which use NMS code should be version specific. * Placeholder expansions which use NMS code should be version specific. Implementing this class
* Implementing this class allows you to perform checks based on the version the server is running. * allows you to perform checks based on the version the server is running. The isCompatibleWith
* The isCompatibleWith method will be passed the server version and allow you to return if your expansion is compatible with that version. * method will be passed the server version and allow you to return if your expansion is compatible
* @author Ryan McCarthy * with that version.
* *
* @author Ryan McCarthy
*/ */
public interface VersionSpecific { public interface VersionSpecific {
/** /**
* This method is called before the expansion is attempted to be registered * This method is called before the expansion is attempted to be registered The server version
* The server version will be passed to this method so you know what version the server is currently running. * 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. * @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; package me.clip.placeholderapi.expansion.cloud;
import me.clip.placeholderapi.util.TimeUtil;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import me.clip.placeholderapi.util.TimeUtil;
public class CloudExpansion { public class CloudExpansion {
@@ -173,6 +172,7 @@ public class CloudExpansion {
} }
public class Version { public class Version {
private String url, version, release_notes; private String url, version, release_notes;
public String getUrl() { public String getUrl() {

View File

@@ -21,118 +21,116 @@
package me.clip.placeholderapi.expansion.cloud; package me.clip.placeholderapi.expansion.cloud;
import com.google.gson.Gson; 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.io.BufferedReader;
import java.net.HttpURLConnection; 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.URL;
import java.net.URLConnection; import java.net.URLConnection;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.IntStream; 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 { public class ExpansionCloudManager {
private PlaceholderAPIPlugin plugin; private static final String API_URL = "http://api.extendedclip.com/v2/";
private final String API = "http://api.extendedclip.com/v2/"; private static final Gson GSON = new Gson();
private final File dir;
private final TreeMap<Integer, CloudExpansion> remote = new TreeMap<>();
private final List<String> downloading = new ArrayList<>();
private Gson gson;
public ExpansionCloudManager(PlaceholderAPIPlugin instance) {
plugin = instance; private final PlaceholderAPIPlugin plugin;
gson = new Gson(); private final File expansionsDir;
dir = new File(instance.getDataFolder() + File.separator + "expansions");
if (!dir.exists()) { private final List<String> downloading = new ArrayList<>();
try { private final Map<Integer, CloudExpansion> remote = new TreeMap<>();
dir.mkdirs();
} catch (Exception ex) {
ex.printStackTrace(); 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() { public void clean() {
remote.clear(); remote.clear();
downloading.clear(); downloading.clear();
} }
public boolean isDownloading(String expansion) {
return downloading.contains(expansion);
}
public Map<Integer, CloudExpansion> getCloudExpansions() { public Map<Integer, CloudExpansion> getCloudExpansions() {
return remote; return remote;
} }
public CloudExpansion getCloudExpansion(String name) { 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() { 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() { public int getToUpdateCount() {
return PlaceholderAPI.getExpansions().stream().filter(ex -> getCloudExpansion(ex.getName()) != null && getCloudExpansion(ex.getName()).shouldUpdate()).count(); return ((int) PlaceholderAPI.getExpansions()
.stream()
.filter(ex -> getCloudExpansion(ex.getName()) != null && getCloudExpansion(ex.getName()).shouldUpdate())
.count());
} }
public Map<Integer, CloudExpansion> getAllByAuthor(String author) { public Map<Integer, CloudExpansion> getAllByAuthor(String author) {
if (remote.isEmpty()) { if (remote.isEmpty()) return new HashMap<>();
return null;
} Map<Integer, CloudExpansion> byAuthor = new TreeMap<>();
TreeMap<Integer, CloudExpansion> byAuthor = new TreeMap<>();
boolean first = true;
for (CloudExpansion ex : remote.values()) { for (CloudExpansion ex : remote.values()) {
if (ex.getAuthor().equalsIgnoreCase(author)) { if (!ex.getAuthor().equalsIgnoreCase(author)) continue;
if (first) {
first = false; byAuthor.put(byAuthor.size(), ex);
byAuthor.put(0, ex);
} else {
byAuthor.put(byAuthor.lastKey() + 1, ex);
}
}
} }
if (byAuthor.isEmpty()) {
return null;
}
return byAuthor; return byAuthor;
} }
public Map<Integer, CloudExpansion> getAllInstalled() { public Map<Integer, CloudExpansion> getAllInstalled() {
if (remote.isEmpty()) { if (remote.isEmpty()) return new HashMap<>();
return null;
} Map<Integer, CloudExpansion> has = new TreeMap<>();
TreeMap<Integer, CloudExpansion> has = new TreeMap<>();
boolean first = true;
for (CloudExpansion ex : remote.values()) { for (CloudExpansion ex : remote.values()) {
if (ex.hasExpansion()) { if (!ex.hasExpansion()) continue;
if (first) {
first = false; has.put(has.size(), ex);
has.put(1, ex);
} else {
has.put(has.lastKey() + 1, ex);
}
}
} }
if (has.isEmpty()) {
return null;
}
return has; return has;
} }
public int getPagesAvailable(Map<Integer, CloudExpansion> map, int amount) { public int getPagesAvailable(Map<Integer, CloudExpansion> map, int amount) {
if (map == null) { if (map == null) {
return 0; return 0;
@@ -152,108 +150,54 @@ public class ExpansionCloudManager {
public Map<Integer, CloudExpansion> getPage(Map<Integer, CloudExpansion> map, int page, int size) { public Map<Integer, CloudExpansion> getPage(Map<Integer, CloudExpansion> map, int page, int size) {
if (map == null || map.size() == 0 || page > getPagesAvailable(map, size)) { if (map == null || map.size() == 0 || page > getPagesAvailable(map, size)) {
return null; return new HashMap<>();
} }
int end = size * page; int end = size * page;
int start = end - size; 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))); IntStream.range(start, end).forEach(n -> ex.put(n, map.get(n)));
return ex; return ex;
} }
public void fetch(boolean allowUnverified) { public void fetch(boolean allowUnverified) {
plugin.getLogger().info("Fetching available expansion information..."); plugin.getLogger().info("Fetching available expansion information...");
new BukkitRunnable() { plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
@Override final String readJson = URLReader.read(API_URL);
public void run() { 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(); PlaceholderExpansion ex = plugin.getExpansionManager().getRegisteredExpansion(cexp.getName());
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());
if (ex != null && ex.isRegistered()) { if (ex != null && ex.isRegistered()) {
ce.setHasExpansion(true); cexp.setHasExpansion(true);
if (!ex.getVersion().equals(ce.getLatestVersion())) { if (!ex.getVersion().equals(cexp.getLatestVersion())) {
ce.setShouldUpdate(true); cexp.setShouldUpdate(true);
} }
} }
unsorted.add(ce); unsorted.add(cexp);
} }
});
int count = 0;
unsorted.sort(Comparator.comparing(CloudExpansion::getLastUpdate).reversed()); unsorted.sort(Comparator.comparing(CloudExpansion::getLastUpdate).reversed());
int count = 0;
for (CloudExpansion e : unsorted) { for (CloudExpansion e : unsorted) {
remote.put(count, e); remote.put(count++, e);
count++;
} }
plugin.getLogger().info(count + " placeholder expansions are available on the cloud."); plugin.getLogger().info(count + " placeholder expansions are available on the cloud.");
@@ -263,9 +207,13 @@ public class ExpansionCloudManager {
if (updates > 0) { if (updates > 0) {
plugin.getLogger().info(updates + " installed expansions have updates available."); 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 { private void download(URL url, String name) throws IOException {
@@ -280,7 +228,8 @@ public class ExpansionCloudManager {
is = urlConn.getInputStream(); 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()]; byte[] buffer = new byte[is.available()];
@@ -302,6 +251,7 @@ public class ExpansionCloudManager {
} }
} }
public void downloadExpansion(final String player, final CloudExpansion ex) { public void downloadExpansion(final String player, final CloudExpansion ex) {
downloadExpansion(player, ex, ex.getLatestVersion()); downloadExpansion(player, ex, ex.getLatestVersion());
} }
@@ -336,7 +286,8 @@ public class ExpansionCloudManager {
} catch (Exception e) { } 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, () -> { 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; 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.PlaceholderAPIPlugin;
import me.clip.placeholderapi.util.Msg; import me.clip.placeholderapi.util.Msg;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@@ -8,15 +12,10 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent; 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 { public class UpdateChecker implements Listener {
private PlaceholderAPIPlugin plugin;
private final int RESOURCE_ID = 6245; private final int RESOURCE_ID = 6245;
private PlaceholderAPIPlugin plugin;
private String spigotVersion, pluginVersion; private String spigotVersion, pluginVersion;
private boolean updateAvailable; private boolean updateAvailable;
@@ -25,7 +24,9 @@ public class UpdateChecker implements Listener {
pluginVersion = i.getDescription().getVersion(); pluginVersion = i.getDescription().getVersion();
} }
public boolean hasUpdateAvailable() { return updateAvailable; } public boolean hasUpdateAvailable() {
return updateAvailable;
}
public String getSpigotVersion() { public String getSpigotVersion() {
return spigotVersion; return spigotVersion;
@@ -34,7 +35,8 @@ public class UpdateChecker implements Listener {
public void fetch() { public void fetch() {
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
try { 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"); con.setRequestMethod("GET");
spigotVersion = new BufferedReader(new InputStreamReader(con.getInputStream())).readLine(); spigotVersion = new BufferedReader(new InputStreamReader(con.getInputStream())).readLine();
} catch (Exception ex) { } catch (Exception ex) {
@@ -53,15 +55,19 @@ public class UpdateChecker implements Listener {
} }
Bukkit.getScheduler().runTask(plugin, () -> { Bukkit.getScheduler().runTask(plugin, () -> {
plugin.getLogger().info("An update for PlaceholderAPI (v" + getSpigotVersion() + ") is available at:"); plugin.getLogger()
plugin.getLogger().info("https://www.spigotmc.org/resources/placeholderapi." + RESOURCE_ID + "/"); .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); Bukkit.getPluginManager().registerEvents(this, plugin);
}); });
}); });
} }
private boolean spigotIsNewer() { private boolean spigotIsNewer() {
if (spigotVersion == null || spigotVersion.isEmpty()) return false; if (spigotVersion == null || spigotVersion.isEmpty()) {
return false;
}
String plV = toReadable(pluginVersion); String plV = toReadable(pluginVersion);
String spV = toReadable(spigotVersion); String spV = toReadable(spigotVersion);
return plV.compareTo(spV) < 0; return plV.compareTo(spV) < 0;
@@ -71,14 +77,17 @@ public class UpdateChecker implements Listener {
if (version.contains("-DEV-")) { if (version.contains("-DEV-")) {
version = version.split("-DEV-")[0]; version = version.split("-DEV-")[0];
} }
return version.replaceAll("\\.",""); return version.replaceAll("\\.", "");
} }
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
public void onJoin(PlayerJoinEvent e) { public void onJoin(PlayerJoinEvent e) {
if (e.getPlayer().hasPermission("placeholderapi.updatenotify")) { if (e.getPlayer().hasPermission("placeholderapi.updatenotify")) {
Msg.msg(e.getPlayer(), "&bAn update for &fPlaceholder&7API &e(&fPlaceholder&7API &fv" + getSpigotVersion() + "&e)" Msg.msg(e.getPlayer(),
, "&bis available at &ehttps://www.spigotmc.org/resources/placeholderapi." + RESOURCE_ID + "/"); "&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; package me.clip.placeholderapi.util;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
import java.io.File; import java.io.File;
import java.io.FilenameFilter; import java.io.FilenameFilter;
import java.net.URL; import java.net.URL;
@@ -30,22 +28,27 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarInputStream; import java.util.jar.JarInputStream;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
public class FileUtil { public class FileUtil {
public static List<Class<?>> getClasses(String folder, Class<?> type) { 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<>(); List<Class<?>> list = new ArrayList<>();
try { try {
File f = new File(PlaceholderAPIPlugin.getInstance().getDataFolder(), folder); File f = new File(PlaceholderAPIPlugin.getInstance().getDataFolder(), folder);
if (!f.exists()) { if (!f.exists()) {
if (!f.mkdir()) {
PlaceholderAPIPlugin.getInstance().getLogger().severe("Failed to create " + folder + " folder!");
}
return list; return list;
} }
FilenameFilter fileNameFilter = (dir, name) -> { FilenameFilter fileNameFilter = (dir, name) -> {
int i = name.lastIndexOf('.'); if (fileName != null) {
return i > 0 && name.substring(i).equals(".jar"); return name.endsWith(".jar") && name.replace(".jar", "")
.equalsIgnoreCase(fileName.replace(".jar", ""));
}
return name.endsWith(".jar");
}; };
File[] jars = f.listFiles(fileNameFilter); File[] jars = f.listFiles(fileNameFilter);
if (jars == null) { if (jars == null) {
@@ -55,7 +58,8 @@ public class FileUtil {
list = gather(file.toURI().toURL(), list, type); list = gather(file.toURI().toURL(), list, type);
} }
return list; return list;
} catch (Throwable t) {} } catch (Throwable t) {
}
return null; return null;
} }
@@ -63,9 +67,7 @@ public class FileUtil {
if (list == null) { if (list == null) {
list = new ArrayList<>(); list = new ArrayList<>();
} }
try { try (URLClassLoader cl = new URLClassLoader(new URL[]{jar}, clazz.getClassLoader()); JarInputStream jis = new JarInputStream(jar.openStream())) {
URLClassLoader cl = new URLClassLoader(new URL[]{jar}, clazz.getClassLoader());
JarInputStream jis = new JarInputStream(jar.openStream());
while (true) { while (true) {
JarEntry j = jis.getNextJarEntry(); JarEntry j = jis.getNextJarEntry();
if (j == null) { if (j == null) {
@@ -84,8 +86,6 @@ public class FileUtil {
} }
} }
} }
cl.close();
jis.close();
} catch (Throwable t) { } catch (Throwable t) {
} }
return list; return list;

View File

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

View File

@@ -25,7 +25,7 @@ public class TimeUtil {
public static String getRemaining(int seconds, TimeFormat type) { public static String getRemaining(int seconds, TimeFormat type) {
if (seconds < 60) { if (seconds < 60) {
switch(type) { switch (type) {
case DAYS: case DAYS:
return "0"; return "0";
case HOURS: case HOURS:
@@ -42,7 +42,7 @@ public class TimeUtil {
int s = 60 * minutes; int s = 60 * minutes;
int secondsLeft = seconds - s; int secondsLeft = seconds - s;
if (minutes < 60) { if (minutes < 60) {
switch(type) { switch (type) {
case DAYS: case DAYS:
return "0"; return "0";
case HOURS: case HOURS:
@@ -59,7 +59,7 @@ public class TimeUtil {
int hours = minutes / 60; int hours = minutes / 60;
int inMins = 60 * hours; int inMins = 60 * hours;
int leftOver = minutes - inMins; int leftOver = minutes - inMins;
switch(type) { switch (type) {
case DAYS: case DAYS:
return "0"; return "0";
case HOURS: case HOURS:
@@ -110,7 +110,7 @@ public class TimeUtil {
public static String getTime(int seconds) { public static String getTime(int seconds) {
if (seconds < 60) { if (seconds < 60) {
return seconds+"s"; return seconds + "s";
} }
int minutes = seconds / 60; int minutes = seconds / 60;
@@ -118,44 +118,44 @@ public class TimeUtil {
int secondsLeft = seconds - s; int secondsLeft = seconds - s;
if (minutes < 60) { if (minutes < 60) {
if (secondsLeft > 0) { if (secondsLeft > 0) {
return String.valueOf(minutes+"m "+secondsLeft+"s"); return String.valueOf(minutes + "m " + secondsLeft + "s");
} else { } else {
return String.valueOf(minutes+"m"); return String.valueOf(minutes + "m");
} }
} }
if (minutes < 1440) { if (minutes < 1440) {
String time; String time;
int hours = minutes / 60; int hours = minutes / 60;
time = hours+"h"; time = hours + "h";
int inMins = 60 * hours; int inMins = 60 * hours;
int leftOver = minutes - inMins; int leftOver = minutes - inMins;
if (leftOver >= 1) { if (leftOver >= 1) {
time = time+" "+leftOver+"m"; time = time + " " + leftOver + "m";
} }
if (secondsLeft > 0) { if (secondsLeft > 0) {
time = time+" "+secondsLeft+"s"; time = time + " " + secondsLeft + "s";
} }
return time; return time;
} }
String time; String time;
int days = minutes / 1440; int days = minutes / 1440;
time = days+"d"; time = days + "d";
int inMins = 1440 * days; int inMins = 1440 * days;
int leftOver = minutes - inMins; int leftOver = minutes - inMins;
if (leftOver >= 1) { if (leftOver >= 1) {
if (leftOver < 60) { if (leftOver < 60) {
time = time+" "+leftOver+"m"; time = time + " " + leftOver + "m";
} else { } else {
int hours = leftOver / 60; int hours = leftOver / 60;
time = time+" "+hours+"h"; time = time + " " + hours + "h";
int hoursInMins = 60 * hours; int hoursInMins = 60 * hours;
int minsLeft = leftOver - hoursInMins; int minsLeft = leftOver - hoursInMins;
time = time+" "+minsLeft+"m"; time = time + " " + minsLeft + "m";
} }
} }
if (secondsLeft > 0) { if (secondsLeft > 0) {
time = time+" "+secondsLeft+"s"; time = time + " " + secondsLeft + "s";
} }
return time; return time;
} }

View File

@@ -5,7 +5,7 @@
# Issues: https://github.com/PlaceholderAPI/PlaceholderAPI/issues # Issues: https://github.com/PlaceholderAPI/PlaceholderAPI/issues
# Expansions: https://api.extendedclip.com/all/ # Expansions: https://api.extendedclip.com/all/
# Wiki: https://github.com/PlaceholderAPI/PlaceholderAPI/wiki # 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. # No placeholders are provided with this plugin by default.
# Download placeholders: /papi ecloud # Download placeholders: /papi ecloud
check_updates: true check_updates: true

View File

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