Skip to content

Commit 393baed

Browse files
committed
Implement Velocity metrics collection and plugin factory
1 parent eba150c commit 393baed

File tree

5 files changed

+163
-1
lines changed

5 files changed

+163
-1
lines changed

settings.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ plugins {
33
}
44

55
rootProject.name = "dev-kits"
6+
include("bukkit")
67
include("core")
7-
include("bukkit")
8+
include("velocity")

velocity/build.gradle.kts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
repositories {
2+
maven("https://repo.papermc.io/repository/maven-public/")
3+
}
4+
5+
dependencies {
6+
api(project(":core"))
7+
compileOnly("com.velocitypowered:velocity-api:3.4.0-SNAPSHOT")
8+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package dev.faststats.velocity;
2+
3+
import com.google.inject.Inject;
4+
import com.velocitypowered.api.plugin.annotation.DataDirectory;
5+
import com.velocitypowered.api.proxy.ProxyServer;
6+
import dev.faststats.core.Metrics;
7+
import org.slf4j.Logger;
8+
9+
import java.nio.file.Path;
10+
11+
/**
12+
* Bukkit metrics implementation.
13+
*
14+
* @since 0.1.0
15+
*/
16+
public sealed interface VelocityMetrics extends Metrics permits VelocityMetricsImpl {
17+
final class Factory extends VelocityMetricsImpl.Factory {
18+
/**
19+
* Creates a new metrics factory for Velocity.
20+
*
21+
* @param server the velocity server
22+
* @param logger the logger
23+
* @param dataDirectory the data directory
24+
* @apiNote This instance is automatically injected into your plugin.
25+
* @since 0.1.0
26+
*/
27+
@Inject
28+
private Factory(ProxyServer server, Logger logger, @DataDirectory Path dataDirectory) {
29+
super(server, logger, dataDirectory);
30+
}
31+
}
32+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package dev.faststats.velocity;
2+
3+
import com.google.gson.JsonObject;
4+
import com.velocitypowered.api.plugin.PluginContainer;
5+
import com.velocitypowered.api.plugin.annotation.DataDirectory;
6+
import com.velocitypowered.api.proxy.ProxyServer;
7+
import dev.faststats.core.Metrics;
8+
import dev.faststats.core.SimpleMetrics;
9+
import org.jetbrains.annotations.Async;
10+
import org.jspecify.annotations.Nullable;
11+
import org.slf4j.Logger;
12+
13+
import java.io.IOException;
14+
import java.nio.file.Path;
15+
import java.util.Optional;
16+
import java.util.concurrent.TimeUnit;
17+
import java.util.function.Supplier;
18+
19+
final class VelocityMetricsImpl extends SimpleMetrics implements VelocityMetrics {
20+
private final Logger logger;
21+
private final ProxyServer server;
22+
private final PluginContainer plugin;
23+
24+
private VelocityMetricsImpl(
25+
SimpleMetrics.Factory<?> factory,
26+
Logger logger,
27+
ProxyServer server,
28+
Path config,
29+
PluginContainer plugin
30+
) throws IOException, IllegalStateException {
31+
super(factory, config);
32+
33+
this.logger = logger;
34+
this.server = server;
35+
this.plugin = plugin;
36+
37+
startSubmitting();
38+
}
39+
40+
@Async.Schedule
41+
private void startSubmitting() {
42+
startSubmitting(0, 30, TimeUnit.MINUTES);
43+
}
44+
45+
@Override
46+
protected void appendDefaultData(JsonObject charts) {
47+
var pluginVersion = plugin.getDescription().getVersion().orElse("unknown");
48+
var size = server.getPlayerCount();
49+
50+
charts.addProperty("online_mode", server.getConfiguration().isOnlineMode());
51+
charts.addProperty("plugin_version", pluginVersion);
52+
charts.addProperty("server_type", server.getVersion().getName());
53+
charts.addProperty("proxy_version", server.getVersion().getVersion());
54+
charts.addProperty("proxy_vendor", server.getVersion().getVendor());
55+
if (size != 0) charts.addProperty("player_count", size);
56+
}
57+
58+
@Override
59+
protected void error(String message, @Nullable Throwable throwable) {
60+
if (!isDebug()) return;
61+
var msg = "[" + VelocityMetricsImpl.class.getName() + "]: " + message;
62+
logger.error(msg, throwable);
63+
}
64+
65+
@Override
66+
protected void warn(String message) {
67+
if (!isDebug()) return;
68+
var msg = "[" + VelocityMetricsImpl.class.getName() + "]: " + message;
69+
logger.warn(msg);
70+
}
71+
72+
@Override
73+
protected void info(String message) {
74+
if (!isDebug()) return;
75+
var msg = "[" + VelocityMetricsImpl.class.getName() + "]: " + message;
76+
logger.info(msg);
77+
}
78+
79+
private <T> Optional<T> tryOrEmpty(Supplier<@Nullable T> supplier) {
80+
try {
81+
return Optional.ofNullable(supplier.get());
82+
} catch (NoSuchMethodError | Exception e) {
83+
error("Failed to call supplier", e);
84+
return Optional.empty();
85+
}
86+
}
87+
88+
static class Factory extends SimpleMetrics.Factory<Object> {
89+
protected final Logger logger;
90+
protected final Path dataDirectory;
91+
protected final ProxyServer server;
92+
93+
public Factory(ProxyServer server, Logger logger, @DataDirectory Path dataDirectory) {
94+
this.logger = logger;
95+
this.dataDirectory = dataDirectory;
96+
this.server = server;
97+
}
98+
99+
@Override
100+
public Metrics create(Object plugin) throws IOException, IllegalStateException, IllegalArgumentException {
101+
var faststats = dataDirectory.resolveSibling("faststats");
102+
var container = server.getPluginManager().ensurePluginContainer(plugin);
103+
return new VelocityMetricsImpl(this, logger, server, faststats.resolve("config.json"), container);
104+
}
105+
}
106+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import org.jspecify.annotations.NullMarked;
2+
3+
@NullMarked
4+
module dev.faststats.velocity {
5+
exports dev.faststats.velocity;
6+
7+
requires com.google.gson;
8+
requires com.google.guice;
9+
requires com.velocitypowered.api;
10+
requires dev.faststats.core;
11+
requires org.slf4j;
12+
13+
requires static org.jetbrains.annotations;
14+
requires static org.jspecify;
15+
}

0 commit comments

Comments
 (0)