From a6b08d8e255ebfb58a2784a87b7647a4151a2dba Mon Sep 17 00:00:00 2001 From: PiggyPiglet Date: Wed, 11 Feb 2026 19:46:20 +0800 Subject: [PATCH 1/3] keep config.yml header on save, show all pages on ecloud list all, deprecate getExpansionConfig for Configurable#getConfig --- .../cloud/CommandECloudExpansionList.java | 2 +- .../configuration/ConfigManager.java | 19 +++++++++++++++++-- .../expansion/Configurable.java | 10 ++++++++++ .../expansion/PlaceholderExpansion.java | 11 +++++++++++ src/main/resources/header.txt | 10 ++++++++++ 5 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/header.txt diff --git a/src/main/java/at/helpch/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java b/src/main/java/at/helpch/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java index 729964e..69757ec 100644 --- a/src/main/java/at/helpch/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java +++ b/src/main/java/at/helpch/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java @@ -175,7 +175,7 @@ public final class CommandECloudExpansionList extends PlaceholderCommand { // right.clickEvent(ClickEvent.runCommand("/papi ecloud list " + target + " " + (page + 1))); // } - message = message.insert(Message.raw(" - " + page + " - ").color(Color.GREEN)); + message = message.insert(Message.raw(" - " + page + " of " + limit + " - ").color(Color.GREEN)); } return message; diff --git a/src/main/java/at/helpch/placeholderapi/configuration/ConfigManager.java b/src/main/java/at/helpch/placeholderapi/configuration/ConfigManager.java index c011649..ff5f433 100644 --- a/src/main/java/at/helpch/placeholderapi/configuration/ConfigManager.java +++ b/src/main/java/at/helpch/placeholderapi/configuration/ConfigManager.java @@ -12,13 +12,17 @@ import org.jetbrains.annotations.Nullable; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.nio.file.*; import java.util.Arrays; import java.util.Map; import java.util.Optional; import java.util.regex.Pattern; +import java.util.stream.Collectors; public final class ConfigManager { private static final Yaml YAML; @@ -56,7 +60,7 @@ public final class ConfigManager { return; } } catch (Exception e) { - e.printStackTrace(); + logger.atSevere().log("Something went wrong when getting the file content of config.yml", e); return; } @@ -69,11 +73,22 @@ public final class ConfigManager { } public void save() { + String headerString = null; + + try (final InputStream in = PlaceholderAPIPlugin.class.getResourceAsStream("/header.txt")) { + if (in != null) { + headerString = new BufferedReader(new InputStreamReader(in)).lines() + .collect(Collectors.joining("\n")); + } + } catch (IOException e) { + logger.atWarning().log("Failed to write internal header.txt to config.yml.", e); + } + try { final Map map = GSON.fromJson(GSON.toJsonTree(config), new TypeToken>(){}.getType()); final String yaml = YAML.dump(map); final Path path = Paths.get(main.getDataDirectory().toString() + "/config.yml"); - Files.write(path, Arrays.asList(LINE_DELIMITER.split(yaml)), StandardCharsets.UTF_8, StandardOpenOption.TRUNCATE_EXISTING); + Files.write(path, Arrays.asList(LINE_DELIMITER.split((headerString == null ? "" : headerString + '\n') + yaml)), StandardCharsets.UTF_8, StandardOpenOption.TRUNCATE_EXISTING); } catch (Exception e) { logger.atSevere().log("Something went wrong when saving config.yml: ", e); } diff --git a/src/main/java/at/helpch/placeholderapi/expansion/Configurable.java b/src/main/java/at/helpch/placeholderapi/expansion/Configurable.java index af77c09..9f92154 100644 --- a/src/main/java/at/helpch/placeholderapi/expansion/Configurable.java +++ b/src/main/java/at/helpch/placeholderapi/expansion/Configurable.java @@ -20,6 +20,7 @@ package at.helpch.placeholderapi.expansion; +import at.helpch.placeholderapi.PlaceholderAPIPlugin; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -49,6 +50,15 @@ public interface Configurable { @NotNull T provideDefault(); + @NotNull + default T getConfig() { + if (this instanceof PlaceholderExpansion exp) { + return (T) PlaceholderAPIPlugin.instance().configManager().config().expansions().getOrDefault(exp.getIdentifier(), provideDefault()); + } + + return provideDefault(); + } + // /** // * The map returned by this method will be used to set config options in PlaceholderAPI's config.yml. // * diff --git a/src/main/java/at/helpch/placeholderapi/expansion/PlaceholderExpansion.java b/src/main/java/at/helpch/placeholderapi/expansion/PlaceholderExpansion.java index 04bb299..5653a7c 100644 --- a/src/main/java/at/helpch/placeholderapi/expansion/PlaceholderExpansion.java +++ b/src/main/java/at/helpch/placeholderapi/expansion/PlaceholderExpansion.java @@ -211,6 +211,17 @@ public abstract class PlaceholderExpansion implements PlaceholderHook { // return (Map) getPlaceholderAPI().configManager().config().expansions().getOrDefault(getIdentifier(), new HashMap<>()); // } + /** + * Get expansion config for this expansion (must implement Configurable<T>). + * Returns null if expansion config is not found. + * Deprecated, please see {@link Configurable#getConfig()}}. + * + * @param configurableType Class extending Configurable<T> + * @return T + * @param Your expansion config type + */ + @SuppressWarnings("unchecked") + @Deprecated @Nullable public final T getExpansionConfig(@NotNull final Class> configurableType) { return (T) getPlaceholderAPI().configManager().config().expansions().getOrDefault(getIdentifier(), null); diff --git a/src/main/resources/header.txt b/src/main/resources/header.txt new file mode 100644 index 0000000..5799f51 --- /dev/null +++ b/src/main/resources/header.txt @@ -0,0 +1,10 @@ +# PlaceholderAPI - Hytale Edition! +# Version: ${version} +# Created by: HelpChat +# Contributors: https://github.com/PlaceholderAPI/PlaceholderAPI/graphs/contributors +# Issues: https://github.com/PlaceholderAPI/PlaceholderAPI/issues +# Expansions: https://placeholderapi.com/ecloud +# Wiki: https://wiki.placeholderapi.com/ +# Discord: https://helpch.at/discord +# No placeholders are provided with this plugin by default. +# Download placeholders: /papi ecloud \ No newline at end of file From b1e163b397e0341544ecb4ea1b3403d6c793bc94 Mon Sep 17 00:00:00 2001 From: PiggyPiglet Date: Sat, 14 Feb 2026 17:20:42 +0800 Subject: [PATCH 2/3] print exception when failed loading expansion --- .../expansion/manager/LocalExpansionManager.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/helpch/placeholderapi/expansion/manager/LocalExpansionManager.java b/src/main/java/at/helpch/placeholderapi/expansion/manager/LocalExpansionManager.java index ed3a6ec..e42676b 100644 --- a/src/main/java/at/helpch/placeholderapi/expansion/manager/LocalExpansionManager.java +++ b/src/main/java/at/helpch/placeholderapi/expansion/manager/LocalExpansionManager.java @@ -24,6 +24,8 @@ import at.helpch.placeholderapi.PlaceholderAPIPlugin; import java.awt.*; import java.io.File; +import java.io.PrintWriter; +import java.io.StringWriter; import java.lang.reflect.Modifier; import java.util.*; import java.util.List; @@ -444,7 +446,10 @@ public final class LocalExpansionManager /*implements Listener*/ { throw ((LinkageError) ex.getCause()); } - logger.atWarning().log("There was an issue with loading an expansion."); + final StringWriter sw = new StringWriter(); + final PrintWriter pw = new PrintWriter(sw); + ex.printStackTrace(pw); + logger.atWarning().log("There was an issue with loading an expansion: " + clazz + "\n%s", sw.toString()); return null; } } From 423059561867d308a0708511fb929584158d0ea0 Mon Sep 17 00:00:00 2001 From: PiggyPiglet Date: Sat, 14 Feb 2026 18:09:15 +0800 Subject: [PATCH 3/3] Add user-agent to hytale papi --- .../manager/CloudExpansionManager.java | 38 +++++++++++++++---- src/main/resources/user-agent.txt | 1 + 2 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/user-agent.txt diff --git a/src/main/java/at/helpch/placeholderapi/expansion/manager/CloudExpansionManager.java b/src/main/java/at/helpch/placeholderapi/expansion/manager/CloudExpansionManager.java index 518e1a0..5c3c12d 100644 --- a/src/main/java/at/helpch/placeholderapi/expansion/manager/CloudExpansionManager.java +++ b/src/main/java/at/helpch/placeholderapi/expansion/manager/CloudExpansionManager.java @@ -26,10 +26,7 @@ import com.google.gson.reflect.TypeToken; import java.io.*; import java.lang.reflect.Type; -import java.net.URI; -import java.net.URL; -import java.net.URLConnection; -import java.net.UnknownHostException; +import java.net.*; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.nio.charset.StandardCharsets; @@ -50,11 +47,31 @@ import java.util.stream.Collectors; import at.helpch.placeholderapi.expansion.PlaceholderExpansion; import at.helpch.placeholderapi.expansion.cloud.CloudExpansion; +import com.hypixel.hytale.common.plugin.PluginIdentifier; import com.hypixel.hytale.logger.HytaleLogger; +import com.hypixel.hytale.server.core.HytaleServer; +import com.hypixel.hytale.server.core.plugin.JavaPlugin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Unmodifiable; public final class CloudExpansionManager { + public static final String USER_AGENT; + + static { + String userAgent; + + try (final InputStream in = PlaceholderAPIPlugin.class.getResourceAsStream("/user-agent.txt")) { + if (in == null) { + userAgent = "PlaceholderAPI-Bukkit-null"; + } else { + userAgent = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)).readLine(); + } + } catch (IOException e) { + userAgent = "PlaceholderAPI-Bukkit-null"; + } + + USER_AGENT = userAgent; + } @NotNull private static final String API_URL = "https://ecloud.placeholderapi.com/api/v3/?platform=hytale"; @@ -182,6 +199,7 @@ public final class CloudExpansionManager { try { final URI uri = new URI(API_URL); final URLConnection connection = uri.toURL().openConnection(); + connection.setRequestProperty("User-Agent", USER_AGENT); final String json; try (final InputStream input = connection.getInputStream()) { @@ -262,10 +280,14 @@ public final class CloudExpansionManager { "Expansion-" + toIndexName(expansion) + ".jar"); final CompletableFuture download = CompletableFuture.supplyAsync(() -> { - try (final ReadableByteChannel source = Channels.newChannel(new URL(version.getUrl()) - .openStream()); final FileOutputStream target = new FileOutputStream(file)) { - target.getChannel().transferFrom(source, 0, Long.MAX_VALUE); - } catch (final IOException ex) { + try { + final URLConnection connection = new URI(version.getUrl()).toURL().openConnection(); + connection.setRequestProperty("User-Agent", USER_AGENT); + + try (final ReadableByteChannel source = Channels.newChannel(connection.getInputStream()); final FileOutputStream target = new FileOutputStream(file)) { + target.getChannel().transferFrom(source, 0, Long.MAX_VALUE); + } + } catch (final IOException | URISyntaxException ex) { throw new CompletionException(ex); } return file; diff --git a/src/main/resources/user-agent.txt b/src/main/resources/user-agent.txt new file mode 100644 index 0000000..172d6a9 --- /dev/null +++ b/src/main/resources/user-agent.txt @@ -0,0 +1 @@ +PlaceholderAPI-Hytale-${version} \ No newline at end of file