From 36fa9ac96dff1444c2d53ce24c37110a34c43c17 Mon Sep 17 00:00:00 2001 From: Gabriel Dumitru Date: Mon, 24 Jul 2023 11:48:29 +0300 Subject: [PATCH] feat: distinguish expansions (external or internal) (fixes #945) (#953) --- .../expansion/PlaceholderExpansion.java | 50 +++++++++++++++++-- .../manager/LocalExpansionManager.java | 32 ++++++++---- 2 files changed, 68 insertions(+), 14 deletions(-) diff --git a/src/main/java/me/clip/placeholderapi/expansion/PlaceholderExpansion.java b/src/main/java/me/clip/placeholderapi/expansion/PlaceholderExpansion.java index 5cd3029..a41be94 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/PlaceholderExpansion.java +++ b/src/main/java/me/clip/placeholderapi/expansion/PlaceholderExpansion.java @@ -40,6 +40,14 @@ import org.jetbrains.annotations.Nullable; */ public abstract class PlaceholderExpansion extends PlaceholderHook { + /** + * The type is {@link Type#INTERNAL} by default. + * For external expansions, the type is updated on {@link me.clip.placeholderapi.expansion.manager.LocalExpansionManager#register(Class) register}. + * @since 2.11.4 + */ + @ApiStatus.Internal + protected Type expansionType = Type.INTERNAL; + /** * The placeholder identifier of this expansion. May not contain {@literal %}, * {@literal {}} or _ @@ -159,6 +167,27 @@ public abstract class PlaceholderExpansion extends PlaceholderHook { return PlaceholderAPIPlugin.getInstance(); } + /** + * Get the type of the expansion + * + * @return the type of the expansion + * @since 2.11.4 + */ + @ApiStatus.Internal + public Type getExpansionType() { + return expansionType; + } + + /** + * Set the type of the expansion + * @param expansionType the new type + * @since 2.11.4 + */ + @ApiStatus.Internal + public void setExpansionType(Type expansionType) { + this.expansionType = expansionType; + } + // === Configuration === /** @@ -166,7 +195,7 @@ public abstract class PlaceholderExpansion extends PlaceholderHook { * null when not specified. *
You may use the {@link Configurable} interface to define default values set * - * @return ConfigurationSection that this epxpansion has. + * @return ConfigurationSection that this expansion has. */ @Nullable public final ConfigurationSection getConfigSection() { @@ -394,8 +423,8 @@ public abstract class PlaceholderExpansion extends PlaceholderHook { */ @Override public final String toString() { - return String.format("PlaceholderExpansion[name: '%s', author: '%s', version: '%s']", getName(), - getAuthor(), getVersion()); + return String.format("PlaceholderExpansion[name: '%s', author: '%s', version: '%s', type: '%s']", getName(), + getAuthor(), getVersion(), getExpansionType()); } // === Deprecated API === @@ -432,4 +461,19 @@ public abstract class PlaceholderExpansion extends PlaceholderHook { public String getLink() { return null; } + + public enum Type { + + /** + * An expansion provided by a plugin is considered internal + */ + INTERNAL, + + /** + * An expansion loaded from the expansions folder is considered external + */ + EXTERNAL + + } + } diff --git a/src/main/java/me/clip/placeholderapi/expansion/manager/LocalExpansionManager.java b/src/main/java/me/clip/placeholderapi/expansion/manager/LocalExpansionManager.java index 80c785a..8e6cbd0 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/manager/LocalExpansionManager.java +++ b/src/main/java/me/clip/placeholderapi/expansion/manager/LocalExpansionManager.java @@ -187,6 +187,8 @@ public final class LocalExpansionManager implements Listener { return Optional.empty(); } } + + expansion.setExpansionType(PlaceholderExpansion.Type.EXTERNAL); if (!expansion.register()) { Msg.warn("Cannot load expansion %s due to an unknown issue.", expansion.getIdentifier()); @@ -209,6 +211,11 @@ public final class LocalExpansionManager implements Listener { return Optional.empty(); } + /** + * Attempt to register a {@link PlaceholderExpansion} + * @param expansion the expansion to register + * @return if the expansion was registered + */ @ApiStatus.Internal public boolean register(@NotNull final PlaceholderExpansion expansion) { final String identifier = expansion.getIdentifier().toLowerCase(Locale.ROOT); @@ -216,10 +223,10 @@ public final class LocalExpansionManager implements Listener { if (!expansion.canRegister()) { return false; } - - if (expansions.containsKey(identifier)) { - Msg.warn("Failed to load expansion %s. Identifier is already in use.", - expansion.getIdentifier()); + + // Avoid loading two external expansions with the same identifier + if (expansion.getExpansionType() == PlaceholderExpansion.Type.EXTERNAL && expansions.containsKey(identifier)) { + Msg.warn("Failed to load external expansion %s. Identifier is already in use.", expansion.getIdentifier()); return false; } @@ -287,21 +294,24 @@ public final class LocalExpansionManager implements Listener { Bukkit.getPluginManager().registerEvents(((Listener) expansion), plugin); } - Msg.info("Successfully registered expansion: %s [%s]", expansion.getIdentifier(), - expansion.getVersion()); + Msg.info( + "Successfully registered %s expansion: %s [%s]", + expansion.getExpansionType().name().toLowerCase(), + expansion.getIdentifier(), + expansion.getVersion() + ); if (expansion instanceof Taskable) { ((Taskable) expansion).start(); } - if (plugin.getPlaceholderAPIConfig().isCloudEnabled()) { - final Optional cloudExpansionOptional = - plugin.getCloudExpansionManager().findCloudExpansionByName(identifier); + // Check eCloud for updates only if the expansion is external + if (plugin.getPlaceholderAPIConfig().isCloudEnabled() && expansion.getExpansionType() == PlaceholderExpansion.Type.EXTERNAL) { + final Optional cloudExpansionOptional = plugin.getCloudExpansionManager().findCloudExpansionByName(identifier); if (cloudExpansionOptional.isPresent()) { CloudExpansion cloudExpansion = cloudExpansionOptional.get(); cloudExpansion.setHasExpansion(true); - cloudExpansion.setShouldUpdate( - !cloudExpansion.getLatestVersion().equals(expansion.getVersion())); + cloudExpansion.setShouldUpdate(!cloudExpansion.getLatestVersion().equals(expansion.getVersion())); } }