Compare commits

..

7 Commits

Author SHA1 Message Date
PiggyPiglet
e3602e5aea Merge pull request #667 from PlaceholderAPI/fix/666-lowercase-issues
Fix issue with invalid placeholder pattern lowercasing text
2021-12-13 15:03:33 +08:00
PiggyPiglet
b8d4dcd570 Merge branch 'development' into fix/666-lowercase-issues 2021-12-13 15:03:03 +08:00
Andre_601
8a249a9a2e Merge branch 'master' into development 2021-12-03 04:49:14 +01:00
PiggyPiglet
915166f78b Merge pull request #747 from PlaceholderAPI/feature/update-dependencies
Update Dependencies of PlaceholderAPI
2021-12-03 11:37:13 +08:00
Andre601
533b892cf4 Add missing trailing / 2021-11-11 13:57:43 +01:00
Andre601
6676e2fa21 Update dependencies of PlaceholderAPI 2021-11-11 13:40:41 +01:00
Andre601
99e5752352 Fix #666 (String being lowecased) 2021-07-15 00:29:41 +02:00
62 changed files with 446 additions and 757 deletions

View File

@@ -38,9 +38,8 @@ labels:
- Currently used Versions of your server and PlaceholderAPI - Currently used Versions of your server and PlaceholderAPI
- Currently installed Expansions - Currently installed Expansions
- Currently installed Plugins - Currently installed Plugins
- Any additional information requested by users in this issue.
The easiest way to provide those information is through the `/papi dump` command which posts the required information to https://paste.helpch.at and gives a URL to share. The easiest way to provide those information is through the `/papi dumb` command which posts the required information to https://paste.helpch.at and gives a URL to share.
unlabeled: unlabeled:
issue: issue:
body: |- body: |-
@@ -77,15 +76,6 @@ labels:
Don't hesitate to ask us any questions. Don't hesitate to ask us any questions.
action: close action: close
- name: 'Type: Invalid (Wiki)'
labeled:
pr:
body: |-
Your Wiki Pull request has been marked as **invalid**.
Pull requests targeting the wiki need to be based of and target the `docs/wiki` branch of this repository.
More information can be found on the [Wiki README](https://github.com/PlaceholderAPI/PlaceholderAPI/blob/docs/wiki/wiki/README.md).
action: close
- name: 'Target: Wiki' - name: 'Target: Wiki'
labeled: labeled:
issue: issue:

View File

@@ -28,9 +28,9 @@
# 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.
Support for specific plugins are provided either by the plugin itself or through expansions. The expansions may be downloaded in-game through the PAPI Expansion Cloud. There are currently over 240+ expansions that support a wide variety of plugins, such as Essentials, Factions, LuckPerms, and Vault. Support for specific plugins are provided either by the plugin itself or through expansions. The expansions may be downloaded in-game through the PAPI Expansion Cloud. There are currently over 150+ expansions that support a wide variety of plugins, such as Essentials, Factions, LuckPerms, and Vault.
PlaceholderAPI has been downloaded over 1,000,000 times and has been used concurrently on over 40,000 servers, which makes it a must-have for a server of any type or scale. PlaceholderAPI has been downloaded over 750,000 times and has been used concurrently on over 35,000 servers, which makes it a must-have for a server of any type or scale.
## Contribute ## Contribute
If you would like to contribute towards PlaceholderAPI should you take a look at our [Contributing file][contributing] for the ins and outs on how you can do that and what you need to keep in mind. If you would like to contribute towards PlaceholderAPI should you take a look at our [Contributing file][contributing] for the ins and outs on how you can do that and what you need to keep in mind.

View File

@@ -3,12 +3,12 @@ import org.apache.tools.ant.filters.ReplaceTokens
plugins { plugins {
id "java" id "java"
id "maven-publish" id "maven-publish"
id "org.cadixdev.licenser" version "0.6.1" id "org.cadixdev.licenser" version "0.6.0"
id "com.github.johnrengelman.shadow" version "7.1.0" id "com.github.johnrengelman.shadow" version "7.0.0"
} }
group "me.clip" group "me.clip"
version "2.11.2-DEV-${System.getProperty("BUILD_NUMBER")}" version "2.10.10-DEV-${System.getProperty("BUILD_NUMBER")}"
description "An awesome placeholder provider!" description "An awesome placeholder provider!"
@@ -24,15 +24,16 @@ repositories {
dependencies { dependencies {
implementation "org.bstats:bstats-bukkit:2.2.1" implementation "org.bstats:bstats-bukkit:2.2.1"
implementation "net.kyori:adventure-platform-bukkit:4.0.1"
compileOnly "org.spigotmc:spigot-api:1.18-R0.1-SNAPSHOT" implementation "net.kyori:adventure-platform-bukkit:4.0.0"
compileOnly "org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT"
compileOnly "org.jetbrains:annotations:22.0.0" compileOnly "org.jetbrains:annotations:22.0.0"
testImplementation "org.openjdk.jmh:jmh-core:1.32" testImplementation "org.openjdk.jmh:jmh-core:1.32"
testImplementation "org.openjdk.jmh:jmh-generator-annprocess:1.32" testImplementation "org.openjdk.jmh:jmh-generator-annprocess:1.32"
testImplementation "org.junit.jupiter:junit-jupiter-engine:5.8.2" testImplementation "org.junit.jupiter:junit-jupiter-engine:5.8.1"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.8.1" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.8.1"
} }

Binary file not shown.

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

257
gradlew vendored
View File

@@ -1,7 +1,7 @@
#!/bin/sh #!/usr/bin/env sh
# #
# Copyright <20> 2015-2021 the original authors. # Copyright 2015 the original author or authors.
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@@ -17,101 +17,67 @@
# #
############################################################################## ##############################################################################
# ##
# Gradle start up script for POSIX generated by Gradle. ## Gradle start up script for UN*X
# ##
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions <20>$var<61>, <20>${var}<7D>, <20>${var:-default}<7D>, <20>${var+SET}<7D>,
# <20>${var#prefix}<7D>, <20>${var%suffix}<7D>, and <20>$( cmd )<29>;
# * compound commands having a testable exit status, especially <20>case<73>;
# * various built-in commands including <20>command<6E>, <20>set<65>, and <20>ulimit<69>.
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
############################################################################## ##############################################################################
# Attempt to set APP_HOME # Attempt to set APP_HOME
# Resolve links: $0 may be a link # Resolve links: $0 may be a link
app_path=$0 PRG="$0"
# Need this for relative symlinks.
# Need this for daisy-chained symlinks. while [ -h "$PRG" ] ; do
while ls=`ls -ld "$PRG"`
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path link=`expr "$ls" : '.*-> \(.*\)$'`
[ -h "$app_path" ] if expr "$link" : '/.*' > /dev/null; then
do PRG="$link"
ls=$( ls -ld "$app_path" ) else
link=${ls#*' -> '} PRG=`dirname "$PRG"`"/$link"
case $link in #( fi
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done done
SAVED="`pwd`"
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle" APP_NAME="Gradle"
APP_BASE_NAME=${0##*/} APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD="maximum"
warn () { warn () {
echo "$*" echo "$*"
} >&2 }
die () { die () {
echo echo
echo "$*" echo "$*"
echo echo
exit 1 exit 1
} >&2 }
# OS specific support (must be 'true' or 'false'). # OS specific support (must be 'true' or 'false').
cygwin=false cygwin=false
msys=false msys=false
darwin=false darwin=false
nonstop=false nonstop=false
case "$( uname )" in #( case "`uname`" in
CYGWIN* ) cygwin=true ;; #( CYGWIN* )
Darwin* ) darwin=true ;; #( cygwin=true
MSYS* | MINGW* ) msys=true ;; #( ;;
NONSTOP* ) nonstop=true ;; Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -121,9 +87,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
if [ -n "$JAVA_HOME" ] ; then if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables # IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java JAVACMD="$JAVA_HOME/jre/sh/java"
else else
JAVACMD=$JAVA_HOME/bin/java JAVACMD="$JAVA_HOME/bin/java"
fi fi
if [ ! -x "$JAVACMD" ] ; then if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -132,7 +98,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi fi
else else
JAVACMD=java JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the Please set the JAVA_HOME variable in your environment to match the
@@ -140,95 +106,80 @@ location of your Java installation."
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
case $MAX_FD in #( MAX_FD_LIMIT=`ulimit -H -n`
max*) if [ $? -eq 0 ] ; then
MAX_FD=$( ulimit -H -n ) || if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
warn "Could not query maximum file descriptor limit" MAX_FD="$MAX_FD_LIMIT"
esac fi
case $MAX_FD in #( ulimit -n $MAX_FD
'' | soft) :;; #( if [ $? -ne 0 ] ; then
*) warn "Could not set maximum file descriptor limit: $MAX_FD"
ulimit -n "$MAX_FD" || fi
warn "Could not set maximum file descriptor limit to $MAX_FD" else
esac warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi fi
# Collect all arguments for the java command, stacking in reverse order: # For Darwin, add options to specify how the application appears in the dock
# * args from the command line if $darwin; then
# * the main class name GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
# * -classpath fi
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java # For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=$( cygpath --unix "$JAVACMD" ) JAVACMD=`cygpath --unix "$JAVACMD"`
# Now convert the arguments - kludge to limit ourselves to /bin/sh # We build the pattern for arguments to be converted via cygpath
for arg do ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
if SEP=""
case $arg in #( for dir in $ROOTDIRSRAW ; do
-*) false ;; # don't mess with options #( ROOTDIRS="$ROOTDIRS$SEP$dir"
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath SEP="|"
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi fi
# Collect all arguments for the java command; # Escape application args
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of save () {
# shell script including quotes and variable substitutions, so put them in for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
# double quotes to make sure that they get re-expanded; and echo " "
# * put everything else in single quotes, so that it's not re-expanded. }
APP_ARGS=`save "$@"`
set -- \ # Collect all arguments for the java command, following the shell quoting and substitution rules
"-Dorg.gradle.appname=$APP_BASE_NAME" \ eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@" exec "$JAVACMD" "$@"

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -22,7 +22,6 @@ package me.clip.placeholderapi;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@@ -186,7 +185,7 @@ public final class PlaceholderAPI {
continue; continue;
} }
String identifier = format.substring(0, index).toLowerCase(Locale.ROOT); String identifier = format.substring(0, index).toLowerCase();
String params = format.substring(index + 1); String params = format.substring(index + 1);
final PlaceholderExpansion expansion = PlaceholderAPIPlugin.getInstance() final PlaceholderExpansion expansion = PlaceholderAPIPlugin.getInstance()
.getLocalExpansionManager().getExpansion(identifier); .getLocalExpansionManager().getExpansion(identifier);
@@ -293,14 +292,14 @@ public final class PlaceholderAPI {
// === Deprecated API === // === Deprecated API ===
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static boolean registerExpansion(PlaceholderExpansion expansion) public static boolean registerExpansion(PlaceholderExpansion expansion)
{ {
return expansion.register(); return expansion.register();
} }
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static boolean unregisterExpansion(PlaceholderExpansion expansion) public static boolean unregisterExpansion(PlaceholderExpansion expansion)
{ {
return expansion.unregister(); return expansion.unregister();
@@ -314,7 +313,7 @@ public final class PlaceholderAPI {
* @return Map of registered placeholders * @return Map of registered placeholders
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static Map<String, PlaceholderHook> getPlaceholders() { public static Map<String, PlaceholderHook> getPlaceholders() {
return PlaceholderAPIPlugin.getInstance().getLocalExpansionManager() return PlaceholderAPIPlugin.getInstance().getLocalExpansionManager()
.getExpansions().stream() .getExpansions().stream()
@@ -330,7 +329,7 @@ public final class PlaceholderAPI {
* @return always false * @return always false
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static boolean registerPlaceholderHook(Plugin plugin, PlaceholderHook placeholderHook) { public static boolean registerPlaceholderHook(Plugin plugin, PlaceholderHook placeholderHook) {
PlaceholderAPIPlugin.getInstance().getLogger().warning(plugin.getName() PlaceholderAPIPlugin.getInstance().getLogger().warning(plugin.getName()
+ " is attempting to register placeholders via a PlaceholderHook class which is no longer supported!" + " is attempting to register placeholders via a PlaceholderHook class which is no longer supported!"
@@ -348,7 +347,7 @@ public final class PlaceholderAPI {
* @return always false * @return always false
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static boolean registerPlaceholderHook(String identifier, public static boolean registerPlaceholderHook(String identifier,
PlaceholderHook placeholderHook) { PlaceholderHook placeholderHook) {
PlaceholderAPIPlugin.getInstance().getLogger().warning(identifier PlaceholderAPIPlugin.getInstance().getLogger().warning(identifier
@@ -364,7 +363,7 @@ public final class PlaceholderAPI {
* @return always false * @return always false
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static boolean unregisterPlaceholderHook(Plugin plugin) { public static boolean unregisterPlaceholderHook(Plugin plugin) {
PlaceholderAPIPlugin.getInstance().getLogger().warning(plugin.getName() PlaceholderAPIPlugin.getInstance().getLogger().warning(plugin.getName()
+ " is attempting to unregister placeholders via the PlaceholderAPI class which is no longer supported!" + " is attempting to unregister placeholders via the PlaceholderAPI class which is no longer supported!"
@@ -381,7 +380,7 @@ public final class PlaceholderAPI {
* @return always false * @return always false
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static boolean unregisterPlaceholderHook(String identifier) { public static boolean unregisterPlaceholderHook(String identifier) {
PlaceholderAPIPlugin.getInstance().getLogger().warning(identifier PlaceholderAPIPlugin.getInstance().getLogger().warning(identifier
+ " is attempting to unregister placeholders through the PlaceholderAPI class which is no longer supported!"); + " is attempting to unregister placeholders through the PlaceholderAPI class which is no longer supported!");
@@ -394,7 +393,7 @@ public final class PlaceholderAPI {
* @return Set of registered identifiers * @return Set of registered identifiers
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static Set<String> getRegisteredPlaceholderPlugins() { public static Set<String> getRegisteredPlaceholderPlugins() {
return getRegisteredIdentifiers(); return getRegisteredIdentifiers();
} }
@@ -405,7 +404,7 @@ public final class PlaceholderAPI {
* @return always null * @return always null
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static Set<String> getExternalPlaceholderPlugins() { public static Set<String> getExternalPlaceholderPlugins() {
return null; return null;
} }
@@ -420,7 +419,7 @@ public final class PlaceholderAPI {
* @return String with the parsed placeholders * @return String with the parsed placeholders
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static String setPlaceholders(OfflinePlayer player, public static String setPlaceholders(OfflinePlayer player,
String text, Pattern pattern, boolean colorize) { String text, Pattern pattern, boolean colorize) {
return setPlaceholders(player, text); return setPlaceholders(player, text);
@@ -436,7 +435,7 @@ public final class PlaceholderAPI {
* @return String with the parsed placeholders * @return String with the parsed placeholders
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static List<String> setPlaceholders(OfflinePlayer player, public static List<String> setPlaceholders(OfflinePlayer player,
List<String> text, Pattern pattern, boolean colorize) { List<String> text, Pattern pattern, boolean colorize) {
return setPlaceholders(player, text); return setPlaceholders(player, text);
@@ -451,7 +450,7 @@ public final class PlaceholderAPI {
* @return String with the parsed placeholders * @return String with the parsed placeholders
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static List<String> setPlaceholders(OfflinePlayer player, List<String> text, public static List<String> setPlaceholders(OfflinePlayer player, List<String> text,
boolean colorize) { boolean colorize) {
return setPlaceholders(player, text); return setPlaceholders(player, text);
@@ -466,7 +465,7 @@ public final class PlaceholderAPI {
* @return String with the parsed placeholders * @return String with the parsed placeholders
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static List<String> setPlaceholders(OfflinePlayer player, List<String> text, public static List<String> setPlaceholders(OfflinePlayer player, List<String> text,
Pattern pattern) { Pattern pattern) {
return setPlaceholders(player, text); return setPlaceholders(player, text);
@@ -480,7 +479,7 @@ public final class PlaceholderAPI {
* @return String with the parsed placeholders * @return String with the parsed placeholders
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static String setPlaceholders(Player player, String text, boolean colorize) { public static String setPlaceholders(Player player, String text, boolean colorize) {
return setPlaceholders(player, text); return setPlaceholders(player, text);
} }
@@ -494,7 +493,7 @@ public final class PlaceholderAPI {
* @return String with the parsed placeholders * @return String with the parsed placeholders
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static List<String> setPlaceholders(Player player, List<String> text, boolean colorize) { public static List<String> setPlaceholders(Player player, List<String> text, boolean colorize) {
return setPlaceholders(player, text); return setPlaceholders(player, text);
} }
@@ -508,7 +507,7 @@ public final class PlaceholderAPI {
* @return String with the parsed placeholders * @return String with the parsed placeholders
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static String setPlaceholders(OfflinePlayer player, String text, boolean colorize) { public static String setPlaceholders(OfflinePlayer player, String text, boolean colorize) {
return setPlaceholders(player, text); return setPlaceholders(player, text);
} }
@@ -522,7 +521,7 @@ public final class PlaceholderAPI {
* @return String with the parsed placeholders * @return String with the parsed placeholders
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static String setPlaceholders(OfflinePlayer player, String text, Pattern pattern) { public static String setPlaceholders(OfflinePlayer player, String text, Pattern pattern) {
return setPlaceholders(player, text); return setPlaceholders(player, text);
} }
@@ -536,7 +535,7 @@ public final class PlaceholderAPI {
* @return String with the parsed placeholders * @return String with the parsed placeholders
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static List<String> setBracketPlaceholders(OfflinePlayer player, List<String> text, public static List<String> setBracketPlaceholders(OfflinePlayer player, List<String> text,
boolean colorize) { boolean colorize) {
return setBracketPlaceholders(player, text); return setBracketPlaceholders(player, text);
@@ -551,7 +550,7 @@ public final class PlaceholderAPI {
* @return String with the parsed placeholders * @return String with the parsed placeholders
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static String setBracketPlaceholders(OfflinePlayer player, String text, boolean colorize) { public static String setBracketPlaceholders(OfflinePlayer player, String text, boolean colorize) {
return setBracketPlaceholders(player, text); return setBracketPlaceholders(player, text);
} }
@@ -565,7 +564,7 @@ public final class PlaceholderAPI {
* @return String with the parsed placeholders * @return String with the parsed placeholders
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static String setBracketPlaceholders(Player player, String text, boolean colorize) { public static String setBracketPlaceholders(Player player, String text, boolean colorize) {
return setBracketPlaceholders(player, text); return setBracketPlaceholders(player, text);
} }
@@ -579,7 +578,7 @@ public final class PlaceholderAPI {
* @return String with the parsed placeholders * @return String with the parsed placeholders
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static List<String> setBracketPlaceholders(Player player, List<String> text, public static List<String> setBracketPlaceholders(Player player, List<String> text,
boolean colorize) { boolean colorize) {
return setBracketPlaceholders(player, text); return setBracketPlaceholders(player, text);
@@ -597,7 +596,7 @@ public final class PlaceholderAPI {
* @deprecated Use {@link #setPlaceholders(OfflinePlayer, String)} instead. * @deprecated Use {@link #setPlaceholders(OfflinePlayer, String)} instead.
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static String setRelationalPlaceholders(Player one, Player two, String text, public static String setRelationalPlaceholders(Player one, Player two, String text,
boolean colorize) { boolean colorize) {
return setRelationalPlaceholders(one, two, text); return setRelationalPlaceholders(one, two, text);
@@ -615,7 +614,7 @@ public final class PlaceholderAPI {
* @deprecated Use {@link #setRelationalPlaceholders(Player, Player, List)} instead. * @deprecated Use {@link #setRelationalPlaceholders(Player, Player, List)} instead.
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public static List<String> setRelationalPlaceholders(Player one, Player two, List<String> text, public static List<String> setRelationalPlaceholders(Player one, Player two, List<String> text,
boolean colorize) { boolean colorize) {
return setRelationalPlaceholders(one, two, text); return setRelationalPlaceholders(one, two, text);

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -25,22 +25,8 @@ import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@Deprecated
public abstract class PlaceholderHook { public abstract class PlaceholderHook {
/**
* Please see {@link me.clip.placeholderapi.expansion.PlaceholderExpansion#parsePlaceholders(OfflinePlayer, String) PlaceholderExpansion#parsePlaceholder(OfflinePlayer, String)}
* for a full description of what this method is used for.
*
* @param player Possibly-null OfflinePlayer instance to use.
* @param params String after {@code %<expansion>_} and before the second percent symbol.
* @return Possibly-null String depending on the Expansions returned value.
* @deprecated Planned for removal in 2.14.0
* <br>Please use {@link me.clip.placeholderapi.expansion.PlaceholderExpansion#parsePlaceholders(OfflinePlayer, String) parsePlaceholders(OfflinePlayer, String)}
* instead
*/
@Nullable @Nullable
@Deprecated
public String onRequest(final OfflinePlayer player, @NotNull final String params) { public String onRequest(final OfflinePlayer player, @NotNull final String params) {
if (player != null && player.isOnline()) { if (player != null && player.isOnline()) {
return onPlaceholderRequest((Player) player, params); return onPlaceholderRequest((Player) player, params);
@@ -49,20 +35,7 @@ public abstract class PlaceholderHook {
return onPlaceholderRequest(null, params); return onPlaceholderRequest(null, params);
} }
/**
* Please see {@link me.clip.placeholderapi.expansion.PlaceholderExpansion#parsePlaceholders(Player, String) PlaceholderExpansion#parsePlaceholder(Player, String)}
* for a full description of what this method is used for.
*
* @param player Possibly-null Player instance to use.
* @param params String after {@code %<expansion>_} and before the second percent symbol.
* @return Possibly-null String depending on the Expansions returned value.
*
* @deprecated Planned for removal in 2.14.0
* <br>Please use {@link me.clip.placeholderapi.expansion.PlaceholderExpansion#parsePlaceholders(Player, String) parsePlaceholders(Player, String)}
* instead
*/
@Nullable @Nullable
@Deprecated
public String onPlaceholderRequest(final Player player, @NotNull final String params) { public String onPlaceholderRequest(final Player player, @NotNull final String params) {
return null; return null;
} }

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -23,7 +23,6 @@ package me.clip.placeholderapi.commands;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.stream.Stream; import java.util.stream.Stream;
import me.clip.placeholderapi.PlaceholderAPIPlugin; import me.clip.placeholderapi.PlaceholderAPIPlugin;
@@ -62,7 +61,7 @@ public abstract class PlaceholderCommand {
if (parameter == null) { if (parameter == null) {
possible.forEach(suggestions::add); possible.forEach(suggestions::add);
} else { } else {
possible.filter(suggestion -> suggestion.toLowerCase(Locale.ROOT).startsWith(parameter.toLowerCase(Locale.ROOT))) possible.filter(suggestion -> suggestion.toLowerCase().startsWith(parameter.toLowerCase()))
.forEach(suggestions::add); .forEach(suggestions::add);
} }
} }

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -27,7 +27,6 @@ import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.stream.Stream; import java.util.stream.Stream;
import me.clip.placeholderapi.PlaceholderAPIPlugin; import me.clip.placeholderapi.PlaceholderAPIPlugin;
@@ -96,7 +95,7 @@ public final class PlaceholderCommandRouter implements CommandExecutor, TabCompl
return true; return true;
} }
final String search = args[0].toLowerCase(Locale.ROOT); final String search = args[0].toLowerCase();
final PlaceholderCommand target = commands.get(search); final PlaceholderCommand target = commands.get(search);
if (target == null) { if (target == null) {
@@ -122,10 +121,10 @@ public final class PlaceholderCommandRouter implements CommandExecutor, TabCompl
final List<String> suggestions = new ArrayList<>(); final List<String> suggestions = new ArrayList<>();
if (args.length > 1) { if (args.length > 1) {
final PlaceholderCommand target = this.commands.get(args[0].toLowerCase(Locale.ROOT)); final PlaceholderCommand target = this.commands.get(args[0].toLowerCase());
if (target != null) { if (target != null) {
target.complete(plugin, sender, args[0].toLowerCase(Locale.ROOT), target.complete(plugin, sender, args[0].toLowerCase(),
Arrays.asList(Arrays.copyOfRange(args, 1, args.length)), suggestions); Arrays.asList(Arrays.copyOfRange(args, 1, args.length)), suggestions);
} }

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -24,7 +24,6 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.stream.Stream; import java.util.stream.Stream;
import me.clip.placeholderapi.PlaceholderAPIPlugin; import me.clip.placeholderapi.PlaceholderAPIPlugin;
@@ -101,7 +100,7 @@ public final class CommandECloud extends PlaceholderCommand {
return; return;
} }
final String search = params.get(0).toLowerCase(Locale.ROOT); final String search = params.get(0).toLowerCase();
final PlaceholderCommand target = commands.get(search); final PlaceholderCommand target = commands.get(search);
if (target == null) { if (target == null) {
@@ -137,7 +136,7 @@ public final class CommandECloud extends PlaceholderCommand {
return; // send sub commands return; // send sub commands
} }
final String search = params.get(0).toLowerCase(Locale.ROOT); final String search = params.get(0).toLowerCase();
final PlaceholderCommand target = commands.get(search); final PlaceholderCommand target = commands.get(search);
if (target == null) { if (target == null) {

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -87,7 +87,7 @@ public final class CommandECloudExpansionList extends PlaceholderCommand {
@NotNull @NotNull
private static Collection<CloudExpansion> getExpansions(@NotNull final String target, private static Collection<CloudExpansion> getExpansions(@NotNull final String target,
@NotNull final PlaceholderAPIPlugin plugin) { @NotNull final PlaceholderAPIPlugin plugin) {
switch (target.toLowerCase(Locale.ROOT)) { switch (target.toLowerCase()) {
case "all": case "all":
return plugin.getCloudExpansionManager().getCloudExpansions().values(); return plugin.getCloudExpansionManager().getCloudExpansions().values();
case "installed": case "installed":
@@ -112,7 +112,7 @@ public final class CommandECloudExpansionList extends PlaceholderCommand {
public static void addExpansionTitle(@NotNull final StringBuilder builder, public static void addExpansionTitle(@NotNull final StringBuilder builder,
@NotNull final String target, final int page) { @NotNull final String target, final int page) {
switch (target.toLowerCase(Locale.ROOT)) { switch (target.toLowerCase()) {
case "all": case "all":
builder.append("&bAll Expansions"); builder.append("&bAll Expansions");
break; break;

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -21,8 +21,6 @@
package me.clip.placeholderapi.commands.impl.cloud; package me.clip.placeholderapi.commands.impl.cloud;
import java.util.List; import java.util.List;
import java.util.Locale;
import me.clip.placeholderapi.PlaceholderAPIPlugin; import me.clip.placeholderapi.PlaceholderAPIPlugin;
import me.clip.placeholderapi.commands.PlaceholderCommand; import me.clip.placeholderapi.commands.PlaceholderCommand;
import me.clip.placeholderapi.util.Msg; import me.clip.placeholderapi.util.Msg;
@@ -43,7 +41,7 @@ public final class CommandECloudToggle extends PlaceholderCommand {
final boolean desiredState; final boolean desiredState;
final boolean currentState = plugin.getPlaceholderAPIConfig().isCloudEnabled(); final boolean currentState = plugin.getPlaceholderAPIConfig().isCloudEnabled();
switch (alias.toLowerCase(Locale.ROOT)) { switch (alias.toLowerCase()) {
case "enable": case "enable":
desiredState = true; desiredState = true;
break; break;

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -23,7 +23,6 @@ package me.clip.placeholderapi.commands.impl.cloud;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@@ -129,7 +128,7 @@ public final class CommandECloudUpdate extends PlaceholderCommand {
installed.removeIf(expansion -> !expansion.shouldUpdate()); installed.removeIf(expansion -> !expansion.shouldUpdate());
if (!installed.isEmpty() && (params.isEmpty() || "all" if (!installed.isEmpty() && (params.isEmpty() || "all"
.startsWith(params.get(0).toLowerCase(Locale.ROOT)))) { .startsWith(params.get(0).toLowerCase()))) {
suggestions.add("all"); suggestions.add("all");
} }

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -165,7 +165,7 @@ public final class CommandDump extends PlaceholderCommand {
final String[] jars = plugin.getLocalExpansionManager() final String[] jars = plugin.getLocalExpansionManager()
.getExpansionsFolder() .getExpansionsFolder()
.list((dir, name) -> name.toLowerCase(Locale.ROOT).endsWith(".jar")); .list((dir, name) -> name.toLowerCase().endsWith(".jar"));
for (final String jar : jars) { for (final String jar : jars) {
builder.append(" ") builder.append(" ")

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -45,9 +45,9 @@ public final class CommandHelp extends PlaceholderCommand {
Msg.msg(sender, Msg.msg(sender,
"&b&lPlaceholderAPI &8- &7Help Menu &8- &7(&f" + description.getVersion() + "&7)", "&b&lPlaceholderAPI &8- &7Help Menu &8- &7(&f" + description.getVersion() + "&7)",
" ", " ",
"&b/papi &fbcparse &9<me|--null|player name> <message>", "&b/papi &fbcparse &9<me/player name> <message>",
" &7&oParse a message with placeholders and broadcast it", " &7&oParse a message with placeholders and broadcast it",
"&b/papi &fcmdparse &9<me|player> <command with placeholders>", "&b/papi &fcmdparse &9<me/player> <command with placeholders>",
" &7&oParse a message with relational placeholders", " &7&oParse a message with relational placeholders",
"&b/papi &fdump", "&b/papi &fdump",
" &7&oDump all relevant information needed to help debug issues into a paste link.", " &7&oDump all relevant information needed to help debug issues into a paste link.",
@@ -55,7 +55,7 @@ public final class CommandHelp extends PlaceholderCommand {
" &7&oView information for a specific expansion", " &7&oView information for a specific expansion",
"&b/papi &flist", "&b/papi &flist",
" &7&oList active expansions", " &7&oList active expansions",
"&b/papi &fparse &9<me|--null|player name> <message>", "&b/papi &fparse &9<me/player name> <message>",
" &7&oParse a message with placeholders", " &7&oParse a message with placeholders",
"&b/papi &fparserel &9<player one> <player two> <message>", "&b/papi &fparserel &9<player one> <player two> <message>",
" &7&oParse a message with relational placeholders", " &7&oParse a message with relational placeholders",

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -22,7 +22,6 @@ package me.clip.placeholderapi.commands.impl.local;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.stream.Stream; import java.util.stream.Stream;
import me.clip.placeholderapi.PlaceholderAPI; import me.clip.placeholderapi.PlaceholderAPI;
@@ -50,7 +49,7 @@ public final class CommandParse extends PlaceholderCommand {
public void evaluate(@NotNull final PlaceholderAPIPlugin plugin, public void evaluate(@NotNull final PlaceholderAPIPlugin plugin,
@NotNull final CommandSender sender, @NotNull final String alias, @NotNull final CommandSender sender, @NotNull final String alias,
@NotNull @Unmodifiable final List<String> params) { @NotNull @Unmodifiable final List<String> params) {
switch (alias.toLowerCase(Locale.ROOT)) { switch (alias.toLowerCase()) {
case "parserel": case "parserel":
evaluateParseRelation(sender, params); evaluateParseRelation(sender, params);
break; break;
@@ -70,7 +69,7 @@ public final class CommandParse extends PlaceholderCommand {
public void complete(@NotNull final PlaceholderAPIPlugin plugin, public void complete(@NotNull final PlaceholderAPIPlugin plugin,
@NotNull final CommandSender sender, @NotNull final String alias, @NotNull final CommandSender sender, @NotNull final String alias,
@NotNull @Unmodifiable final List<String> params, @NotNull final List<String> suggestions) { @NotNull @Unmodifiable final List<String> params, @NotNull final List<String> suggestions) {
switch (alias.toLowerCase(Locale.ROOT)) { switch (alias.toLowerCase()) {
case "parserel": case "parserel":
completeParseRelation(params, suggestions); completeParseRelation(params, suggestions);
break; break;
@@ -93,7 +92,7 @@ public final class CommandParse extends PlaceholderCommand {
return; return;
} }
OfflinePlayer player; @NotNull final OfflinePlayer player;
if ("me".equalsIgnoreCase(params.get(0))) { if ("me".equalsIgnoreCase(params.get(0))) {
if (!(sender instanceof Player)) { if (!(sender instanceof Player)) {
@@ -102,8 +101,6 @@ public final class CommandParse extends PlaceholderCommand {
} }
player = ((Player) sender); player = ((Player) sender);
} else if ("--null".equalsIgnoreCase(params.get(0))) {
player = null;
} else { } else {
final OfflinePlayer target = resolvePlayer(params.get(0)); final OfflinePlayer target = resolvePlayer(params.get(0));
if (target == null) { if (target == null) {
@@ -164,14 +161,10 @@ public final class CommandParse extends PlaceholderCommand {
@NotNull @Unmodifiable final List<String> params, @NotNull final List<String> suggestions) { @NotNull @Unmodifiable final List<String> params, @NotNull final List<String> suggestions) {
if (params.size() <= 1) { if (params.size() <= 1) {
if (sender instanceof Player && (params.isEmpty() || "me" if (sender instanceof Player && (params.isEmpty() || "me"
.startsWith(params.get(0).toLowerCase(Locale.ROOT)))) { .startsWith(params.get(0).toLowerCase()))) {
suggestions.add("me"); suggestions.add("me");
} }
if ("--null".startsWith(params.get(0).toLowerCase(Locale.ROOT))) {
suggestions.add("--null");
}
final Stream<String> names = Bukkit.getOnlinePlayers().stream().map(Player::getName); final Stream<String> names = Bukkit.getOnlinePlayers().stream().map(Player::getName);
suggestByParameter(names, suggestions, params.isEmpty() ? null : params.get(0)); suggestByParameter(names, suggestions, params.isEmpty() ? null : params.get(0));

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -27,11 +27,8 @@ import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
* This event indicates that a <b>single</b> {@link PlaceholderExpansion PlaceholderExpansion} has * Indicates that a {@link PlaceholderExpansion} has been registered by
* been registered in PlaceholderAPI. * PlaceholderAPI.
*
* <p>To know when <b>all</b> Expansions have been registered, use the
* {@link me.clip.placeholderapi.events.ExpansionsLoadedEvent ExpansionsLoadedEvent} instead.
*/ */
public final class ExpansionRegisterEvent extends Event implements Cancellable { public final class ExpansionRegisterEvent extends Event implements Cancellable {
@@ -51,25 +48,15 @@ public final class ExpansionRegisterEvent extends Event implements Cancellable {
} }
/** /**
* The {@link PlaceholderExpansion PlaceholderExpansion} that was registered in PlaceholderAPI. * The {@link PlaceholderExpansion expansion} that was registered.
* <br>The PlaceholderExpansion will be available for use when the event
* {@link #isCancelled() was not cancelled}!
* *
* @return Current instance of the registered {@link PlaceholderExpansion PlaceholderExpansion} * @return The {@link PlaceholderExpansion} instance.
*/ */
@NotNull @NotNull
public PlaceholderExpansion getExpansion() { public PlaceholderExpansion getExpansion() {
return expansion; return expansion;
} }
/**
* Indicates if this event was cancelled or not.
* <br>A cancelled Event will result in the {@link #getExpansion() PlaceholderExpansion} NOT
* being added to PlaceholderAPI's internal list and will therefore be considered not registered
* anymore.
*
* @return Whether the event has been cancelled or not.
*/
@Override @Override
public boolean isCancelled() { public boolean isCancelled() {
return cancelled; return cancelled;

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -26,19 +26,15 @@ import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
* This event indicates that a {@link PlaceholderExpansion PlaceholderExpansion} has been * Indicates that a {@link PlaceholderExpansion} had been unregistered by
* unregistered by PlaceholderAPI. * PlaceholderAPI.
*
* <p>Note that this event is triggered <b>before</b> the PlaceholderExpansion is completely
* removed.
* <br>This includes removing any Listeners, stopping active tasks and clearing the cache of
* the PlaceholderExpansion.
*/ */
public final class ExpansionUnregisterEvent extends Event { public final class ExpansionUnregisterEvent extends Event {
@NotNull @NotNull
private static final HandlerList HANDLERS = new HandlerList(); private static final HandlerList HANDLERS = new HandlerList();
@NotNull @NotNull
private final PlaceholderExpansion expansion; private final PlaceholderExpansion expansion;
@@ -52,9 +48,9 @@ public final class ExpansionUnregisterEvent extends Event {
} }
/** /**
* The {@link PlaceholderExpansion PlaceholderExpansion} that was unregistered. * The {@link PlaceholderExpansion expansion} that was unregistered.
* *
* @return The {@link PlaceholderExpansion PlaceholderExpansion} instance. * @return The {@link PlaceholderExpansion} instance.
*/ */
@NotNull @NotNull
public PlaceholderExpansion getExpansion() { public PlaceholderExpansion getExpansion() {

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -21,42 +21,18 @@
package me.clip.placeholderapi.events; package me.clip.placeholderapi.events;
import java.util.Collections;
import java.util.List;
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;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
* This event indicated that <b>all</b> {@link PlaceholderExpansion PlaceholderExpansions} have * Indicates that <b>all</b> {@link me.clip.placeholderapi.expansion.PlaceholderExpansion PlayceholderExpansions}
* been registered in PlaceholderAPI and can now be used. * have been loaded.
* <br>This even will also be triggered whenever PlaceholderAPI gets reloaded. * <br/>This event is fired on Server load and when reloading the
* * confiuration.
* <p>All PlaceholderExpansions, except for those loaded by plugins, are loaded
* after Spigot triggered its ServerLoadEvent (1.13+), or after PlaceholderAPI has been enabled.
*/ */
public class ExpansionsLoadedEvent extends Event { public class ExpansionsLoadedEvent extends Event {
private final List<PlaceholderExpansion> expansions;
public ExpansionsLoadedEvent(List<PlaceholderExpansion> expansions) {
this.expansions = Collections.unmodifiableList(expansions);
}
/**
* Returns a unmodifiable list of {@link PlaceholderExpansion PlaceholderExpansions} that
* have been registered by PlaceholderAPI.
*
* <p><b>This list does not include manually registered PlaceholderExpansions.</b>
*
* @return List of {@link PlaceholderExpansion registered PlaceholderExpansions}.
*/
@NotNull
public final List<PlaceholderExpansion> getExpansions(){
return expansions;
}
@NotNull @NotNull
private static final HandlerList HANDLERS = new HandlerList(); private static final HandlerList HANDLERS = new HandlerList();

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -21,11 +21,9 @@
package me.clip.placeholderapi.expansion; package me.clip.placeholderapi.expansion;
/** /**
* Classes implementing this interface will have a {@link #clear() clear void} that is called * This interface allows a class which extends a {@link PlaceholderExpansion} to have the clear
* by PlaceholderAPI whenever the {@link me.clip.placeholderapi.expansion.PlaceholderExpansion PlaceholderExpansion} * method called when the implementing expansion is unregistered from PlaceholderAPI. This is useful
* is unregistered. * if we want to do things when the implementing hook is unregistered
*
* <p>This allows you to execute things such as clearing internal caches, saving data to files, etc.
* *
* @author Ryan McCarthy * @author Ryan McCarthy
*/ */

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -23,11 +23,9 @@ package me.clip.placeholderapi.expansion;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
/** /**
* Classes implementing this interface will have a {@link #cleanup(Player) cleanup void} that is * This interface allows a class which extends a {@link PlaceholderExpansion} to have the cleanup
* called by PlaceholderAPI whenever a Player leaves the server. * method called every time a player leaves the server. This is useful if we want to clean up after
* * the player
* <p>This can be useful for cases where you keep data of the player in a cache or similar
* and want to free up space whenever they leave.
* *
* @author Ryan McCarthy * @author Ryan McCarthy
*/ */

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -23,32 +23,18 @@ package me.clip.placeholderapi.expansion;
import java.util.Map; import java.util.Map;
/** /**
* Implementing this interface allows {@link me.clip.placeholderapi.expansion.PlaceholderExpansion PlaceholderExpansions} * Any {@link PlaceholderExpansion} class which implements configurable will have any options listed
* to set a list of default configuration values through the {@link #getDefaults() getDefaults method} * in the {@link #getDefaults()} map automatically added to the PlaceholderAPI config.yml file
* that should be added to the config.yml of PlaceholderAPI.
*
* <p>The entries will be added under {@code expansions} as their own section.
* <h2>Example:</h2>
* returning a Map with key {@code foo} and value {@code bar} will result in the following config entry:
*
* <pre><code>
* expansions:
* myexpansion:
* foo: "bar"
* </code></pre>
*
* <p><b>The configuration is set before the PlaceholderExpansion is registered!</b>
* *
* @author Ryan McCarthy * @author Ryan McCarthy
*/ */
public interface Configurable { public interface Configurable {
/** /**
* The map returned by this method will be used to set config options in PlaceholderAPI's config.yml. * This method will be called before the implementing class is registered to obtain a map of
* * configuration options that the implementing class needs These paths and values will be added to
* <p>The key and value pairs are set under a section named after your * the PlaceholderAPI config.yml in the configuration section expansions.(placeholder
* {@link me.clip.placeholderapi.expansion.PlaceholderExpansion PlaceholderExpansion} in the * identifier).(your key): (your value)
* {@code expansions} section of the config.
* *
* @return Map of config path / values which need to be added / removed from the PlaceholderAPI * @return Map of config path / values which need to be added / removed from the PlaceholderAPI
* config.yml file * config.yml file

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -42,8 +42,7 @@ public enum NMSVersion {
SPIGOT_1_16_R1("v1_16_R1"), SPIGOT_1_16_R1("v1_16_R1"),
SPIGOT_1_16_R2("v1_16_R2"), SPIGOT_1_16_R2("v1_16_R2"),
SPIGOT_1_16_R3("v1_16_R3"), SPIGOT_1_16_R3("v1_16_R3"),
SPIGOT_1_17_R1("v1_17_R1"), SPIGOT_1_17_R1("v1_17_R1");
SPIGOT_1_18_R1("v1_18_R1");
private final String version; private final String version;

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -22,13 +22,10 @@ package me.clip.placeholderapi.expansion;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.logging.Level;
import me.clip.placeholderapi.PlaceholderAPIPlugin; import me.clip.placeholderapi.PlaceholderAPIPlugin;
import me.clip.placeholderapi.PlaceholderHook; import me.clip.placeholderapi.PlaceholderHook;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -295,71 +292,6 @@ public abstract class PlaceholderExpansion extends PlaceholderHook {
final ConfigurationSection section = getConfigSection(); final ConfigurationSection section = getConfigSection();
return section != null && section.contains(path); return section != null && section.contains(path);
} }
/**
* Logs the provided message with the provided Level in the console.
* <br>The message will be prefixed with {@link #getName() <code>[&lt;expansion name&gt;]</code>}
*
* @param level The Level at which the message should be logged with
* @param msg The message to log
*/
public void log(Level level, String msg) {
getPlaceholderAPI().getLogger().log(level, "[" + getName() + "] " + msg);
}
/**
* Logs the provided message and Throwable with the provided Level in the console.
* <br>The message will be prefixed with {@link #getName() <code>[&lt;expansion name&gt;]</code>}
*
* @param level The Level at which the message should be logged with
* @param msg The message to log
* @param throwable The Throwable to log
*/
public void log(Level level, String msg, Throwable throwable) {
getPlaceholderAPI().getLogger().log(level, "[" + getName() + "] " + msg, throwable);
}
/**
* Logs the provided message with Level "info".
* <br>The message will be prefixed with {@link #getName() <code>[&lt;expansion name&gt;]</code>}
*
* @param msg The message to log
*/
public void info(String msg) {
log(Level.INFO, msg);
}
/**
* Logs the provided message with Level "warning".
* <br>The message will be prefixed with {@link #getName() <code>[&lt;expansion name&gt;]</code>}
*
* @param msg The message to log
*/
public void warning(String msg) {
log(Level.WARNING, msg);
}
/**
* Logs the provided message with Level "severe" (error).
* <br>The message will be prefixed with {@link #getName() <code>[&lt;expansion name&gt;]</code>}
*
* @param msg The message to log
*/
public void severe(String msg) {
log(Level.SEVERE, msg);
}
/**
* Logs the provided message and Throwable with Level "severe" (error).
* <br>The message will be prefixed with {@link #getName() <code>[&lt;expansion name&gt;]</code>}
*
* @param msg The message to log
* @param throwable The Throwable to log
*/
public void severe(String msg, Throwable throwable) {
log(Level.SEVERE, msg, throwable);
}
/** /**
* Whether the provided Object is an instance of this PlaceholderExpansion. * Whether the provided Object is an instance of this PlaceholderExpansion.
@@ -400,62 +332,6 @@ public abstract class PlaceholderExpansion extends PlaceholderHook {
getAuthor(), getVersion()); getAuthor(), getVersion());
} }
/**
* This method is called first whenever PlaceholderAPI finds a valid placeholder with a matching expansion.
* <br>When called, the provided OfflinePlayer instance can be one of 3 possible states:
*
* <ul>
* <li>Not null and online</li>
* <li>Not null and offline</li>
* <li>Null</li>
* </ul>
*
* When not overridden by the called expansion will the method as of now call
* {@link PlaceholderHook#onRequest(OfflinePlayer, String) PlaceholderHook#onRequest(OfflinePlayer, String)}.
* <br>This behaviour will change in a future version to call {@link #parsePlaceholders(Player, String) parsePlaceholders(Player, String)}
* with the OfflinePlayer either being casted to a Player (When online), or {@link null}.
*
* <p>To use this method in your PlaceholderExpansion, override it and return either a String or {@code null}.
* <br>When {@code null} is returned will PlaceholderAPI see it as an "invalid placeholder" and return
* the content as-is in the final String.
*
* @param player The OfflinePlayer to use.
* @param params The parameters of the placeholder, right after the first underscore.
* @return Parsed placeholder, or null depending on the Expansion's handling of it.
*/
@Nullable
public String parsePlaceholders(@Nullable OfflinePlayer player, @NotNull String params) {
return this.onRequest(player, params);
}
/**
* This method is called whenever PlaceholderAPI finds a valid placeholder with a matching expansion
* AND {@link #parsePlaceholders(OfflinePlayer, String) parsePlaceholder(OfflinePlayer, String)} isn't
* overridden by the expansion in question.
* <br>When called, the provided Player instance can be one of 2 possible states:
*
* <ul>
* <li>Not null and online</li>
* <li>Null</li>
* </ul>
*
* When not overridden by the called expansion will the method as of now call
* {@link PlaceholderHook#onPlaceholderRequest(Player, String) PlaceholderHook#onPlaceholderRequest(Player, String)}.
* <br>This behaviour will change in a future version to instead return {@code null}.
*
* <p>To use this method in your PlaceholderExpansion, override it and return either a String or {@code null}.
* <br>When {@code null} is returned will PlaceholderAPI see it as an "invalid placeholder" and return
* the content as-is in the final String.
*
* @param player The Player to use. May be null
* @param params The parameters of the placeholder, right after the first underscore.
* @return Parsed placeholder, or null depending on the Expansion's handling of it.
*/
@Nullable
public String parsePlaceholders(@Nullable Player player, @NotNull String params){
return this.onPlaceholderRequest(player, params);
}
// === Deprecated API === // === Deprecated API ===
/** /**
@@ -464,7 +340,7 @@ public abstract class PlaceholderExpansion extends PlaceholderHook {
* @return The plugin name. * @return The plugin name.
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public String getPlugin() { public String getPlugin() {
return null; return null;
} }
@@ -475,7 +351,7 @@ public abstract class PlaceholderExpansion extends PlaceholderHook {
* @return The description of the expansion. * @return The description of the expansion.
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public String getDescription() { public String getDescription() {
return null; return null;
} }
@@ -486,7 +362,7 @@ public abstract class PlaceholderExpansion extends PlaceholderHook {
* @return The link for the expansion. * @return The link for the expansion.
*/ */
@Deprecated @Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "2.13.0") @ApiStatus.ScheduledForRemoval(inVersion = "2.11.0")
public String getLink() { public String getLink() {
return null; return null;
} }

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -21,29 +21,8 @@
package me.clip.placeholderapi.expansion; package me.clip.placeholderapi.expansion;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* This interface should be used when your {@link me.clip.placeholderapi.expansion.PlaceholderExpansion PlaceholderExpansion}
* should support relational placeholders.
*
* <p>The difference between relational placeholders and normal ones is, that relational ones start
* with a {@code rel_} prefix and have two Players provided, instead of one.
* <br>The main purpose is to return a String based on the "relationship" between the two players
* (i.e. if both are within the same world).
*/
public interface Relational { public interface Relational {
/** String onPlaceholderRequest(Player one, Player two, String identifier);
* This method will be called whenever a valid placeholder in the format {@code %rel_<expansion>_<identifier>%}
* is found.
*
* @param one The first player to use for comparison.
* @param two The second player to use for comparison
* @param identifier String right after {@code %rel_<expansion>_} and before the second percent symbol.
* @return Possibly-null String, depending on what the expansion returns.
*/
@Nullable
String onPlaceholderRequest(Player one, Player two, @NotNull String identifier);
} }

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -20,24 +20,18 @@
package me.clip.placeholderapi.expansion; package me.clip.placeholderapi.expansion;
/**
* Implementing this interface adds the {@link #start() start} and {@link #stop() stop} void
* methods to your {@link me.clip.placeholderapi.expansion.PlaceholderExpansion PlaceholderExpansion}.
*
* <p>This can be used to execute methods and tasks whenever the PlaceholderExpansion has been
* successfully (un)registered.
*/
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
* <br>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
* <br>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

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -37,7 +37,6 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
@@ -89,7 +88,7 @@ public final class CloudExpansionManager {
@NotNull @NotNull
private static String toIndexName(@NotNull final String name) { private static String toIndexName(@NotNull final String name) {
return name.toLowerCase(Locale.ROOT).replace(' ', '_'); return name.toLowerCase().replace(' ', '_');
} }
@NotNull @NotNull

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -125,7 +125,7 @@ public final class LocalExpansionManager implements Listener {
public PlaceholderExpansion getExpansion(@NotNull final String identifier) { public PlaceholderExpansion getExpansion(@NotNull final String identifier) {
expansionsLock.lock(); expansionsLock.lock();
try { try {
return expansions.get(identifier.toLowerCase(Locale.ROOT)); return expansions.get(identifier.toLowerCase());
} finally { } finally {
expansionsLock.unlock(); expansionsLock.unlock();
} }
@@ -160,11 +160,7 @@ public final class LocalExpansionManager implements Listener {
@NotNull final Class<? extends PlaceholderExpansion> clazz) { @NotNull final Class<? extends PlaceholderExpansion> clazz) {
try { try {
final PlaceholderExpansion expansion = createExpansionInstance(clazz); final PlaceholderExpansion expansion = createExpansionInstance(clazz);
if(expansion == null){
return Optional.empty();
}
Objects.requireNonNull(expansion.getAuthor(), "The expansion author is null!"); Objects.requireNonNull(expansion.getAuthor(), "The expansion author is null!");
Objects.requireNonNull(expansion.getIdentifier(), "The expansion identifier is null!"); Objects.requireNonNull(expansion.getIdentifier(), "The expansion identifier is null!");
Objects.requireNonNull(expansion.getVersion(), "The expansion version is null!"); Objects.requireNonNull(expansion.getVersion(), "The expansion version is null!");
@@ -193,7 +189,7 @@ public final class LocalExpansionManager implements Listener {
@ApiStatus.Internal @ApiStatus.Internal
public boolean register(@NotNull final PlaceholderExpansion expansion) { public boolean register(@NotNull final PlaceholderExpansion expansion) {
final String identifier = expansion.getIdentifier().toLowerCase(Locale.ROOT); final String identifier = expansion.getIdentifier().toLowerCase();
if (!expansion.canRegister()) { if (!expansion.canRegister()) {
return false; return false;
@@ -263,8 +259,7 @@ public final class LocalExpansionManager implements Listener {
Bukkit.getPluginManager().registerEvents(((Listener) expansion), plugin); Bukkit.getPluginManager().registerEvents(((Listener) expansion), plugin);
} }
plugin.getLogger().info("Successfully registered expansion: " + expansion.getIdentifier() + plugin.getLogger().info("Successfully registered expansion: " + expansion.getIdentifier());
" [" + expansion.getVersion() + "]");
if (expansion instanceof Taskable) { if (expansion instanceof Taskable) {
((Taskable) expansion).start(); ((Taskable) expansion).start();
@@ -324,37 +319,18 @@ public final class LocalExpansionManager implements Listener {
plugin.getLogger().log(Level.SEVERE, "failed to load class files of expansions", exception); plugin.getLogger().log(Level.SEVERE, "failed to load class files of expansions", exception);
return; return;
} }
final List<PlaceholderExpansion> registered = classes.stream() final long registered = classes.stream()
.filter(Objects::nonNull) .filter(Objects::nonNull)
.map(this::register) .map(this::register)
.filter(Optional::isPresent) .filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
final long needsUpdate = registered.stream()
.map(expansion -> plugin.getCloudExpansionManager().findCloudExpansionByName(expansion.getName()).orElse(null))
.filter(Objects::nonNull)
.filter(CloudExpansion::shouldUpdate)
.count(); .count();
StringBuilder message = new StringBuilder(registered.size() == 0 ? "&6" : "&a") Msg.msg(sender,
.append(registered.size()) registered == 0 ? "&6No expansions were registered!"
.append(' ') : registered + "&a placeholder hooks successfully registered!");
.append("placeholder hook(s) registered!");
if (needsUpdate > 0) {
message.append(' ')
.append("&6")
.append(needsUpdate)
.append(' ')
.append("placeholder hook(s) have an update available.");
}
Msg.msg(sender, message.toString());
Bukkit.getPluginManager().callEvent(new ExpansionsLoadedEvent(registered)); Bukkit.getPluginManager().callEvent(new ExpansionsLoadedEvent());
}); });
} }
@@ -370,12 +346,7 @@ public final class LocalExpansionManager implements Listener {
@NotNull @NotNull
public CompletableFuture<@NotNull List<@Nullable Class<? extends PlaceholderExpansion>>> findExpansionsOnDisk() { public CompletableFuture<@NotNull List<@Nullable Class<? extends PlaceholderExpansion>>> findExpansionsOnDisk() {
File[] files = folder.listFiles((dir, name) -> name.endsWith(".jar")); return Arrays.stream(folder.listFiles((dir, name) -> name.endsWith(".jar")))
if(files == null){
return CompletableFuture.completedFuture(Collections.emptyList());
}
return Arrays.stream(files)
.map(this::findExpansionInFile) .map(this::findExpansionInFile)
.collect(Futures.collector()); .collect(Futures.collector());
} }

View File

@@ -1,23 +1,3 @@
/*
* This file is part of PlaceholderAPI
*
* PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team
*
* PlaceholderAPI free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlaceholderAPI is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package me.clip.placeholderapi.expansion.manager; package me.clip.placeholderapi.expansion.manager;
import java.util.Arrays; import java.util.Arrays;

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -1,137 +1,178 @@
/* /*
* This file is part of PlaceholderAPI * This file is part of PlaceholderAPI
* *
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* PlaceholderAPI is distributed in the hope that it will be useful, * PlaceholderAPI is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package me.clip.placeholderapi.replacer; package me.clip.placeholderapi.replacer;
import java.util.Locale; import java.util.function.Function;
import java.util.function.Function; import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import me.clip.placeholderapi.expansion.PlaceholderExpansion; import org.bukkit.ChatColor;
import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer;
import org.bukkit.OfflinePlayer; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Nullable;
public final class CharsReplacer implements Replacer {
public final class CharsReplacer implements Replacer {
@NotNull
@NotNull private final Closure closure;
private final Closure closure;
public CharsReplacer(@NotNull final Closure closure) {
public CharsReplacer(@NotNull final Closure closure) { this.closure = closure;
this.closure = closure; }
}
@NotNull
@NotNull @Override
@Override public String apply(@NotNull final String text, @Nullable final OfflinePlayer player,
public String apply(@NotNull final String text, @Nullable final OfflinePlayer player, @NotNull final Function<String, @Nullable PlaceholderExpansion> lookup) {
@NotNull final Function<String, @Nullable PlaceholderExpansion> lookup) { final char[] chars = text.toCharArray();
final char[] chars = text.toCharArray(); final StringBuilder builder = new StringBuilder(text.length());
final StringBuilder builder = new StringBuilder(text.length());
final StringBuilder identifier = new StringBuilder();
final StringBuilder identifier = new StringBuilder(); final StringBuilder parameters = new StringBuilder();
final StringBuilder parameters = new StringBuilder();
for (int i = 0; i < chars.length; i++) {
for (int i = 0; i < chars.length; i++) { final char l = chars[i];
final char l = chars[i];
if (l == '&' && ++i < chars.length) {
if (l != closure.head || i + 1 >= chars.length) { final char c = Character.toLowerCase(chars[i]);
builder.append(l);
continue; if (c != '0' && c != '1' && c != '2' && c != '3' && c != '4' && c != '5' && c != '6'
} && c != '7' && c != '8' && c != '9' && c != 'a' && c != 'b' && c != 'c' && c != 'd'
&& c != 'e' && c != 'f' && c != 'k' && c != 'l' && c != 'm' && c != 'n' && c != 'o' && c != 'r'
boolean identified = false; && c != 'x') {
boolean invalid = true; builder.append(l).append(chars[i]);
boolean hadSpace = false; } else {
builder.append(ChatColor.COLOR_CHAR);
while (++i < chars.length) {
final char p = chars[i]; if (c != 'x') {
builder.append(chars[i]);
if (p == ' ' && !identified) { continue;
hadSpace = true; }
break;
} if ((i > 1 && chars[i - 2] == '\\') /*allow escaping &x*/) {
if (p == closure.tail) { builder.setLength(builder.length() - 2);
invalid = false; builder.append('&').append(chars[i]);
break; continue;
} }
if (p == '_' && !identified) { builder.append(c);
identified = true;
continue; int j = 0;
} while (++j <= 6) {
if (i + j >= chars.length) {
if (identified) { break;
parameters.append(p); }
} else {
identifier.append(p); final char x = chars[i + j];
} builder.append(ChatColor.COLOR_CHAR).append(x);
} }
final String identifierString = identifier.toString(); if (j == 7) {
final String lowercaseIdentifierString = identifierString.toLowerCase(Locale.ROOT); i += 6;
final String parametersString = parameters.toString(); } else {
builder.setLength(builder.length() - (j * 2)); // undo &x parsing
identifier.setLength(0); }
parameters.setLength(0); }
continue;
if (invalid) { }
builder.append(closure.head).append(identifierString);
if (l != closure.head || i + 1 >= chars.length) {
if (identified) { builder.append(l);
builder.append('_').append(parametersString); continue;
} }
if (hadSpace) { boolean identified = false;
builder.append(' '); boolean oopsitsbad = true;
} boolean hadSpace = false;
continue;
} while (++i < chars.length) {
final char p = chars[i];
final PlaceholderExpansion placeholder = lookup.apply(lowercaseIdentifierString);
if (placeholder == null) { if (p == ' ' && !identified) {
builder.append(closure.head).append(identifierString); hadSpace = true;
break;
if (identified) { }
builder.append('_'); if (p == closure.tail) {
} oopsitsbad = false;
break;
builder.append(parametersString).append(closure.tail); }
continue;
} if (p == '_' && !identified) {
identified = true;
final String replacement = placeholder.parsePlaceholders(player, parametersString); continue;
if (replacement == null) { }
builder.append(closure.head).append(identifierString);
if (identified) {
if (identified) { parameters.append(p);
builder.append('_'); } else {
} identifier.append(p);
}
builder.append(parametersString).append(closure.tail); }
continue;
} final String identifierString = identifier.toString().toLowerCase();
final String parametersString = parameters.toString();
builder.append(ChatColor.translateAlternateColorCodes('&', replacement));
} identifier.setLength(0);
parameters.setLength(0);
return builder.toString();
} if (oopsitsbad) {
builder.append(closure.head).append(identifier);
}
if (identified) {
builder.append('_').append(parametersString);
}
if (hadSpace) {
builder.append(' ');
}
continue;
}
final PlaceholderExpansion placeholder = lookup.apply(identifierString);
if (placeholder == null) {
builder.append(closure.head).append(identifierString);
if (identified) {
builder.append('_');
}
builder.append(parametersString).append(closure.tail);
continue;
}
final String replacement = placeholder.onRequest(player, parametersString);
if (replacement == null) {
builder.append(closure.head).append(identifierString);
if (identified) {
builder.append('_');
}
builder.append(parametersString).append(closure.tail);
continue;
}
builder.append(ChatColor.translateAlternateColorCodes('&', replacement));
}
return builder.toString();
}
}

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
@@ -61,7 +61,7 @@ public final class RegexReplacer implements Replacer {
continue; continue;
} }
final String requested = expansion.parsePlaceholders(player, parameters); final String requested = expansion.onRequest(player, parameters);
matcher.appendReplacement(builder, requested != null ? requested : matcher.group(0)); matcher.appendReplacement(builder, requested != null ? requested : matcher.group(0));
} }
while (matcher.find()); while (matcher.find());

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -4,7 +4,7 @@
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2021 PlaceholderAPI Team * Copyright (c) 2015 - 2021 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.

View File

@@ -88,4 +88,12 @@ public final class ReplacerUnitTester {
assertEquals(text, Values.CHARS_REPLACER.apply(text, null, Values.PLACEHOLDERS::get)); assertEquals(text, Values.CHARS_REPLACER.apply(text, null, Values.PLACEHOLDERS::get));
} }
@Test
void testCharsReplacerHandlesEscapedHex() {
final String text = "\\&xffffffThis should not change.";
assertEquals(text.substring(1),
Values.CHARS_REPLACER.apply(text, null, Values.PLACEHOLDERS::get));
}
} }