Skip to content

Commit 63f3554

Browse files
committed
Add Sponge metrics implementation
1 parent ff1cfa8 commit 63f3554

File tree

5 files changed

+147
-0
lines changed

5 files changed

+147
-0
lines changed

settings.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ include("hytale")
1111
include("hytale:example-plugin")
1212
include("minestom")
1313
include("nukkit")
14+
include("sponge")
1415
include("velocity")

sponge/build.gradle.kts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
val moduleName by extra("dev.faststats.sponge")
2+
3+
repositories {
4+
maven("https://repo.spongepowered.org/repository/maven-public/")
5+
}
6+
7+
dependencies {
8+
api(project(":core"))
9+
compileOnly("org.spongepowered:spongeapi:8.0.0")
10+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package dev.faststats.sponge;
2+
3+
import com.google.inject.Inject;
4+
import dev.faststats.core.Metrics;
5+
import org.apache.logging.log4j.Logger;
6+
import org.spongepowered.api.config.ConfigDir;
7+
8+
import java.nio.file.Path;
9+
10+
/**
11+
* Sponge metrics implementation.
12+
*
13+
* @since 0.1.0
14+
*/
15+
public sealed interface SpongeMetrics extends Metrics permits SpongeMetricsImpl {
16+
final class Factory extends SpongeMetricsImpl.Factory {
17+
/**
18+
* Creates a new metrics factory for Sponge.
19+
*
20+
* @param logger the logger
21+
* @param dataDirectory the data directory
22+
* @apiNote This instance is automatically injected into your plugin.
23+
* @since 0.1.0
24+
*/
25+
@Inject
26+
private Factory(Logger logger, @ConfigDir(sharedRoot = true) Path dataDirectory) {
27+
super(logger, dataDirectory);
28+
}
29+
}
30+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package dev.faststats.sponge;
2+
3+
import com.google.gson.JsonObject;
4+
import dev.faststats.core.Metrics;
5+
import dev.faststats.core.SimpleMetrics;
6+
import org.apache.logging.log4j.Logger;
7+
import org.jetbrains.annotations.Async;
8+
import org.jetbrains.annotations.Contract;
9+
import org.jspecify.annotations.Nullable;
10+
import org.spongepowered.api.Platform;
11+
import org.spongepowered.api.Sponge;
12+
import org.spongepowered.api.config.ConfigDir;
13+
import org.spongepowered.plugin.PluginContainer;
14+
15+
import java.nio.file.Path;
16+
17+
final class SpongeMetricsImpl extends SimpleMetrics implements SpongeMetrics {
18+
public static final String COMMENT = """
19+
FastStats (https://faststats.dev) collects anonymous usage statistics for plugin developers.
20+
# This helps developers understand how their projects are used in the real world.
21+
#
22+
# No IP addresses, player data, or personal information is collected.
23+
# The server ID below is randomly generated and can be regenerated at any time.
24+
#
25+
# Enabling metrics has no noticeable performance impact.
26+
# Enabling metrics is recommended, you can do so in the Sponge config.
27+
#
28+
# If you suspect a plugin is collecting personal data or bypassing the Sponge config,
29+
# please report it at: https://faststats.dev/abuse
30+
#
31+
# For more information, visit: https://faststats.dev/info
32+
""";
33+
34+
private final Logger logger;
35+
private final PluginContainer plugin;
36+
37+
@Async.Schedule
38+
@Contract(mutates = "io")
39+
private SpongeMetricsImpl(
40+
SimpleMetrics.Factory<?> factory,
41+
Logger logger,
42+
PluginContainer plugin,
43+
Path config
44+
) throws IllegalStateException {
45+
super(factory, SimpleMetrics.Config.read(config, COMMENT, true, Sponge.metricsConfigManager()
46+
.effectiveCollectionState(plugin).asBoolean()));
47+
48+
this.logger = logger;
49+
this.plugin = plugin;
50+
51+
startSubmitting();
52+
}
53+
54+
@Override
55+
protected void appendDefaultData(JsonObject charts) {
56+
charts.addProperty("online_mode", Sponge.server().isOnlineModeEnabled());
57+
charts.addProperty("player_count", Sponge.server().onlinePlayers().size());
58+
charts.addProperty("plugin_version", plugin.metadata().version().toString());
59+
charts.addProperty("minecraft_version", Sponge.platform().minecraftVersion().name());
60+
charts.addProperty("server_type", Sponge.platform().container(Platform.Component.IMPLEMENTATION).metadata().id());
61+
}
62+
63+
@Override
64+
protected void printError(String message, @Nullable Throwable throwable) {
65+
logger.error(message, throwable);
66+
}
67+
68+
@Override
69+
protected void printInfo(String message) {
70+
logger.info(message);
71+
}
72+
73+
@Override
74+
protected void printWarning(String message) {
75+
logger.warn(message);
76+
}
77+
78+
static class Factory extends SimpleMetrics.Factory<PluginContainer> {
79+
protected final Logger logger;
80+
protected final Path dataDirectory;
81+
82+
public Factory(Logger logger, @ConfigDir(sharedRoot = true) Path dataDirectory) {
83+
this.logger = logger;
84+
this.dataDirectory = dataDirectory;
85+
}
86+
87+
@Override
88+
public Metrics create(PluginContainer plugin) throws IllegalStateException, IllegalArgumentException {
89+
var faststats = dataDirectory.resolveSibling("faststats");
90+
return new SpongeMetricsImpl(this, logger, plugin, faststats.resolve("config.properties"));
91+
}
92+
}
93+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import org.jspecify.annotations.NullMarked;
2+
3+
@NullMarked
4+
module dev.faststats.sponge {
5+
exports dev.faststats.sponge;
6+
7+
requires com.google.gson;
8+
requires com.google.guice;
9+
requires dev.faststats.core;
10+
11+
requires static org.jetbrains.annotations;
12+
requires static org.jspecify;
13+
}

0 commit comments

Comments
 (0)