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

213
pom.xml
View File

@@ -1,108 +1,119 @@
<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"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xmlns="http://maven.apache.org/POM/4.0.0"
<modelVersion>4.0.0</modelVersion> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<groupId>me.clip</groupId> <modelVersion>4.0.0</modelVersion>
<artifactId>placeholderapi</artifactId>
<version>2.9.1</version> <groupId>me.clip</groupId>
<name>PlaceholderAPI</name> <artifactId>placeholderapi</artifactId>
<description>An awesome placeholder provider!</description>
<url>http://extendedclip.com</url>
<properties> <version>2.10.0</version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <name>PlaceholderAPI</name>
</properties> <description>An awesome placeholder provider!</description>
<url>http://extendedclip.com</url>
<repositories> <properties>
<repository> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<id>spigot-repo</id> </properties>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>bstats-repo</id>
<url>http://repo.bstats.org/content/repositories/releases/</url>
</repository>
<repository>
<id>rayzr-repo</id>
<url>https://cdn.rawgit.com/Rayzr522/maven-repo/master/</url>
</repository>
</repositories>
<dependencies> <repositories>
<dependency> <repository>
<groupId>org.spigotmc</groupId> <id>spigot-repo</id>
<artifactId>spigot-api</artifactId> <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
<version>1.12.2-R0.1-SNAPSHOT</version> </repository>
<scope>provided</scope> <repository>
</dependency> <id>bstats-repo</id>
<dependency> <url>http://repo.bstats.org/content/repositories/releases/</url>
<groupId>org.bstats</groupId> </repository>
<artifactId>bstats-bukkit</artifactId> <repository>
<version>1.2</version> <id>rayzr-repo</id>
<scope>compile</scope> <url>https://cdn.rawgit.com/Rayzr522/maven-repo/master/</url>
</dependency> </repository>
<dependency> </repositories>
<groupId>me.rayzr522</groupId>
<artifactId>jsonmessage</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build> <dependencies>
<defaultGoal>clean package</defaultGoal> <dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.14-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>org.bstats</groupId>
<artifactId>bstats-bukkit</artifactId>
<version>1.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>me.rayzr522</groupId>
<artifactId>jsonmessage</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<plugins> <build>
<plugin> <defaultGoal>clean package</defaultGoal>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId> <plugins>
<version>2.3.2</version> <plugin>
<configuration> <groupId>org.apache.maven.plugins</groupId>
<finalName>${project.name}-${project.version}</finalName> <artifactId>maven-jar-plugin</artifactId>
</configuration> <version>2.3.2</version>
</plugin> <configuration>
<plugin> <finalName>${project.name}-${project.version}</finalName>
<groupId>org.apache.maven.plugins</groupId> </configuration>
<artifactId>maven-compiler-plugin</artifactId> </plugin>
<version>3.7.0</version> <plugin>
<configuration> <groupId>org.apache.maven.plugins</groupId>
<source>1.8</source> <artifactId>maven-compiler-plugin</artifactId>
<target>1.8</target> <version>3.7.0</version>
</configuration> <configuration>
</plugin> <source>1.8</source>
<plugin> <target>1.8</target>
<groupId>org.apache.maven.plugins</groupId> </configuration>
<artifactId>maven-shade-plugin</artifactId> </plugin>
<version>3.1.0</version> <plugin>
<executions> <groupId>org.apache.maven.plugins</groupId>
<execution> <artifactId>maven-shade-plugin</artifactId>
<phase>package</phase> <version>3.1.0</version>
<goals> <executions>
<goal>shade</goal> <execution>
</goals> <phase>package</phase>
<configuration> <goals>
<minimizeJar>false</minimizeJar> <goal>shade</goal>
<createDependencyReducedPom>false</createDependencyReducedPom> </goals>
<relocations> <configuration>
<relocation> <minimizeJar>false</minimizeJar>
<pattern>org.bstats</pattern> <createDependencyReducedPom>false</createDependencyReducedPom>
<shadedPattern>me.clip.placeholderapi.metrics</shadedPattern> <relocations>
</relocation> <relocation>
<relocation> <pattern>org.bstats</pattern>
<pattern>me.rayzr522</pattern> <shadedPattern>me.clip.placeholderapi.metrics</shadedPattern>
<shadedPattern>me.clip.placeholderapi.util</shadedPattern> </relocation>
</relocation> <relocation>
</relocations> <pattern>me.rayzr522</pattern>
</configuration> <shadedPattern>me.clip.placeholderapi.util</shadedPattern>
</execution> </relocation>
</executions> <relocation>
</plugin> <pattern>com.google.code.gson</pattern>
</plugins> <shadedPattern>me.clip.placeholderapi.libs.gson</shadedPattern>
<resources> </relocation>
<resource> </relocations>
<directory>src/main/resources</directory> </configuration>
<filtering>true</filtering> </execution>
</resource> </executions>
</resources> </plugin>
</build> </plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project> </project>

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,235 +38,223 @@ 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 static SimpleDateFormat dateFormat;
private static String booleanTrue;
private static String booleanFalse;
private static Version serverVersion;
private PlaceholderAPIConfig config;
private ExpansionManager expansionManager;
private ExpansionCloudManager expansionCloud;
private long startTime;
private PlaceholderAPIConfig config; 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);
}
private ExpansionManager expansionManager; /**
* 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;
}
private ExpansionCloudManager expansionCloud; /**
* 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");
}
private static SimpleDateFormat dateFormat; /**
* 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";
}
private static String booleanTrue; /**
* 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";
}
private static String booleanFalse; public static Version getServerVersion() {
return serverVersion != null ? serverVersion : getVersion();
}
private static Version serverVersion; @Override
public void onLoad() {
startTime = System.currentTimeMillis();
instance = this;
serverVersion = getVersion();
config = new PlaceholderAPIConfig(this);
expansionManager = new ExpansionManager(this);
}
private long startTime; @Override
public void onEnable() {
config.loadDefConfig();
setupOptions();
getCommand("placeholderapi").setExecutor(new PlaceholderAPICommands(this));
new PlaceholderListener(this);
getLogger().info("Placeholder expansion registration initializing...");
expansionManager.registerAllExpansions();
if (config.checkUpdates()) {
new UpdateChecker(this).fetch();
}
if (config.isCloudEnabled()) {
enableCloud();
}
setupMetrics();
}
@Override @Override
public void onLoad() { public void onDisable() {
startTime = System.currentTimeMillis(); disableCloud();
instance = this; PlaceholderAPI.unregisterAll();
serverVersion = getVersion(); expansionManager.clean();
config = new PlaceholderAPIConfig(this); expansionManager = null;
expansionManager = new ExpansionManager(this); Bukkit.getScheduler().cancelTasks(this);
} serverVersion = null;
instance = null;
}
@Override public void reloadConf(CommandSender s) {
public void onEnable() { boolean cloudEnabled = this.expansionCloud != null;
config.loadDefConfig(); expansionManager.clean();
setupOptions(); PlaceholderAPI.unregisterAllProvidedExpansions();
getCommand("placeholderapi").setExecutor(new PlaceholderAPICommands(this)); reloadConfig();
new PlaceholderListener(this); setupOptions();
getLogger().info("Placeholder expansion registration initializing..."); expansionManager.registerAllExpansions();
expansionManager.registerAllExpansions(); if (!config.isCloudEnabled()) {
if (config.checkUpdates()) { disableCloud();
new UpdateChecker(this).fetch(); } else if (!cloudEnabled) {
} enableCloud();
if (config.isCloudEnabled()) { }
enableCloud(); s.sendMessage(ChatColor.translateAlternateColorCodes('&',
} PlaceholderAPI.getRegisteredIdentifiers().size()
setupMetrics(); + " &aplaceholder hooks successfully registered!"));
} }
@Override private void setupOptions() {
public void onDisable() { booleanTrue = config.booleanTrue();
disableCloud(); if (booleanTrue == null) {
PlaceholderAPI.unregisterAll(); booleanTrue = "true";
expansionManager.clean(); }
expansionManager = null; booleanFalse = config.booleanFalse();
Bukkit.getScheduler().cancelTasks(this); if (booleanFalse == null) {
serverVersion = null; booleanFalse = "false";
instance = null; }
} try {
dateFormat = new SimpleDateFormat(config.dateFormat());
} catch (Exception e) {
dateFormat = new SimpleDateFormat("MM/dd/yy HH:mm:ss");
}
}
public void reloadConf(CommandSender s) { private void setupMetrics() {
boolean cloudEnabled = this.expansionCloud != null; Metrics m = new Metrics(this);
expansionManager.clean(); m.addCustomChart(new Metrics.SimplePie("using_expansion_cloud",
PlaceholderAPI.unregisterAllProvidedExpansions(); () -> getExpansionCloud() != null ? "yes" : "no"));
reloadConfig();
setupOptions();
expansionManager.registerAllExpansions();
if (!config.isCloudEnabled()) {
disableCloud();
} else if (!cloudEnabled) {
enableCloud();
}
s.sendMessage(ChatColor.translateAlternateColorCodes('&', PlaceholderAPI.getRegisteredIdentifiers().size() + " &aplaceholder hooks successfully registered!"));
}
private void setupOptions() { m.addCustomChart(
booleanTrue = config.booleanTrue(); new Metrics.SimplePie("using_spigot", () -> getServerVersion().isSpigot() ? "yes" : "no"));
if (booleanTrue == null) {
booleanTrue = "true";
}
booleanFalse = config.booleanFalse();
if (booleanFalse == null) {
booleanFalse = "false";
}
try {
dateFormat = new SimpleDateFormat(config.dateFormat());
} catch (Exception e) {
dateFormat = new SimpleDateFormat("MM/dd/yy HH:mm:ss");
}
}
private void setupMetrics() { m.addCustomChart(new Metrics.AdvancedPie("expansions_used", () -> {
Metrics m = new Metrics(this); Map<String, Integer> map = new HashMap<>();
m.addCustomChart(new Metrics.SimplePie("using_expansion_cloud", () -> getExpansionCloud() != null ? "yes" : "no")); Map<String, PlaceholderHook> p = PlaceholderAPI.getPlaceholders();
m.addCustomChart(new Metrics.SimplePie("using_spigot", () -> getServerVersion().isSpigot() ? "yes" : "no")); if (!p.isEmpty()) {
m.addCustomChart(new Metrics.AdvancedPie("expansions_used", () -> { for (PlaceholderHook hook : p.values()) {
Map<String, Integer> map = new HashMap<>(); if (hook instanceof PlaceholderExpansion) {
Map<String, PlaceholderHook> p = PlaceholderAPI.getPlaceholders(); PlaceholderExpansion ex = (PlaceholderExpansion) hook;
map.put(ex.getRequiredPlugin() == null ? ex.getIdentifier()
: ex.getRequiredPlugin(), 1);
}
}
}
return map;
if (!p.isEmpty()) { }));
for (PlaceholderHook hook : p.values()) { }
if (hook instanceof PlaceholderExpansion) {
PlaceholderExpansion ex = (PlaceholderExpansion) hook;
map.put(ex.getRequiredPlugin() == null ? ex.getIdentifier()
: ex.getRequiredPlugin(), 1);
}
}
}
return map;
})); public void enableCloud() {
if (expansionCloud == null) {
expansionCloud = new ExpansionCloudManager(this);
expansionCloud.fetch(config.cloudAllowUnverifiedExpansions());
} else {
expansionCloud.clean();
expansionCloud.fetch(config.cloudAllowUnverifiedExpansions());
}
}
} public void disableCloud() {
if (expansionCloud != null) {
expansionCloud.clean();
expansionCloud = null;
}
}
private static Version getVersion() { /**
String v = "unknown"; * Obtain the configuration class for PlaceholderAPI.
boolean spigot = false; *
try { * @return PlaceholderAPIConfig instance
v = Bukkit.getServer().getClass().getPackage().getName() */
.split("\\.")[3]; public PlaceholderAPIConfig getPlaceholderAPIConfig() {
} catch (ArrayIndexOutOfBoundsException ex) { return config;
} }
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 ExpansionManager getExpansionManager() {
if (expansionCloud == null) { return expansionManager;
expansionCloud = new ExpansionCloudManager(this); }
expansionCloud.fetch(config.cloudAllowUnverifiedExpansions());
} else {
expansionCloud.clean();
expansionCloud.fetch(config.cloudAllowUnverifiedExpansions());
}
}
public void disableCloud() { public ExpansionCloudManager getExpansionCloud() {
if (expansionCloud != null) { return expansionCloud;
expansionCloud.clean(); }
expansionCloud = null;
}
}
/** public String getUptime() {
* Gets the static instance of the main class for PlaceholderAPI. This class return TimeUtil
* is not the actual API class, this is the main class that extends .getTime((int) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - startTime));
* JavaPlugin. For most API methods, use static methods available from the }
* class: {@link PlaceholderAPI}
*
* @return PlaceholderAPIPlugin instance
*/
public static PlaceholderAPIPlugin getInstance() {
return instance;
}
/** public long getUptimeMillis() {
* Get the configurable {@linkplain SimpleDateFormat} object that is used to return (System.currentTimeMillis() - startTime);
* 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.
*
* @return PlaceholderAPIConfig instance
*/
public PlaceholderAPIConfig getPlaceholderAPIConfig() {
return config;
}
public ExpansionManager getExpansionManager() {
return expansionManager;
}
public ExpansionCloudManager getExpansionCloud() {
return expansionCloud;
}
public String getUptime() {
return TimeUtil.getTime((int) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - startTime));
}
public long getUptimeMillis() {
return (System.currentTimeMillis() - startTime);
}
} }

View File

@@ -27,24 +27,27 @@ 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
*/ */
public String onRequest(OfflinePlayer p, String params) { public String onRequest(OfflinePlayer p, String params) {
if (p != null && p.isOnline()) { if (p != null && p.isOnline()) {
return onPlaceholderRequest((Player) p, params); return onPlaceholderRequest((Player) p, params);
} }
return onPlaceholderRequest(null, params); return onPlaceholderRequest(null, params);
} }
/** /**
* 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 params String passed to the hook to determine what value to return * @param p {@link Player} to request the placeholder value for, null if not needed for a player
* @return value for the requested player and params * @param params String passed to the hook to determine what value to return
*/ * @return value for the requested player and params
public String onPlaceholderRequest(Player p, String params) { */
return null; public String onPlaceholderRequest(Player p, String params) {
} return null;
}
} }

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,120 +40,118 @@ 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 {
private PlaceholderAPIPlugin plugin; private PlaceholderAPIPlugin plugin;
public PlaceholderListener(PlaceholderAPIPlugin instance) { public PlaceholderListener(PlaceholderAPIPlugin instance) {
plugin = instance; plugin = instance;
Bukkit.getPluginManager().registerEvents(this, instance); Bukkit.getPluginManager().registerEvents(this, instance);
} }
@EventHandler @EventHandler
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) {
((Taskable) event.getExpansion()).stop(); ((Taskable) event.getExpansion()).stop();
} }
if (event.getExpansion() instanceof Cacheable) { if (event.getExpansion() instanceof Cacheable) {
((Cacheable) event.getExpansion()).clear(); ((Cacheable) event.getExpansion()).clear();
} }
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);
ex.setShouldUpdate(false); ex.setShouldUpdate(false);
} }
} }
} }
@EventHandler @EventHandler
public void onEnable(PluginEnableEvent event) { public void onEnable(PluginEnableEvent event) {
ExpansionManager m = plugin.getExpansionManager(); ExpansionManager m = plugin.getExpansionManager();
PlaceholderExpansion e = m.getCachedExpansion(event.getPlugin().getName().toLowerCase()); PlaceholderExpansion e = m.getCachedExpansion(event.getPlugin().getName().toLowerCase());
if (e != null && e.canRegister()) { if (e != null && e.canRegister()) {
if (e.isRegistered() || m.registerExpansion(e)) { if (e.isRegistered() || m.registerExpansion(e)) {
m.removeCachedExpansion(e.getRequiredPlugin()); m.removeCachedExpansion(e.getRequiredPlugin());
} }
} }
} }
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)
public void onPluginUnload(PluginDisableEvent e) { public void onPluginUnload(PluginDisableEvent e) {
String n = e.getPlugin().getName(); String n = e.getPlugin().getName();
if (n == null) { if (n == null) {
return; return;
} }
if (n.equals(plugin.getName())) { if (n.equals(plugin.getName())) {
return; return;
} }
Map<String, PlaceholderHook> hooks = PlaceholderAPI.getPlaceholders(); Map<String, PlaceholderHook> hooks = PlaceholderAPI.getPlaceholders();
for (Entry<String, PlaceholderHook> hook : hooks.entrySet()) { for (Entry<String, PlaceholderHook> hook : hooks.entrySet()) {
PlaceholderHook i = hook.getValue(); PlaceholderHook i = hook.getValue();
if (i instanceof EZPlaceholderHook) { if (i instanceof EZPlaceholderHook) {
EZPlaceholderHook h = (EZPlaceholderHook) i; EZPlaceholderHook h = (EZPlaceholderHook) i;
if (h.getPluginName() == null) { if (h.getPluginName() == null) {
continue; continue;
} }
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()
break; .info("Unregistered placeholder hook for placeholder: " + h.getPlaceholderName());
} break;
} }
} else if (i instanceof PlaceholderExpansion) { }
} else if (i instanceof PlaceholderExpansion) {
PlaceholderExpansion ex = (PlaceholderExpansion) i; PlaceholderExpansion ex = (PlaceholderExpansion) i;
if (ex.getRequiredPlugin() == null) { if (ex.getRequiredPlugin() == null) {
continue; continue;
} }
if (ex.getRequiredPlugin().equalsIgnoreCase(n)) { if (ex.getRequiredPlugin().equalsIgnoreCase(n)) {
if (PlaceholderAPI.unregisterExpansion(ex)) { if (PlaceholderAPI.unregisterExpansion(ex)) {
plugin.getLogger().info("Unregistered placeholder expansion: " + ex.getIdentifier()); plugin.getLogger().info("Unregistered placeholder expansion: " + ex.getIdentifier());
} }
} }
} }
} }
} }
@EventHandler @EventHandler
public void onQuit(PlayerQuitEvent e) { public void onQuit(PlayerQuitEvent e) {
Set<PlaceholderExpansion> expansions = PlaceholderAPI.getExpansions(); Set<PlaceholderExpansion> expansions = PlaceholderAPI.getExpansions();
if (expansions.isEmpty()) { if (expansions.isEmpty()) {
return; return;
} }
for (PlaceholderExpansion ex : expansions) { for (PlaceholderExpansion ex : expansions) {
if (ex instanceof Cleanable) { if (ex instanceof Cleanable) {
((Cleanable) ex).cleanup(e.getPlayer()); ((Cleanable) ex).cleanup(e.getPlayer());
} }
} }
} }
} }

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,367 +37,407 @@ 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;
public ExpansionCloudCommands(PlaceholderAPIPlugin instance) { public ExpansionCloudCommands(PlaceholderAPIPlugin instance) {
plugin = instance; plugin = instance;
} }
@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 == 1) { if (args.length == 1) {
msg(s, "&bExpansion cloud commands", msg(s, "&bExpansion cloud commands",
" ", " ",
"&b/papi ecloud status", "&b/papi ecloud status",
"&fView status of the ecloud", "&fView status of the ecloud",
"&b/papi ecloud list <all/author> (page)", "&b/papi ecloud list <all/author> (page)",
"&fList all/author specific available expansions", "&fList all/author specific available expansions",
"&b/papi ecloud info <expansion name>", "&b/papi ecloud info <expansion name>",
"&fView information about a specific expansion available on the cloud", "&fView information about a specific expansion available on the cloud",
"&b/papi ecloud versioninfo <expansion name> <version>", "&b/papi ecloud versioninfo <expansion name> <version>",
"&fView information about a specific version of an expansion", "&fView information about a specific version of an expansion",
"&b/papi ecloud placeholders <expansion name>", "&b/papi ecloud placeholders <expansion name>",
"&fView placeholders for an expansion", "&fView placeholders for an expansion",
"&b/papi ecloud download <expansion name> (version)", "&b/papi ecloud download <expansion name> (version)",
"&fDownload an expansion from the ecloud", "&fDownload an expansion from the ecloud",
"&b/papi ecloud refresh", "&b/papi ecloud refresh",
"&fFetch the most up to date list of expansions available.", "&fFetch the most up to date list of expansions available.",
"&b/papi ecloud clear", "&b/papi ecloud clear",
"&fClear the expansion cloud cache."); "&fClear the expansion cloud cache.");
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]
msg(s, "&aRefresh task started. Use &f/papi ecloud list all &ain a few!!"); .equalsIgnoreCase("fetch")) {
plugin.getExpansionCloud().clean(); msg(s, "&aRefresh task started. Use &f/papi ecloud list all &ain a few!!");
plugin.getExpansionCloud().fetch(plugin.getPlaceholderAPIConfig().cloudAllowUnverifiedExpansions()); plugin.getExpansionCloud().clean();
return true; plugin.getExpansionCloud().fetch(plugin.getPlaceholderAPIConfig().cloudAllowUnverifiedExpansions());
} return true;
}
if (plugin.getExpansionCloud().getCloudExpansions().isEmpty()) { if (plugin.getExpansionCloud().getCloudExpansions().isEmpty()) {
msg(s, "&7No cloud expansions are available at this time."); msg(s, "&7No cloud expansions are available at this time.");
return true; return true;
} }
if (args[1].equalsIgnoreCase("clear")) { if (args[1].equalsIgnoreCase("clear")) {
plugin.getExpansionCloud().clean(); plugin.getExpansionCloud().clean();
msg(s, "&aThe cache has been cleared!!"); msg(s, "&aThe cache has been cleared!!");
return true; return true;
} }
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.",
if (plugin.getExpansionCloud().getToUpdateCount() > 0) { "&7A total of &f" + plugin.getExpansionCloud().getCloudAuthorCount()
msg(s, "&eYou have &f" + plugin.getExpansionCloud().getToUpdateCount() + " &7authors have contributed to the expansion cloud.");
+ " &eexpansions installed that have updates available."); if (plugin.getExpansionCloud().getToUpdateCount() > 0) {
} msg(s, "&eYou have &f" + plugin.getExpansionCloud().getToUpdateCount()
+ " &eexpansions installed that have updates available.");
}
return true; return true;
} }
if (args[1].equalsIgnoreCase("info")) { if (args[1].equalsIgnoreCase("info")) {
if (args.length < 3) { if (args.length < 3) {
msg(s, "&cAn expansion name must be specified!"); msg(s, "&cAn expansion name must be specified!");
return true; return true;
} }
CloudExpansion expansion = plugin.getExpansionCloud().getCloudExpansion(args[2]); CloudExpansion expansion = plugin.getExpansionCloud().getCloudExpansion(args[2]);
if (expansion == null) { if (expansion == null) {
msg(s, "&cNo expansion found by the name: &f" + args[2]); msg(s, "&cNo expansion found by the name: &f" + args[2]);
return true; return true;
} }
if (!(s instanceof Player)) { if (!(s instanceof Player)) {
msg(s, (expansion.shouldUpdate() ? "&e" : "") + expansion.getName() + " &8&m-- &r" + expansion.getVersion().getUrl()); msg(s,
return true; (expansion.shouldUpdate() ? "&e" : "") + expansion.getName() + " &8&m-- &r" + expansion
} .getVersion().getUrl());
return true;
}
Player p = (Player) s; Player p = (Player) s;
msg(s, "&bExpansion&7: &f" + expansion.getName(), msg(s, "&bExpansion&7: &f" + expansion.getName(),
"&bAuthor: &f" + expansion.getAuthor(), "&bAuthor: &f" + expansion.getAuthor(),
"&bVerified: &f" + expansion.isVerified() "&bVerified: &f" + expansion.isVerified()
); );
// latest version // latest version
JSONMessage latestVersion = JSONMessage.create(color("&bLatest version: &f" + expansion.getLatestVersion())); JSONMessage latestVersion = JSONMessage
latestVersion.tooltip(color("&bReleased: &f" + expansion.getTimeSinceLastUpdate() .create(color("&bLatest version: &f" + expansion.getLatestVersion()));
+ "\n&bUpdate information: &f" + expansion.getVersion().getReleaseNotes() latestVersion.tooltip(color("&bReleased: &f" + expansion.getTimeSinceLastUpdate()
)); + "\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
versions.tooltip(color(String.join("&b, &f", expansion.getAvailableVersions()))); .create(color("&bVersions available: &f" + expansion.getVersions().size()));
versions.suggestCommand("/papi ecloud versioninfo " + expansion.getName() + " " + expansion.getLatestVersion()); versions.tooltip(color(String.join("&b, &f", expansion.getAvailableVersions())));
versions.send(p); versions.suggestCommand(
"/papi ecloud versioninfo " + expansion.getName() + " " + expansion.getLatestVersion());
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
placeholders.tooltip(color(String.join("&b, &f", expansion.getPlaceholders()))); .create(color("&bPlaceholders: &f" + expansion.getPlaceholders().size()));
placeholders.suggestCommand("/papi ecloud placeholders " + expansion.getName()); placeholders.tooltip(color(String.join("&b, &f", expansion.getPlaceholders())));
placeholders.send(p); placeholders.suggestCommand("/papi ecloud placeholders " + expansion.getName());
} placeholders.send(p);
return true; }
} return true;
}
if (args[1].equalsIgnoreCase("versioninfo")) { if (args[1].equalsIgnoreCase("versioninfo")) {
if (args.length < 4) { if (args.length < 4) {
msg(s, "&cAn expansion name and version must be specified!"); msg(s, "&cAn expansion name and version must be specified!");
return true; return true;
} }
CloudExpansion expansion = plugin.getExpansionCloud().getCloudExpansion(args[2]); CloudExpansion expansion = plugin.getExpansionCloud().getCloudExpansion(args[2]);
if (expansion == null) { if (expansion == null) {
msg(s, "&cNo expansion found by the name: &f" + args[2]); msg(s, "&cNo expansion found by the name: &f" + args[2]);
return true; return true;
} }
CloudExpansion.Version version = expansion.getVersion(args[3]); CloudExpansion.Version version = expansion.getVersion(args[3]);
if (version == null) { if (version == null) {
msg(s, "&cThe version specified does not exist for expansion: &f" + expansion.getName()); msg(s, "&cThe version specified does not exist for expansion: &f" + expansion.getName());
return true; return true;
} }
msg(s, "&bExpansion: " + (expansion.shouldUpdate() ? "&e" : "&f") + expansion.getName(), msg(s, "&bExpansion: " + (expansion.shouldUpdate() ? "&e" : "&f") + expansion.getName(),
"&bVersion: &f" + version.getVersion(), "&bVersion: &f" + version.getVersion(),
"&bVersion info: &f" + version.getReleaseNotes()); "&bVersion info: &f" + version.getReleaseNotes());
if (!(s instanceof Player)) { if (!(s instanceof Player)) {
msg(s, "&bDownload url: " + version.getUrl()); msg(s, "&bDownload url: " + version.getUrl());
return true; return true;
} }
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(
download.send(p); "/papi ecloud download " + expansion.getName() + " " + version.getVersion());
return true; download.send(p);
return true;
}
if (args[1].equalsIgnoreCase("placeholders")) {
if (args.length < 3) {
msg(s, "&cAn expansion name must be specified!");
return true;
}
CloudExpansion expansion = plugin.getExpansionCloud().getCloudExpansion(args[2]);
if (expansion == null) {
msg(s, "&cNo expansion found by the name: &f" + args[2]);
return true;
}
List<String> placeholders = expansion.getPlaceholders();
if (placeholders == null) {
msg(s, "&cThe expansion: &f" + expansion.getName()
+ " &cdoes not have any placeholders listed.",
"&7You should contact &f" + expansion.getAuthor() + " &7and ask for them to be added.");
return true;
}
if (!(s instanceof Player)
|| plugin.getExpansionManager().getRegisteredExpansion(expansion.getName()) == null) {
msg(s, "&bPlaceholders: &f" + placeholders.size(),
String.join("&a, &f", placeholders));
return true;
}
Player p = (Player) s;
JSONMessage message = JSONMessage.create(color("&bPlaceholders: &f" + placeholders.size()));
message.then("\n");
for (int i = 0; i < placeholders.size(); i++) {
if (i == placeholders.size() - 1) {
message.then(placeholders.get(i));
} else {
message.then(color(placeholders.get(i) + "&b, &f"));
}
message.tooltip(PlaceholderAPI.setPlaceholders(p, placeholders.get(i)));
}
message.send(p);
return true;
}
if (args[1].equalsIgnoreCase("list")) {
int page = 1;
String author;
boolean installed = false;
if (args.length < 3) {
msg(s, "&cIncorrect usage! &7/papi ecloud list <all/author/installed> (page)");
return true;
}
author = args[2];
if (author.equalsIgnoreCase("all")) {
author = null;
} else if (author.equalsIgnoreCase("installed")) {
author = null;
installed = true;
}
if (args.length >= 4) {
try {
page = Integer.parseInt(args[3]);
} catch (NumberFormatException ex) {
msg(s, "&cPage number must be an integer!");
return true;
}
}
if (page < 1) {
msg(s, "&cPage must be greater than or equal to 1!");
return true;
}
int avail;
Map<Integer, CloudExpansion> ex;
if (installed) {
ex = plugin.getExpansionCloud().getAllInstalled();
} else if (author == null) {
ex = plugin.getExpansionCloud().getCloudExpansions();
} else {
ex = plugin.getExpansionCloud().getAllByAuthor(author);
}
if (ex == null || ex.isEmpty()) {
msg(s, "&cNo expansions available" + (author != null ? " for author &f" + author : ""));
return true;
}
avail = plugin.getExpansionCloud().getPagesAvailable(ex, 10);
if (page > avail) {
msg(s, "&cThere " + ((avail == 1) ? " is only &f" + avail + " &cpage available!"
: "are only &f" + avail + " &cpages available!"));
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);
ex = plugin.getExpansionCloud().getPage(ex, page, 10);
if (ex == null) {
msg(s, "&cThere was a problem getting the requested page...");
return true;
}
msg(s, "&aGreen = Expansions you have");
msg(s, "&6Gold = Expansions which need updated");
if (!(s instanceof Player)) {
Map<String, CloudExpansion> expansions = new HashMap<>();
for (CloudExpansion exp : ex.values()) {
if (exp == null || exp.getName() == null) {
continue;
}
expansions.put(exp.getName(), exp);
}
List<String> ce = expansions.keySet().stream().sorted().collect(Collectors.toList());
int i = 1;
for (String name : ce) {
if (expansions.get(name) == null) {
continue;
}
CloudExpansion expansion = expansions.get(name);
msg(s,
"&b" + i + "&7: " + (expansion.shouldUpdate() ? "&6"
: (expansion.hasExpansion() ? "&a" : "&7")) + expansion
.getName() + " &8&m-- &r" + expansion.getVersion().getUrl());
i++;
} }
if (args[1].equalsIgnoreCase("placeholders")) { return true;
}
if (args.length < 3) { Player p = (Player) s;
msg(s, "&cAn expansion name must be specified!");
return true;
}
CloudExpansion expansion = plugin.getExpansionCloud().getCloudExpansion(args[2]); Map<String, CloudExpansion> expansions = new HashMap<>();
for (CloudExpansion exp : ex.values()) {
if (expansion == null) { if (exp == null || exp.getName() == null) {
msg(s, "&cNo expansion found by the name: &f" + args[2]); continue;
return true;
}
List<String> placeholders = expansion.getPlaceholders();
if (placeholders == null) {
msg(s, "&cThe expansion: &f" + expansion.getName() + " &cdoes not have any placeholders listed.",
"&7You should contact &f" + expansion.getAuthor() + " &7and ask for them to be added.");
return true;
}
if (!(s instanceof Player) || plugin.getExpansionManager().getRegisteredExpansion(expansion.getName()) == null) {
msg(s, "&bPlaceholders: &f" + placeholders.size(),
String.join("&a, &f", placeholders));
return true;
}
Player p = (Player) s;
JSONMessage message = JSONMessage.create(color("&bPlaceholders: &f" + placeholders.size()));
message.then("\n");
for (int i = 0 ; i < placeholders.size() ; i++) {
if (i == placeholders.size()-1) {
message.then(placeholders.get(i));
} else {
message.then(color(placeholders.get(i) + "&b, &f"));
}
message.tooltip(PlaceholderAPI.setPlaceholders(p, placeholders.get(i)));
}
message.send(p);
return true;
} }
expansions.put(exp.getName(), exp);
}
List<String> ce = expansions.keySet().stream().sorted().collect(Collectors.toList());
int i = 1;
for (String name : ce) {
if (expansions.get(name) == null) {
continue;
}
CloudExpansion expansion = expansions.get(name);
StringBuilder sb = new StringBuilder();
if (expansion.shouldUpdate()) {
sb.append("&6Click to update to the latest version of this expansion\n\n");
} else if (!expansion.hasExpansion()) {
sb.append("&bClick to download this expansion\n\n");
} else {
sb.append("&aYou have the latest version of this expansion\n\n");
}
sb.append("&bAuthor&7: &f" + expansion.getAuthor() + "\n");
sb.append("&bVerified&7: &f" + expansion.isVerified() + "\n");
sb.append("&bLatest version&7: &f" + expansion.getVersion().getVersion() + "\n");
sb.append(
"&bLast updated&7: &f" + expansion.getTimeSinceLastUpdate() + " ago\n");
sb.append("\n" + expansion.getDescription());
if (args[1].equalsIgnoreCase("list")) { String msg = color(
"&b" + (i + 1) + "&7: " + (expansion.shouldUpdate() ? "&6"
: (expansion.hasExpansion() ? "&a" : "")) + expansion.getName());
int page = 1; String hover = color(sb.toString());
String author; JSONMessage line = JSONMessage.create(msg);
boolean installed = false; line.tooltip(hover);
if (expansion.shouldUpdate()) {
line.suggestCommand("/papi ecloud download " + expansion.getName());
}
else {
line.suggestCommand("/papi ecloud info " + expansion.getName());
}
line.send(p);
i++;
}
return true;
}
if (args.length < 3) { if (args[1].equalsIgnoreCase("download")) {
msg(s, "&cIncorrect usage! &7/papi ecloud list <all/author/installed> (page)");
return true;
}
author = args[2]; if (args.length < 3) {
msg(s, "&cAn expansion name must be specified!");
return true;
}
if (author.equalsIgnoreCase("all")) { CloudExpansion expansion = plugin.getExpansionCloud().getCloudExpansion(args[2]);
author = null;
} else if (author.equalsIgnoreCase("installed")) {
author = null;
installed = true;
}
if (args.length >= 4) { if (expansion == null) {
try { msg(s, "&cNo expansion found with the name: &f" + args[2]);
page = Integer.parseInt(args[3]); return true;
} catch (NumberFormatException ex) { }
msg(s, "&cPage number must be an integer!");
return true;
}
}
if (page < 1) { PlaceholderExpansion loaded = plugin.getExpansionManager().getRegisteredExpansion(args[2]);
msg(s, "&cPage must be greater than or equal to 1!");
return true;
}
int avail; if (loaded != null && loaded.isRegistered()) {
PlaceholderAPI.unregisterPlaceholderHook(loaded.getIdentifier());
}
Map<Integer, CloudExpansion> ex; String version = expansion.getLatestVersion();
if (installed) { if (args.length == 4) {
ex = plugin.getExpansionCloud().getAllInstalled(); version = args[3];
} else if (author == null) { if (expansion.getVersion(version) == null) {
ex = plugin.getExpansionCloud().getCloudExpansions(); msg(s, "&cThe version you specified does not exist for &f" + expansion.getName());
} else { msg(s, "&7Available versions: &f" + expansion.getVersions().size());
ex = plugin.getExpansionCloud().getAllByAuthor(author); msg(s, String.join("&a, &f", expansion.getAvailableVersions()));
} return true;
}
}
if (ex == null || ex.isEmpty()) { msg(s, "&aDownload starting for expansion: &f" + expansion.getName() + " &aversion: &f"
msg(s, "&cNo expansions available" + (author != null ? " for author &f" + author : "")); + version);
return true; String player = ((s instanceof Player) ? s.getName() : null);
} plugin.getExpansionCloud().downloadExpansion(player, expansion, version);
plugin.getExpansionCloud().clean();
avail = plugin.getExpansionCloud().getPagesAvailable(ex, 10); plugin.getExpansionCloud().fetch(plugin.getPlaceholderAPIConfig().cloudAllowUnverifiedExpansions());
return true;
if (page > avail) { }
msg(s, "&cThere " + ((avail == 1) ? " is only &f" + avail + " &cpage available!" : "are only &f" + avail + " &cpages available!"));
return true;
}
msg(s, "&bShowing expansions for&7: &f" + (author != null ? author : (installed ? "all installed" : "all available"))+ " &8&m--&r &bamount&7: &f" + ex.size() + " &bpage&7: &f" + page + "&7/&f" + avail);
ex = plugin.getExpansionCloud().getPage(ex, page, 10);
if (ex == null) {
msg(s, "&cThere was a problem getting the requested page...");
return true;
}
msg(s, "&aGreen = Expansions you have");
msg(s, "&6Gold = Expansions which need updated");
if (!(s instanceof Player)) {
for (Entry<Integer, CloudExpansion> expansion : ex.entrySet()) {
if (expansion == null || expansion.getValue() == null) continue;
msg(s, "&b" + (expansion.getKey()+1) + "&7: " + (expansion.getValue().shouldUpdate() ? "&6" : (expansion.getValue().hasExpansion() ? "&a" : "&7")) + expansion.getValue().getName() + " &8&m-- &r" + expansion.getValue().getVersion().getUrl());
}
return true;
}
Player p = (Player) s;
for (Entry<Integer, CloudExpansion> expansion : ex.entrySet()) {
if (expansion == null || expansion.getValue() == null) {
continue;
}
StringBuilder sb = new StringBuilder();
if (expansion.getValue().shouldUpdate()) {
sb.append("&6Click to update to the latest version of this expansion\n\n");
} else if (!expansion.getValue().hasExpansion()) {
sb.append("&bClick to download this expansion\n\n");
} else {
sb.append("&aYou have the latest version of this expansion\n\n");
}
sb.append("&bAuthor&7: &f" + expansion.getValue().getAuthor() + "\n");
sb.append("&bVerified&7: &f" + expansion.getValue().isVerified() + "\n");
sb.append("&bLatest version&7: &f" + expansion.getValue().getVersion().getVersion() + "\n");
sb.append("&bLast updated&7: &f" + expansion.getValue().getTimeSinceLastUpdate() + " ago\n");
sb.append("\n" + expansion.getValue().getDescription());
String msg = color("&b" + (expansion.getKey()+1) + "&7: " + (expansion.getValue().shouldUpdate() ? "&6" : (expansion.getValue().hasExpansion() ? "&a" : "")) + expansion.getValue().getName());
String hover = color(sb.toString());
JSONMessage line = JSONMessage.create(msg);
line.tooltip(hover);
line.suggestCommand("/papi ecloud info " + expansion.getValue().getName());
line.send(p);
}
return true;
}
if (args[1].equalsIgnoreCase("download")) {
if (args.length < 3) {
msg(s, "&cAn expansion name must be specified!");
return true;
}
CloudExpansion expansion = plugin.getExpansionCloud().getCloudExpansion(args[2]);
if (expansion == null) {
msg(s, "&cNo expansion found with the name: &f" + args[2]);
return true;
}
PlaceholderExpansion loaded = plugin.getExpansionManager().getRegisteredExpansion(args[2]);
if (loaded != null && loaded.isRegistered()) {
PlaceholderAPI.unregisterPlaceholderHook(loaded.getIdentifier());
}
String version = expansion.getLatestVersion();
if (args.length == 4) {
version = args[3];
if (expansion.getVersion(version) == null) {
msg(s, "&cThe version you specified does not exist for &f" + expansion.getName());
msg(s, "&7Available versions: &f" + expansion.getVersions().size());
msg(s, String.join("&a, &f", expansion.getAvailableVersions()));
return true;
}
}
msg(s, "&aDownload starting for expansion: &f" + expansion.getName() + " &aversion: &f" + version);
String player = ((s instanceof Player) ? s.getName() : null);
plugin.getExpansionCloud().downloadExpansion(player, expansion, version);
return true;
}
msg(s, "&cIncorrect usage! &b/papi ecloud");
return true;
}
msg(s, "&cIncorrect usage! &b/papi ecloud");
return true;
}
} }

View File

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

View File

@@ -24,43 +24,43 @@ import me.clip.placeholderapi.PlaceholderAPIPlugin;
public class PlaceholderAPIConfig { public class PlaceholderAPIConfig {
private PlaceholderAPIPlugin plugin; private PlaceholderAPIPlugin plugin;
public PlaceholderAPIConfig(PlaceholderAPIPlugin i) { public PlaceholderAPIConfig(PlaceholderAPIPlugin i) {
plugin = i; plugin = i;
} }
public void loadDefConfig() { public void loadDefConfig() {
plugin.saveDefaultConfig(); plugin.saveDefaultConfig();
plugin.reloadConfig(); plugin.reloadConfig();
} }
public boolean checkUpdates() { public boolean checkUpdates() {
return plugin.getConfig().getBoolean("check_updates"); return plugin.getConfig().getBoolean("check_updates");
} }
public boolean cloudAllowUnverifiedExpansions() { public boolean cloudAllowUnverifiedExpansions() {
return plugin.getConfig().getBoolean("cloud_allow_unverified_expansions"); return plugin.getConfig().getBoolean("cloud_allow_unverified_expansions");
} }
public boolean isCloudEnabled() { public boolean isCloudEnabled() {
return plugin.getConfig().getBoolean("cloud_enabled"); return plugin.getConfig().getBoolean("cloud_enabled");
} }
public void setCloudEnabled(boolean b) { public void setCloudEnabled(boolean b) {
plugin.getConfig().set("cloud_enabled", b); plugin.getConfig().set("cloud_enabled", b);
plugin.reloadConfig(); plugin.reloadConfig();
} }
public String booleanTrue() { public String booleanTrue() {
return plugin.getConfig().getString("boolean.true"); return plugin.getConfig().getString("boolean.true");
} }
public String booleanFalse() { public String booleanFalse() {
return plugin.getConfig().getString("boolean.false"); return plugin.getConfig().getString("boolean.false");
} }
public String dateFormat() { public String dateFormat() {
return plugin.getConfig().getString("date_format"); return plugin.getConfig().getString("date_format");
} }
} }

View File

@@ -26,23 +26,23 @@ import org.bukkit.event.HandlerList;
public class ExpansionRegisterEvent extends Event { public class ExpansionRegisterEvent extends Event {
private static final HandlerList HANDLERS = new HandlerList(); private static final HandlerList HANDLERS = new HandlerList();
private PlaceholderExpansion expansion; private PlaceholderExpansion expansion;
public ExpansionRegisterEvent(PlaceholderExpansion expansion) { public ExpansionRegisterEvent(PlaceholderExpansion expansion) {
this.expansion = expansion; this.expansion = expansion;
} }
@Override public static HandlerList getHandlerList() {
public HandlerList getHandlers() { return HANDLERS;
return HANDLERS; }
}
public static HandlerList getHandlerList() { @Override
return HANDLERS; public HandlerList getHandlers() {
} return HANDLERS;
}
public PlaceholderExpansion getExpansion() { public PlaceholderExpansion getExpansion() {
return expansion; return expansion;
} }
} }

View File

@@ -20,30 +20,29 @@
*/ */
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;
public class ExpansionUnregisterEvent extends Event { public class ExpansionUnregisterEvent extends Event {
private static final HandlerList HANDLERS = new HandlerList(); private static final HandlerList HANDLERS = new HandlerList();
private PlaceholderExpansion expansion; private PlaceholderExpansion expansion;
public ExpansionUnregisterEvent(PlaceholderExpansion expansion) { public ExpansionUnregisterEvent(PlaceholderExpansion expansion) {
this.expansion = expansion; this.expansion = expansion;
} }
@Override public static HandlerList getHandlerList() {
public HandlerList getHandlers() { return HANDLERS;
return HANDLERS; }
}
public static HandlerList getHandlerList() { @Override
return HANDLERS; public HandlerList getHandlers() {
} return HANDLERS;
}
public PlaceholderExpansion getExpansion() { public PlaceholderExpansion getExpansion() {
return expansion; return expansion;
} }
} }

View File

@@ -27,29 +27,29 @@ import org.bukkit.event.HandlerList;
@Deprecated @Deprecated
public class PlaceholderHookUnloadEvent extends Event { public class PlaceholderHookUnloadEvent extends Event {
private static final HandlerList HANDLERS = new HandlerList(); private static final HandlerList HANDLERS = new HandlerList();
private String plugin; private String plugin;
private PlaceholderHook hook; private PlaceholderHook hook;
public PlaceholderHookUnloadEvent(String plugin, PlaceholderHook placeholderHook) { public PlaceholderHookUnloadEvent(String plugin, PlaceholderHook placeholderHook) {
this.plugin = plugin; this.plugin = plugin;
this.hook = placeholderHook; this.hook = placeholderHook;
} }
@Override public static HandlerList getHandlerList() {
public HandlerList getHandlers() { return HANDLERS;
return HANDLERS; }
}
public static HandlerList getHandlerList() { @Override
return HANDLERS; public HandlerList getHandlers() {
} return HANDLERS;
}
public String getHookName() { public String getHookName() {
return plugin; return plugin;
} }
public PlaceholderHook getHook() { public PlaceholderHook getHook() {
return hook; return hook;
} }
} }

View File

@@ -21,17 +21,16 @@
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 {
/** /**
* Called when the implementing class is unregistered from PlaceholderAPI * Called when the implementing class is unregistered from PlaceholderAPI
*/ */
void clear(); void clear();
} }

View File

@@ -23,17 +23,18 @@ 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
Map<String, Object> getDefaults(); * config.yml file
*/
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,171 +35,167 @@ 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 PlaceholderAPIPlugin plugin;
private final Map<String, PlaceholderExpansion> cache = new HashMap<>(); public ExpansionManager(PlaceholderAPIPlugin instance) {
plugin = instance;
File f = new File(PlaceholderAPIPlugin.getInstance().getDataFolder(), "expansions");
if (!f.exists()) {
f.mkdirs();
}
}
public ExpansionManager(PlaceholderAPIPlugin instance) { public void clean() {
plugin = instance; cache.clear();
} }
public void clean() { public PlaceholderExpansion getCachedExpansion(String plugin) {
cache.clear(); return cache.getOrDefault(plugin, null);
} }
public PlaceholderExpansion getCachedExpansion(String plugin) { public boolean removeCachedExpansion(String identifier) {
return cache.getOrDefault(plugin, null); return cache.remove(identifier) != null;
} }
public boolean removeCachedExpansion(String identifier) { public PlaceholderExpansion getRegisteredExpansion(String name) {
return cache.remove(identifier) != null; for (Entry<String, PlaceholderHook> hook : PlaceholderAPI.getPlaceholders().entrySet()) {
} if (hook.getValue() instanceof PlaceholderExpansion) {
if (name.equalsIgnoreCase(hook.getKey())) {
return (PlaceholderExpansion) hook.getValue();
}
}
}
return null;
}
public PlaceholderExpansion getRegisteredExpansion(String name) { public boolean registerExpansion(PlaceholderExpansion expansion) {
for (Entry<String, PlaceholderHook> hook : PlaceholderAPI.getPlaceholders().entrySet()) { if (expansion == null || expansion.getIdentifier() == null) {
if (hook.getValue() instanceof PlaceholderExpansion) { return false;
if (name.equalsIgnoreCase(hook.getKey())) { }
return (PlaceholderExpansion) hook.getValue(); if (expansion instanceof Configurable) {
} Map<String, Object> defaults = ((Configurable) expansion).getDefaults();
} String pre = "expansions." + expansion.getIdentifier() + ".";
} FileConfiguration cfg = plugin.getConfig();
return null; boolean save = false;
} for (Entry<String, Object> entries : defaults.entrySet()) {
if (entries.getKey() == null || entries.getKey().isEmpty()) {
continue;
}
if (entries.getValue() == null) {
if (cfg.contains(pre + entries.getKey())) {
save = true;
cfg.set(pre + entries.getKey(), null);
}
} else {
if (!cfg.contains(pre + entries.getKey())) {
save = true;
cfg.set(pre + entries.getKey(), entries.getValue());
}
}
}
if (save) {
plugin.saveConfig();
plugin.reloadConfig();
}
}
if (expansion instanceof VersionSpecific) {
VersionSpecific nms = (VersionSpecific) expansion;
if (!nms.isCompatibleWith(PlaceholderAPIPlugin.getServerVersion())) {
plugin.getLogger()
.info(
"Your server version is not compatible with expansion: " + expansion.getIdentifier()
+ " version: " + expansion.getVersion());
return false;
}
}
if (!expansion.canRegister()) {
if (expansion.getRequiredPlugin() != null) {
cache.put(expansion.getRequiredPlugin().toLowerCase(), expansion);
}
return false;
}
if (!expansion.register()) {
return false;
}
if (expansion instanceof Listener) {
Listener l = (Listener) expansion;
Bukkit.getPluginManager().registerEvents(l, plugin);
}
plugin.getLogger().info("Successfully registered expansion: " + expansion.getIdentifier());
if (expansion instanceof Taskable) {
((Taskable) expansion).start();
}
if (plugin.getExpansionCloud() != null) {
CloudExpansion ce = plugin.getExpansionCloud().getCloudExpansion(expansion.getIdentifier());
if (ce != null) {
ce.setHasExpansion(true);
if (!ce.getLatestVersion().equals(expansion.getVersion())) {
ce.setShouldUpdate(true);
}
}
}
return true;
}
public boolean registerExpansion(PlaceholderExpansion c) {
if (c == null || c.getIdentifier() == null) { public PlaceholderExpansion registerExpansion(String fileName) {
return false; 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;
}
if (c instanceof Configurable) { public void registerAllExpansions() {
if (plugin == null) {
return;
}
List<Class<?>> subs = FileUtil.getClasses("expansions", null, PlaceholderExpansion.class);
if (subs == null || subs.isEmpty()) {
return;
}
for (Class<?> klass : subs) {
PlaceholderExpansion ex = createInstance(klass);
if (ex != null) {
registerExpansion(ex);
}
}
}
Map<String, Object> defaults = ((Configurable) c).getDefaults(); private PlaceholderExpansion createInstance(Class<?> klass) {
String pre = "expansions." + c.getIdentifier() + "."; if (klass == null) {
FileConfiguration cfg = plugin.getConfig(); return null;
}
boolean save = false; PlaceholderExpansion ex = null;
if (!PlaceholderExpansion.class.isAssignableFrom(klass)) {
for (Entry<String, Object> entries : defaults.entrySet()) { return null;
if (entries.getKey() == null || entries.getKey().isEmpty()) { }
continue; try {
} Constructor<?>[] c = klass.getConstructors();
if (c.length == 0) {
if (entries.getValue() == null) { ex = (PlaceholderExpansion) klass.newInstance();
if (cfg.contains(pre + entries.getKey())) { } else {
save = true; for (Constructor<?> con : c) {
cfg.set(pre + entries.getKey(), null); if (con.getParameterTypes().length == 0) {
} ex = (PlaceholderExpansion) klass.newInstance();
} else { break;
if (!cfg.contains(pre + entries.getKey())) { }
save = true; }
cfg.set(pre + entries.getKey(), entries.getValue()); }
} } catch (Throwable t) {
} plugin.getLogger()
} .severe("Failed to init placeholder expansion from class: " + klass.getName());
plugin.getLogger().severe(t.getMessage());
if (save) { }
plugin.saveConfig(); return ex;
plugin.reloadConfig(); }
}
}
if (c instanceof VersionSpecific) {
VersionSpecific nms = (VersionSpecific) c;
if (!nms.isCompatibleWith(PlaceholderAPIPlugin.getServerVersion())) {
plugin.getLogger().info("Your server version is not compatible with expansion: " + c.getIdentifier()
+ " version: " + c.getVersion());
return false;
}
}
if (!c.canRegister()) {
if (c.getRequiredPlugin() != null) {
cache.put(c.getRequiredPlugin().toLowerCase(), c);
}
return false;
}
if (!c.register()) {
return false;
}
if (c instanceof Listener) {
Listener l = (Listener) c;
Bukkit.getPluginManager().registerEvents(l, plugin);
}
plugin.getLogger().info("Successfully registered expansion: " + c.getIdentifier());
if (c instanceof Taskable) {
((Taskable) c).start();
}
return true;
}
public void registerAllExpansions() {
if (plugin == null) {
return;
}
List<Class<?>> subs = FileUtil.getClasses("expansions", PlaceholderExpansion.class);
if (subs == null || subs.isEmpty()) {
return;
}
for (Class<?> klass : subs) {
if (klass == null) {
continue;
}
try {
PlaceholderExpansion ex = null;
Constructor<?>[] c = klass.getConstructors();
if (c.length == 0) {
ex = (PlaceholderExpansion) klass.newInstance();
} else {
for (Constructor<?> con : c) {
if (con.getParameterTypes().length == 0) {
ex = (PlaceholderExpansion) klass.newInstance();
break;
}
}
}
if (ex == null) {
continue;
}
if (registerExpansion(ex)) {
if (plugin.getExpansionCloud() != null) {
CloudExpansion ce = plugin.getExpansionCloud().getCloudExpansion(ex.getIdentifier());
if (ce != null) {
ce.setHasExpansion(true);
if (!ce.getVersion().equals(ex.getVersion())) {
ce.setShouldUpdate(true);
}
}
}
}
} catch (Throwable t) {
plugin.getLogger().severe("Failed to load placeholder expansion from class: " + klass.getName());
plugin.getLogger().severe(t.getMessage());
}
}
}
} }

View File

@@ -22,36 +22,40 @@ package me.clip.placeholderapi.expansion;
public enum NMSVersion { public enum NMSVersion {
UNKNOWN("unknown"), UNKNOWN("unknown"),
SPIGOT_1_7_R1("v1_7_R1"), SPIGOT_1_7_R1("v1_7_R1"),
SPIGOT_1_7_R2("v1_7_R2"), SPIGOT_1_7_R2("v1_7_R2"),
SPIGOT_1_7_R3("v1_7_R3"), SPIGOT_1_7_R3("v1_7_R3"),
SPIGOT_1_7_R4("v1_7_R4"), SPIGOT_1_7_R4("v1_7_R4"),
SPIGOT_1_8_R1("v1_8_R1"), SPIGOT_1_8_R1("v1_8_R1"),
SPIGOT_1_8_R2("v1_8_R2"), SPIGOT_1_8_R2("v1_8_R2"),
SPIGOT_1_8_R3("v1_8_R3"), SPIGOT_1_8_R3("v1_8_R3"),
SPIGOT_1_9_R1("v1_9_R1"), SPIGOT_1_9_R1("v1_9_R1"),
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;
NMSVersion(String version) { NMSVersion(String version) {
this.version = version; this.version = version;
} }
public String getVersion() { public static NMSVersion getVersion(String version) {
return version; for (NMSVersion v : values()) {
} if (v.getVersion().equalsIgnoreCase(version)) {
return v;
}
}
return NMSVersion.UNKNOWN;
}
public String getVersion() {
return version;
}
public static NMSVersion getVersion(String version) {
for (NMSVersion v : values()) {
if (v.getVersion().equalsIgnoreCase(version)) {
return v;
}
}
return NMSVersion.UNKNOWN;
}
} }

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,39 +28,42 @@ 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() { */
return getIdentifier(); public String getName() {
} return getIdentifier();
}
/**
* The placeholder identifier of this expanion
* @return placeholder identifier that is associated with this expansion
*/
public abstract String getIdentifier();
/**
* The author of this expansion
* @return name of the author for this expansion
*/
public abstract String getAuthor();
/**
* The version of this expansion
* @return current version of this expansion
*/
public abstract String getVersion();
/** /**
* The name of the plugin that this expansion hooks into. * The placeholder identifier of this expanion
* by default will return the deprecated {@link #getPlugin()} method *
* @return placeholder identifier that is associated with this expansion
*/
public abstract String getIdentifier();
/**
* The author of this expansion
*
* @return name of the author for this expansion
*/
public abstract String getAuthor();
/**
* The version of this expansion
*
* @return current version of this expansion
*/
public abstract String getVersion();
/**
* The name of the plugin that this expansion hooks into. by default will return the deprecated
* {@link #getPlugin()} method
*
* @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,95 +72,109 @@ 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() {
return null; return null;
} }
/** /**
* 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
* @return if this expansion should persist through placeholder reloads * command is used
*/ *
public boolean persist() { * @return if this expansion should persist through placeholder reloads
return false; */
} public boolean persist() {
return false;
}
/** /**
* 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() { */
Validate.notNull(getIdentifier(), "Placeholder identifier can not be null!"); public boolean isRegistered() {
return PlaceholderAPI.getRegisteredIdentifiers().contains(getIdentifier()); Validate.notNull(getIdentifier(), "Placeholder identifier can not be null!");
} return PlaceholderAPI.getRegisteredIdentifiers().contains(getIdentifier());
}
/** /**
* 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() { */
return getRequiredPlugin() == null || Bukkit.getPluginManager().getPlugin(getRequiredPlugin()) != null; public boolean canRegister() {
} 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() { */
Validate.notNull(getIdentifier(), "Placeholder identifier can not be null!"); public boolean register() {
return PlaceholderAPI.registerExpansion(this); Validate.notNull(getIdentifier(), "Placeholder identifier can not be null!");
} return PlaceholderAPI.registerExpansion(this);
}
/** /**
* 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() { */
return PlaceholderAPIPlugin.getInstance(); public PlaceholderAPIPlugin getPlaceholderAPI() {
} return PlaceholderAPIPlugin.getInstance();
}
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) {
return getPlaceholderAPI().getConfig().get("expansions." + getIdentifier() + "." + path, def); return getPlaceholderAPI().getConfig().get("expansions." + getIdentifier() + "." + path, def);
} }
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() {
return getPlaceholderAPI().getConfig().getConfigurationSection("expansions." + getIdentifier()); return getPlaceholderAPI().getConfig().getConfigurationSection("expansions." + getIdentifier());
} }
public boolean configurationContains(String path) { public boolean configurationContains(String path) {
return getPlaceholderAPI().getConfig().contains("expansions." + getIdentifier() + "." + path); return getPlaceholderAPI().getConfig().contains("expansions." + getIdentifier() + "." + path);
} }
/** /**
* @deprecated As of versions greater than 2.8.7, use {@link #getRequiredPlugin()} * @deprecated As of versions greater than 2.8.7, use {@link #getRequiredPlugin()}
*/ */
@Deprecated @Deprecated
public String getPlugin() { public String getPlugin() {
@@ -164,14 +182,18 @@ 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

@@ -23,15 +23,15 @@ package me.clip.placeholderapi.expansion;
public interface Taskable { public interface Taskable {
/** /**
* Called when the implementing class has successfully been registered to the placeholder map * Called when the implementing class has successfully been registered to the placeholder map
* Tasks that need to be performed when this expansion is registered should go here * Tasks that need to be performed when this expansion is registered should go here
*/ */
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,22 +20,27 @@
*/ */
package me.clip.placeholderapi.expansion; package me.clip.placeholderapi.expansion;
public class Version { public final class Version {
private boolean isSpigot; private boolean isSpigot;
private String version; private String version;
public Version(String version, boolean isSpigot) { public Version(String version, boolean isSpigot) {
this.version = version; this.version = version;
this.isSpigot = isSpigot; this.isSpigot = isSpigot;
} }
public String getVersion() { public String getVersion() {
return version == null ? "unknown" : version; return version == null ? "unknown" : version;
} }
public boolean isSpigot() {
return isSpigot;
}
public boolean compareTo(String version) {
return getVersion().equalsIgnoreCase(version);
}
public boolean isSpigot() {
return isSpigot;
}
} }

View File

@@ -21,19 +21,20 @@
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.
*/ */
boolean isCompatibleWith(Version v); boolean isCompatibleWith(Version v);
} }

View File

@@ -20,183 +20,183 @@
*/ */
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 {
private String name, private String name,
author, author,
latest_version, latest_version,
description, description,
source_url, source_url,
dependency_url; dependency_url;
private boolean hasExpansion, private boolean hasExpansion,
shouldUpdate, shouldUpdate,
verified; verified;
private long last_update, private long last_update,
ratings_count; ratings_count;
private double average_rating; private double average_rating;
private List<String> placeholders; private List<String> placeholders;
private List<Version> versions; private List<Version> versions;
public CloudExpansion() { public CloudExpansion() {
} }
public String getTimeSinceLastUpdate() { public String getTimeSinceLastUpdate() {
int time = (int) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - getLastUpdate()); int time = (int) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - getLastUpdate());
return TimeUtil.getTime(time); return TimeUtil.getTime(time);
} }
public String getName() { public String getName() {
return name; return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Version getVersion() {
return getLatestVersion() == null ? null : getVersion(getLatestVersion());
}
public Version getVersion(String version) {
return versions == null ? null : versions.stream()
.filter(v -> v.getVersion().equals(version))
.findFirst()
.orElse(null);
}
public List<String> getAvailableVersions() {
return versions.stream().map(Version::getVersion).collect(Collectors.toList());
}
public String getLatestVersion() {
return latest_version;
}
public void setLatestVersion(String latest_version) {
this.latest_version = latest_version;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getSourceUrl() {
return source_url;
}
public void setSourceUrl(String source_url) {
this.source_url = source_url;
}
public String getDependencyUrl() {
return dependency_url;
}
public void setDependencyUrl(String dependency_url) {
this.dependency_url = dependency_url;
}
public boolean hasExpansion() {
return hasExpansion;
}
public void setHasExpansion(boolean hasExpansion) {
this.hasExpansion = hasExpansion;
}
public boolean shouldUpdate() {
return shouldUpdate;
}
public void setShouldUpdate(boolean shouldUpdate) {
this.shouldUpdate = shouldUpdate;
}
public boolean isVerified() {
return verified;
}
public long getLastUpdate() {
return last_update;
}
public void setLastUpdate(long last_update) {
this.last_update = last_update;
}
public long getRatingsCount() {
return ratings_count;
}
public double getAverage_rating() {
return average_rating;
}
public List<String> getPlaceholders() {
return placeholders;
}
public void setPlaceholders(List<String> placeholders) {
this.placeholders = placeholders;
}
public List<Version> getVersions() {
return versions;
}
public void setVersions(List<Version> versions) {
this.versions = versions;
}
public class Version {
private String url, version, release_notes;
public String getUrl() {
return url;
} }
public void setName(String name) { public void setUrl(String url) {
this.name = name; this.url = url;
} }
public String getAuthor() { public String getVersion() {
return author; return version;
} }
public void setAuthor(String author) { public void setVersion(String version) {
this.author = author; this.version = version;
} }
public Version getVersion() { public String getReleaseNotes() {
return getLatestVersion() == null ? null : getVersion(getLatestVersion()); return release_notes;
} }
public Version getVersion(String version) { public void setReleaseNotes(String release_notes) {
return versions == null ? null : versions.stream() this.release_notes = release_notes;
.filter(v -> v.getVersion().equals(version))
.findFirst()
.orElse(null);
}
public List<String> getAvailableVersions() {
return versions.stream().map(Version::getVersion).collect(Collectors.toList());
}
public String getLatestVersion() {
return latest_version;
}
public void setLatestVersion(String latest_version) {
this.latest_version = latest_version;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getSourceUrl() {
return source_url;
}
public void setSourceUrl(String source_url) {
this.source_url = source_url;
}
public String getDependencyUrl() {
return dependency_url;
}
public void setDependencyUrl(String dependency_url) {
this.dependency_url = dependency_url;
}
public boolean hasExpansion() {
return hasExpansion;
}
public void setHasExpansion(boolean hasExpansion) {
this.hasExpansion = hasExpansion;
}
public boolean shouldUpdate() {
return shouldUpdate;
}
public void setShouldUpdate(boolean shouldUpdate) {
this.shouldUpdate = shouldUpdate;
}
public boolean isVerified() {
return verified;
}
public long getLastUpdate() {
return last_update;
}
public void setLastUpdate(long last_update) {
this.last_update = last_update;
}
public long getRatingsCount() {
return ratings_count;
}
public double getAverage_rating() {
return average_rating;
}
public List<String> getPlaceholders() {
return placeholders;
}
public void setPlaceholders(List<String> placeholders) {
this.placeholders = placeholders;
}
public List<Version> getVersions() {
return versions;
}
public void setVersions(List<Version> versions) {
this.versions = versions;
}
public class Version {
private String url, version, release_notes;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getReleaseNotes() {
return release_notes;
}
public void setReleaseNotes(String release_notes) {
this.release_notes = release_notes;
}
} }
}
} }

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,120 +150,70 @@ 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"); if (ex != null && ex.isRegistered()) {
cexp.setHasExpansion(true);
connection.connect(); if (!ex.getVersion().equals(cexp.getLatestVersion())) {
cexp.setShouldUpdate(true);
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()) {
ce.setHasExpansion(true);
if (!ex.getVersion().equals(ce.getLatestVersion())) {
ce.setShouldUpdate(true);
}
}
unsorted.add(ce);
} }
int count = 0; unsorted.add(cexp);
unsorted.sort(Comparator.comparing(CloudExpansion::getLastUpdate).reversed());
for (CloudExpansion e : unsorted) {
remote.put(count, e);
count++;
}
plugin.getLogger().info(count + " placeholder expansions are available on the cloud.");
long updates = getToUpdateCount();
if (updates > 0) {
plugin.getLogger().info(updates + " installed expansions have updates available.");
}
} }
});
unsorted.sort(Comparator.comparing(CloudExpansion::getLastUpdate).reversed());
int count = 0;
for (CloudExpansion e : unsorted) {
remote.put(count++, e);
} }
}.runTaskAsynchronously(plugin);
plugin.getLogger().info(count + " placeholder expansions are available on the cloud.");
long updates = getToUpdateCount();
if (updates > 0) {
plugin.getLogger().info(updates + " installed expansions have updates available.");
}
});
}
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());
} }
@@ -313,10 +263,10 @@ public class ExpansionCloudManager {
} }
final CloudExpansion.Version ver = ex.getVersions() final CloudExpansion.Version ver = ex.getVersions()
.stream() .stream()
.filter(v -> v.getVersion().equals(version)) .filter(v -> v.getVersion().equals(version))
.findFirst() .findFirst()
.orElse(null); .orElse(null);
if (ver == null) { if (ver == null) {
return; return;
@@ -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

@@ -28,30 +28,30 @@ import org.bukkit.plugin.Plugin;
@Deprecated @Deprecated
public abstract class EZPlaceholderHook extends PlaceholderHook { public abstract class EZPlaceholderHook extends PlaceholderHook {
private String identifier; private String identifier;
private String plugin; private String plugin;
public EZPlaceholderHook(Plugin plugin, String identifier) { public EZPlaceholderHook(Plugin plugin, String identifier) {
Validate.notNull(plugin, "Plugin can not be null!"); Validate.notNull(plugin, "Plugin can not be null!");
Validate.notNull(identifier, "Placeholder name can not be null!"); Validate.notNull(identifier, "Placeholder name can not be null!");
this.identifier = identifier; this.identifier = identifier;
this.plugin = plugin.getName(); this.plugin = plugin.getName();
} }
public boolean isHooked() { public boolean isHooked() {
return PlaceholderAPI.getRegisteredPlaceholderPlugins().contains(identifier); return PlaceholderAPI.getRegisteredPlaceholderPlugins().contains(identifier);
} }
public boolean hook() { public boolean hook() {
return PlaceholderAPI.registerPlaceholderHook(identifier, this); return PlaceholderAPI.registerPlaceholderHook(identifier, this);
} }
public String getPlaceholderName() { public String getPlaceholderName() {
return identifier; return identifier;
} }
public String getPluginName() { public String getPluginName() {
return plugin; return plugin;
} }
} }

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,77 +12,82 @@ 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;
public UpdateChecker(PlaceholderAPIPlugin i) { public UpdateChecker(PlaceholderAPIPlugin i) {
plugin = i; plugin = i;
pluginVersion = i.getDescription().getVersion(); pluginVersion = i.getDescription().getVersion();
}
public boolean hasUpdateAvailable() {
return updateAvailable;
}
public String getSpigotVersion() {
return spigotVersion;
}
public void fetch() {
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
try {
HttpsURLConnection con = (HttpsURLConnection) new URL(
"https://api.spigotmc.org/legacy/update.php?resource=" + RESOURCE_ID).openConnection();
con.setRequestMethod("GET");
spigotVersion = new BufferedReader(new InputStreamReader(con.getInputStream())).readLine();
} catch (Exception ex) {
plugin.getLogger().info("Failed to check for updates on spigot.");
return;
}
if (spigotVersion == null || spigotVersion.isEmpty()) {
return;
}
updateAvailable = spigotIsNewer();
if (!updateAvailable) {
return;
}
Bukkit.getScheduler().runTask(plugin, () -> {
plugin.getLogger()
.info("An update for PlaceholderAPI (v" + getSpigotVersion() + ") is available at:");
plugin.getLogger()
.info("https://www.spigotmc.org/resources/placeholderapi." + RESOURCE_ID + "/");
Bukkit.getPluginManager().registerEvents(this, plugin);
});
});
}
private boolean spigotIsNewer() {
if (spigotVersion == null || spigotVersion.isEmpty()) {
return false;
}
String plV = toReadable(pluginVersion);
String spV = toReadable(spigotVersion);
return plV.compareTo(spV) < 0;
}
private String toReadable(String version) {
if (version.contains("-DEV-")) {
version = version.split("-DEV-")[0];
} }
return version.replaceAll("\\.", "");
}
public boolean hasUpdateAvailable() { return updateAvailable; } @EventHandler(priority = EventPriority.MONITOR)
public void onJoin(PlayerJoinEvent e) {
public String getSpigotVersion() { if (e.getPlayer().hasPermission("placeholderapi.updatenotify")) {
return spigotVersion; Msg.msg(e.getPlayer(),
} "&bAn update for &fPlaceholder&7API &e(&fPlaceholder&7API &fv" + getSpigotVersion()
+ "&e)"
public void fetch() { , "&bis available at &ehttps://www.spigotmc.org/resources/placeholderapi." + RESOURCE_ID
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + "/");
try {
HttpsURLConnection con = (HttpsURLConnection) new URL("https://api.spigotmc.org/legacy/update.php?resource=" + RESOURCE_ID).openConnection();
con.setRequestMethod("GET");
spigotVersion = new BufferedReader(new InputStreamReader(con.getInputStream())).readLine();
} catch (Exception ex) {
plugin.getLogger().info("Failed to check for updates on spigot.");
return;
}
if (spigotVersion == null || spigotVersion.isEmpty()) {
return;
}
updateAvailable = spigotIsNewer();
if (!updateAvailable) {
return;
}
Bukkit.getScheduler().runTask(plugin, () -> {
plugin.getLogger().info("An update for PlaceholderAPI (v" + getSpigotVersion() + ") is available at:");
plugin.getLogger().info("https://www.spigotmc.org/resources/placeholderapi." + RESOURCE_ID + "/");
Bukkit.getPluginManager().registerEvents(this, plugin);
});
});
}
private boolean spigotIsNewer() {
if (spigotVersion == null || spigotVersion.isEmpty()) return false;
String plV = toReadable(pluginVersion);
String spV = toReadable(spigotVersion);
return plV.compareTo(spV) < 0;
}
private String toReadable(String version) {
if (version.contains("-DEV-")) {
version = version.split("-DEV-")[0];
}
return version.replaceAll("\\.","");
}
@EventHandler(priority = EventPriority.MONITOR)
public void onJoin(PlayerJoinEvent e) {
if (e.getPlayer().hasPermission("placeholderapi.updatenotify")) {
Msg.msg(e.getPlayer(), "&bAn update for &fPlaceholder&7API &e(&fPlaceholder&7API &fv" + getSpigotVersion() + "&e)"
, "&bis available at &ehttps://www.spigotmc.org/resources/placeholderapi." + RESOURCE_ID + "/");
}
} }
}
} }

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,64 +28,66 @@ 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) {
List<Class<?>> list = new ArrayList<>(); return getClasses(folder, null, type);
try { }
File f = new File(PlaceholderAPIPlugin.getInstance().getDataFolder(), folder);
if (!f.exists()) {
if (!f.mkdir()) {
PlaceholderAPIPlugin.getInstance().getLogger().severe("Failed to create " + folder + " folder!");
}
return list;
}
FilenameFilter fileNameFilter = (dir, name) -> {
int i = name.lastIndexOf('.');
return i > 0 && name.substring(i).equals(".jar");
};
File[] jars = f.listFiles(fileNameFilter);
if (jars == null) {
return list;
}
for (File file : jars) {
list = gather(file.toURI().toURL(), list, type);
}
return list;
} catch (Throwable t) {}
return null;
}
private static List<Class<?>> gather(URL jar, List<Class<?>> list, Class<?> clazz) { public static List<Class<?>> getClasses(String folder, String fileName, Class<?> type) {
if (list == null) { List<Class<?>> list = new ArrayList<>();
list = new ArrayList<>(); try {
} File f = new File(PlaceholderAPIPlugin.getInstance().getDataFolder(), folder);
try { if (!f.exists()) {
URLClassLoader cl = new URLClassLoader(new URL[]{jar}, clazz.getClassLoader());
JarInputStream jis = new JarInputStream(jar.openStream());
while (true) {
JarEntry j = jis.getNextJarEntry();
if (j == null) {
break;
}
String name = j.getName();
if (name == null || name.isEmpty()) {
continue;
}
if (name.endsWith(".class")) {
name = name.replace("/", ".");
String cname = name.substring(0, name.lastIndexOf(".class"));
Class<?> c = cl.loadClass(cname);
if (clazz.isAssignableFrom(c)) {
list.add(c);
}
}
}
cl.close();
jis.close();
} catch (Throwable t) {
}
return list; return list;
}
FilenameFilter fileNameFilter = (dir, name) -> {
if (fileName != null) {
return name.endsWith(".jar") && name.replace(".jar", "")
.equalsIgnoreCase(fileName.replace(".jar", ""));
}
return name.endsWith(".jar");
};
File[] jars = f.listFiles(fileNameFilter);
if (jars == null) {
return list;
}
for (File file : jars) {
list = gather(file.toURI().toURL(), list, type);
}
return list;
} catch (Throwable t) {
} }
return null;
}
private static List<Class<?>> gather(URL jar, List<Class<?>> list, Class<?> clazz) {
if (list == null) {
list = new ArrayList<>();
}
try (URLClassLoader cl = new URLClassLoader(new URL[]{jar}, clazz.getClassLoader()); JarInputStream jis = new JarInputStream(jar.openStream())) {
while (true) {
JarEntry j = jis.getNextJarEntry();
if (j == null) {
break;
}
String name = j.getName();
if (name == null || name.isEmpty()) {
continue;
}
if (name.endsWith(".class")) {
name = name.replace("/", ".");
String cname = name.substring(0, name.lastIndexOf(".class"));
Class<?> c = cl.loadClass(cname);
if (clazz.isAssignableFrom(c)) {
list.add(c);
}
}
}
} catch (Throwable t) {
}
return list;
}
} }

View File

@@ -20,18 +20,22 @@
*/ */
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 String color(String text) { public static void broadcast(String... msg) {
return ChatColor.translateAlternateColorCodes('&', text); Arrays.stream(msg).map(Msg::color).forEach(Bukkit::broadcastMessage);
} }
public static String color(String text) {
return ChatColor.translateAlternateColorCodes('&', text);
}
} }

View File

@@ -22,8 +22,8 @@ package me.clip.placeholderapi.util;
public enum TimeFormat { public enum TimeFormat {
DAYS, DAYS,
HOURS, HOURS,
MINUTES, MINUTES,
SECONDS SECONDS
} }

View File

@@ -22,141 +22,141 @@ package me.clip.placeholderapi.util;
public class TimeUtil { 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:
return "0"; return "0";
case MINUTES: case MINUTES:
return "0"; return "0";
case SECONDS: case SECONDS:
return String.valueOf(seconds); return String.valueOf(seconds);
} }
return String.valueOf(seconds); return String.valueOf(seconds);
} }
int minutes = seconds / 60; int minutes = seconds / 60;
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:
return "0"; return "0";
case MINUTES: case MINUTES:
return String.valueOf(minutes); return String.valueOf(minutes);
case SECONDS: case SECONDS:
return String.valueOf(secondsLeft); return String.valueOf(secondsLeft);
} }
return String.valueOf(seconds); return String.valueOf(seconds);
} }
if (minutes < 1440) { if (minutes < 1440) {
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:
return String.valueOf(hours); return String.valueOf(hours);
case MINUTES: case MINUTES:
return String.valueOf(leftOver); return String.valueOf(leftOver);
case SECONDS: case SECONDS:
return String.valueOf(secondsLeft); return String.valueOf(secondsLeft);
} }
return String.valueOf(seconds); return String.valueOf(seconds);
} }
int days = minutes / 1440; int days = minutes / 1440;
int inMins = 1440 * days; int inMins = 1440 * days;
int leftOver = minutes - inMins; int leftOver = minutes - inMins;
if (leftOver < 60) { if (leftOver < 60) {
switch (type) { switch (type) {
case DAYS: case DAYS:
return String.valueOf(days); return String.valueOf(days);
case HOURS: case HOURS:
return String.valueOf(0); return String.valueOf(0);
case MINUTES: case MINUTES:
return String.valueOf(leftOver); return String.valueOf(leftOver);
case SECONDS: case SECONDS:
return String.valueOf(secondsLeft); return String.valueOf(secondsLeft);
} }
return String.valueOf(seconds); return String.valueOf(seconds);
} else { } else {
int hours = leftOver / 60; int hours = leftOver / 60;
int hoursInMins = 60 * hours; int hoursInMins = 60 * hours;
int minsLeft = leftOver - hoursInMins; int minsLeft = leftOver - hoursInMins;
switch (type) { switch (type) {
case DAYS: case DAYS:
return String.valueOf(days); return String.valueOf(days);
case HOURS: case HOURS:
return String.valueOf(hours); return String.valueOf(hours);
case MINUTES: case MINUTES:
return String.valueOf(minsLeft); return String.valueOf(minsLeft);
case SECONDS: case SECONDS:
return String.valueOf(secondsLeft); return String.valueOf(secondsLeft);
} }
return String.valueOf(seconds); return String.valueOf(seconds);
} }
} }
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;
int s = 60 * minutes; int s = 60 * minutes;
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