diff --git a/gradle.properties b/gradle.properties index 8387a74..b21853f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=0.7.5 +version=0.8.0 diff --git a/nukkit/build.gradle.kts b/nukkit/build.gradle.kts new file mode 100644 index 0000000..af632e8 --- /dev/null +++ b/nukkit/build.gradle.kts @@ -0,0 +1,11 @@ +val moduleName by extra("dev.faststats.nukkit") + +repositories { + maven("https://repo.opencollab.dev/maven-releases") + maven("https://repo.opencollab.dev/maven-snapshots") +} + +dependencies { + api(project(":core")) + compileOnly("cn.nukkit:nukkit:1.0-SNAPSHOT") +} diff --git a/nukkit/src/main/java/dev/faststats/nukkit/NukkitMetrics.java b/nukkit/src/main/java/dev/faststats/nukkit/NukkitMetrics.java new file mode 100644 index 0000000..551dee2 --- /dev/null +++ b/nukkit/src/main/java/dev/faststats/nukkit/NukkitMetrics.java @@ -0,0 +1,23 @@ +package dev.faststats.nukkit; + +import cn.nukkit.plugin.PluginBase; +import dev.faststats.core.Metrics; +import org.jetbrains.annotations.Contract; + +/** + * Nukkit metrics implementation. + * + * @since 0.8.0 + */ +public sealed interface NukkitMetrics extends Metrics permits NukkitMetricsImpl { + /** + * Creates a new metrics factory for Nukkit. + * + * @return the metrics factory + * @since 0.8.0 + */ + @Contract(pure = true) + static Metrics.Factory factory() { + return new NukkitMetricsImpl.Factory(); + } +} diff --git a/nukkit/src/main/java/dev/faststats/nukkit/NukkitMetricsImpl.java b/nukkit/src/main/java/dev/faststats/nukkit/NukkitMetricsImpl.java new file mode 100644 index 0000000..b2811cc --- /dev/null +++ b/nukkit/src/main/java/dev/faststats/nukkit/NukkitMetricsImpl.java @@ -0,0 +1,74 @@ +package dev.faststats.nukkit; + +import cn.nukkit.Server; +import cn.nukkit.plugin.PluginBase; +import cn.nukkit.utils.Logger; +import com.google.gson.JsonObject; +import dev.faststats.core.Metrics; +import dev.faststats.core.SimpleMetrics; +import org.jetbrains.annotations.Async; +import org.jetbrains.annotations.Contract; +import org.jspecify.annotations.Nullable; + +import java.nio.file.Path; +import java.util.Optional; +import java.util.function.Supplier; + +final class NukkitMetricsImpl extends SimpleMetrics implements NukkitMetrics { + private final Logger logger; + private final Server server; + private final PluginBase plugin; + + @Async.Schedule + @Contract(mutates = "io") + private NukkitMetricsImpl(SimpleMetrics.Factory factory, PluginBase plugin, Path config) throws IllegalStateException { + super(factory, config); + + this.logger = plugin.getLogger(); + this.server = plugin.getServer(); + this.plugin = plugin; + + startSubmitting(); + } + + @Override + protected void appendDefaultData(JsonObject charts) { + charts.addProperty("minecraft_version", server.getVersion()); + charts.addProperty("online_mode", server.xboxAuth); + charts.addProperty("player_count", server.getOnlinePlayers().size()); + charts.addProperty("plugin_version", plugin.getDescription().getVersion()); + charts.addProperty("server_type", server.getName()); + } + + @Override + protected void printError(String message, @Nullable Throwable throwable) { + logger.error(message, throwable); + } + + @Override + protected void printInfo(String message) { + logger.info(message); + } + + @Override + protected void printWarning(String message) { + logger.warning(message); + } + + private Optional tryOrEmpty(Supplier supplier) { + try { + return Optional.of(supplier.get()); + } catch (NoSuchMethodError | Exception e) { + return Optional.empty(); + } + } + + static final class Factory extends SimpleMetrics.Factory { + @Override + public Metrics create(PluginBase plugin) throws IllegalStateException { + var dataFolder = Path.of(plugin.getServer().getPluginPath(), "faststats"); + var config = dataFolder.resolve("config.properties"); + return new NukkitMetricsImpl(this, plugin, config); + } + } +} diff --git a/nukkit/src/main/java/module-info.java b/nukkit/src/main/java/module-info.java new file mode 100644 index 0000000..b7b0b2b --- /dev/null +++ b/nukkit/src/main/java/module-info.java @@ -0,0 +1,12 @@ +import org.jspecify.annotations.NullMarked; + +@NullMarked +module dev.faststats.nukkit { + exports dev.faststats.nukkit; + + requires com.google.gson; + requires dev.faststats.core; + + requires static org.jetbrains.annotations; + requires static org.jspecify; +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 19cad3e..61baaf0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,4 +7,5 @@ include("bukkit") include("bungeecord") include("core") include("minestom") +include("nukkit") include("velocity") \ No newline at end of file