Add metrics

This commit is contained in:
PiggyPiglet
2026-02-14 20:37:36 +08:00
parent 4230595618
commit 41bb27cf6b
6 changed files with 146 additions and 19 deletions

View File

@@ -4,8 +4,10 @@ import at.helpch.placeholderapi.commands.PlaceholderCommandRouter;
import at.helpch.placeholderapi.configuration.ConfigManager; import at.helpch.placeholderapi.configuration.ConfigManager;
import at.helpch.placeholderapi.expansion.manager.CloudExpansionManager; import at.helpch.placeholderapi.expansion.manager.CloudExpansionManager;
import at.helpch.placeholderapi.expansion.manager.LocalExpansionManager; import at.helpch.placeholderapi.expansion.manager.LocalExpansionManager;
import at.helpch.placeholderapi.metrics.MetricsManager;
import at.helpch.placeholderapi.updatechecker.UpdateChecker; import at.helpch.placeholderapi.updatechecker.UpdateChecker;
import com.hypixel.hytale.event.EventPriority; import com.hypixel.hytale.event.EventPriority;
import com.hypixel.hytale.server.core.HytaleServer;
import com.hypixel.hytale.server.core.command.system.CommandSender; import com.hypixel.hytale.server.core.command.system.CommandSender;
import com.hypixel.hytale.server.core.console.ConsoleSender; import com.hypixel.hytale.server.core.console.ConsoleSender;
import com.hypixel.hytale.server.core.event.events.BootEvent; import com.hypixel.hytale.server.core.event.events.BootEvent;
@@ -13,8 +15,12 @@ import com.hypixel.hytale.server.core.event.events.PrepareUniverseEvent;
import com.hypixel.hytale.server.core.event.events.player.PlayerDisconnectEvent; import com.hypixel.hytale.server.core.event.events.player.PlayerDisconnectEvent;
import com.hypixel.hytale.server.core.plugin.JavaPlugin; import com.hypixel.hytale.server.core.plugin.JavaPlugin;
import com.hypixel.hytale.server.core.plugin.JavaPluginInit; import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
import com.hypixel.hytale.server.core.task.TaskRegistration;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class PlaceholderAPIPlugin extends JavaPlugin { public class PlaceholderAPIPlugin extends JavaPlugin {
private final ConfigManager configManager = new ConfigManager(this); private final ConfigManager configManager = new ConfigManager(this);
private final LocalExpansionManager localExpansionManager = new LocalExpansionManager(this); private final LocalExpansionManager localExpansionManager = new LocalExpansionManager(this);
@@ -36,6 +42,14 @@ public class PlaceholderAPIPlugin extends JavaPlugin {
protected void setup() { protected void setup() {
configManager.setup(); configManager.setup();
if (configManager.config().metrics()) {
final MetricsManager metricsManager = new MetricsManager(this);
final ScheduledFuture<Void> task = (ScheduledFuture<Void>) HytaleServer.SCHEDULED_EXECUTOR.scheduleAtFixedRate(() -> {
metricsManager.send();
}, 30, 30, TimeUnit.SECONDS);
getTaskRegistry().registerTask(task);
}
getEventRegistry().register(PlayerDisconnectEvent.class, localExpansionManager::onQuit); getEventRegistry().register(PlayerDisconnectEvent.class, localExpansionManager::onQuit);
getEventRegistry().register(EventPriority.LAST, BootEvent.class, this::onServerLoad); getEventRegistry().register(EventPriority.LAST, BootEvent.class, this::onServerLoad);

View File

@@ -21,6 +21,7 @@ import java.nio.file.*;
import java.util.Arrays; import java.util.Arrays;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.UUID;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -66,6 +67,15 @@ public final class ConfigManager {
final Map<String, Object> data = YAML.load(content); final Map<String, Object> data = YAML.load(content);
config = GSON.fromJson(GSON.toJsonTree(data), PlaceholderAPIConfig.class); config = GSON.fromJson(GSON.toJsonTree(data), PlaceholderAPIConfig.class);
if (config.metricsUuid() == null && config.metrics() == null) {
config.metricsUuid(UUID.randomUUID());
config.metrics(true);
save();
} else if (config.metricsUuid() == null && config.metrics()) {
config.metricsUuid(UUID.randomUUID());
save();
}
} }
public PlaceholderAPIConfig config() { public PlaceholderAPIConfig config() {

View File

@@ -24,36 +24,21 @@ import org.jetbrains.annotations.NotNull;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID;
public final class PlaceholderAPIConfig { public final class PlaceholderAPIConfig {
private boolean checkUpdates; private boolean checkUpdates;
private boolean cloudEnabled; private boolean cloudEnabled;
private boolean debugMode; private boolean debugMode;
private Boolean metrics;
private ExpansionSort cloudSorting; private ExpansionSort cloudSorting;
private BooleanValue booleanValue; private BooleanValue booleanValue;
private String dateFormat; private String dateFormat;
private Map<String, Object> expansions; private Map<String, Object> expansions;
private UUID metricsUuid;
public PlaceholderAPIConfig(boolean checkUpdates, boolean cloudEnabled, boolean debugMode, @NotNull ExpansionSort cloudSorting, public PlaceholderAPIConfig() {
@NotNull BooleanValue booleanValue, @NotNull String dateFormat) {
this.checkUpdates = checkUpdates;
this.cloudEnabled = cloudEnabled;
this.debugMode = debugMode;
this.cloudSorting = cloudSorting;
this.booleanValue = booleanValue;
this.dateFormat = dateFormat;
this.expansions = new HashMap<>();
}
public PlaceholderAPIConfig(boolean checkUpdates, boolean cloudEnabled, boolean debugMode, @NotNull ExpansionSort cloudSorting,
@NotNull BooleanValue booleanValue, @NotNull String dateFormat, Map<String, Object> expansions) {
this.checkUpdates = checkUpdates;
this.cloudEnabled = cloudEnabled;
this.debugMode = debugMode;
this.cloudSorting = cloudSorting;
this.booleanValue = booleanValue;
this.dateFormat = dateFormat;
this.expansions = expansions;
} }
public boolean checkUpdates() { public boolean checkUpdates() {
@@ -76,6 +61,14 @@ public final class PlaceholderAPIConfig {
debugMode = value; debugMode = value;
} }
public Boolean metrics() {
return metrics;
}
public void metrics(final boolean value) {
metrics = value;
}
@NotNull @NotNull
public ExpansionSort cloudSorting() { public ExpansionSort cloudSorting() {
return cloudSorting; return cloudSorting;
@@ -111,4 +104,12 @@ public final class PlaceholderAPIConfig {
public void expansions(@NotNull final Map<String, Object> value) { public void expansions(@NotNull final Map<String, Object> value) {
expansions = value; expansions = value;
} }
public UUID metricsUuid() {
return metricsUuid;
}
public void metricsUuid(@NotNull final UUID metricsUuid) {
this.metricsUuid = metricsUuid;
}
} }

View File

@@ -0,0 +1,67 @@
package at.helpch.placeholderapi.metrics;
import at.helpch.placeholderapi.PlaceholderAPIPlugin;
import at.helpch.placeholderapi.expansion.PlaceholderExpansion;
import at.helpch.placeholderapi.expansion.manager.CloudExpansionManager;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.hypixel.hytale.common.util.java.ManifestUtil;
import com.hypixel.hytale.server.core.HytaleServer;
import com.hypixel.hytale.server.core.universe.Universe;
import org.jetbrains.annotations.NotNull;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
public class MetricsManager {
private static final String METRICS_URL = "https://ecloud.placeholderapi.com/api/metrics/";
private static final Gson GSON = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();
private static final HttpClient CLIENT = HttpClient.newHttpClient();
private final PlaceholderAPIPlugin main;
public MetricsManager(@NotNull final PlaceholderAPIPlugin main) {
this.main = main;
}
public void send() {
final String pluginVersion = main.getManifest().getVersion().toString();
final String serverVersion = ManifestUtil.getImplementationVersion();
final boolean usingEcloud = main.configManager().config().cloudEnabled();
final List<String> expansionsUsed = main.localExpansionManager().getExpansions().stream()
.map(PlaceholderExpansion::getName)
.toList();
final Map<String, String> expansionVersions = main.localExpansionManager().getExpansions().stream()
.collect(Collectors.toUnmodifiableMap(PlaceholderExpansion::getName, PlaceholderExpansion::getVersion));
final String javaVersion = System.getProperty("java.version");
final String serverOs = System.getProperty("os.name");
final int playerCount = Universe.get().getPlayerCount();
final UUID serverUuid = main.configManager().config().metricsUuid();
final MetricsPayload payload = new MetricsPayload(pluginVersion, serverVersion, usingEcloud, expansionsUsed,
expansionVersions, javaVersion, serverOs, playerCount, serverUuid);
final String json = GSON.toJson(payload);
final HttpRequest request = HttpRequest.newBuilder(URI.create(METRICS_URL))
.POST(HttpRequest.BodyPublishers.ofString(json))
.header("Content-Type", "application/json")
.header("User-Agent", CloudExpansionManager.USER_AGENT)
.build();
CLIENT.sendAsync(request, HttpResponse.BodyHandlers.discarding());
}
}

View File

@@ -0,0 +1,34 @@
package at.helpch.placeholderapi.metrics;
import java.util.List;
import java.util.Map;
import java.util.UUID;
public final class MetricsPayload {
private final String pluginVersion;
private final String serverVersion;
private final String platform = "HYTALE";
private final boolean usingEcloud;
private final List<String> expansionsUsed;
private final Map<String, String> expansionVersions;
private final String javaVersion;
private final String serverOs;
private final int playerCount;
private final UUID serverUuid;
private final String pluginName = "PlaceholderAPI";
public MetricsPayload(final String pluginVersion, final String serverVersion, final boolean usingEcloud,
final List<String> expansionsUsed, final Map<String, String> expansionVersions,
final String javaVersion, final String serverOs, final int playerCount,
final UUID serverUuid) {
this.pluginVersion = pluginVersion;
this.serverVersion = serverVersion;
this.usingEcloud = usingEcloud;
this.expansionsUsed = expansionsUsed;
this.expansionVersions = expansionVersions;
this.javaVersion = javaVersion;
this.serverOs = serverOs;
this.playerCount = playerCount;
this.serverUuid = serverUuid;
}
}

View File

@@ -11,6 +11,7 @@
check_updates: true check_updates: true
cloud_enabled: true cloud_enabled: true
cloud_sorting: "NAME" cloud_sorting: "NAME"
metrics: true
boolean_value: boolean_value:
true_value: 'yes' true_value: 'yes'
false_value: 'no' false_value: 'no'