Skip to content

Commit 81680b9

Browse files
authored
Merge pull request #23 from renvins/feature/bungeecord
Impelement bungeecord version
2 parents 838e119 + 63ac818 commit 81680b9

24 files changed

+1515
-3
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ ServerPulse now supports **all Minecraft server platforms** in the ecosystem:
3333

3434
- **Bukkit/Spigot**: Full support with custom TPS monitoring implementation
3535
- **Paper and its forks** (Purpur, Pufferfish, etc.): Enhanced support with native TPS monitoring
36+
- **BungeeCord**: Support for BungeeCord proxy servers with network-wide player monitoring
3637
- **Velocity**: Support for Velocity proxy servers (ofc TPS and world metrics are not available)
3738
- **Fabric**: Support for Fabric servers (latest versions of Fabric API and Minecraft)
3839

build.gradle.kts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
group = "it.renvins"
2-
version = "0.3.5-SNAPSHOT"
2+
version = "0.4.0-SNAPSHOT"
33

44
repositories {
55
mavenCentral()
6+
maven {
7+
name = "mojang"
8+
url = uri("https://libraries.minecraft.net/")
9+
}
610
}

bungeecord/build.gradle.kts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
2+
3+
plugins {
4+
id("java")
5+
id("com.gradleup.shadow") version "9.0.0-beta11"
6+
id("io.freefair.lombok") version "8.13.1"
7+
}
8+
9+
group = "it.renvins"
10+
11+
repositories {
12+
mavenCentral()
13+
maven {
14+
name = "bungeecord"
15+
url = uri("https://oss.sonatype.org/content/repositories/snapshots")
16+
}
17+
maven {
18+
name = "mojang"
19+
url = uri("https://libraries.minecraft.net/")
20+
}
21+
}
22+
23+
dependencies {
24+
implementation(project(":api"))
25+
implementation(project(":common"))
26+
27+
compileOnly("net.md-5:bungeecord-api:1.21-R0.2")
28+
}
29+
30+
java {
31+
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
32+
}
33+
34+
tasks.withType<ShadowJar> {
35+
archiveBaseName = "serverpulse"
36+
archiveClassifier = "bungeecord"
37+
archiveVersion = "${rootProject.version}"
38+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package it.renvins.serverpulse.bungeecord;
2+
3+
import net.md_5.bungee.api.plugin.Plugin;
4+
5+
public class ServerPulseBungeeCord extends Plugin {
6+
7+
private final ServerPulseBungeeCordLoader loader = new ServerPulseBungeeCordLoader(this);
8+
9+
@Override
10+
public void onEnable() {
11+
loader.load();
12+
}
13+
14+
@Override
15+
public void onDisable() {
16+
loader.unload();
17+
}
18+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package it.renvins.serverpulse.bungeecord;
2+
3+
import it.renvins.serverpulse.api.ServerPulseAPI;
4+
import it.renvins.serverpulse.api.metrics.IDiskRetriever;
5+
import it.renvins.serverpulse.api.metrics.IPingRetriever;
6+
import it.renvins.serverpulse.api.service.IDatabaseService;
7+
import it.renvins.serverpulse.api.service.IMetricsService;
8+
import lombok.RequiredArgsConstructor;
9+
10+
@RequiredArgsConstructor
11+
public class ServerPulseBungeeCordAPI implements ServerPulseAPI {
12+
13+
private final IDatabaseService databaseService;
14+
private final IMetricsService metricsService;
15+
private final IDiskRetriever diskRetriever;
16+
private final IPingRetriever pingRetriever;
17+
18+
@Override
19+
public IDatabaseService getDatabaseService() {
20+
return databaseService;
21+
}
22+
23+
@Override
24+
public IMetricsService getMetricsService() {
25+
return metricsService;
26+
}
27+
28+
@Override
29+
public IDiskRetriever getDiskRetriever() {
30+
return diskRetriever;
31+
}
32+
33+
@Override
34+
public IPingRetriever getPingRetriever() {
35+
return pingRetriever;
36+
}
37+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package it.renvins.serverpulse.bungeecord;
2+
3+
import it.renvins.serverpulse.api.ServerPulseProvider;
4+
import it.renvins.serverpulse.api.metrics.IDiskRetriever;
5+
import it.renvins.serverpulse.api.metrics.IPingRetriever;
6+
import it.renvins.serverpulse.api.service.IDatabaseService;
7+
import it.renvins.serverpulse.api.service.IMetricsService;
8+
import it.renvins.serverpulse.api.service.Service;
9+
import it.renvins.serverpulse.bungeecord.commands.ServerPulseCommand;
10+
import it.renvins.serverpulse.bungeecord.config.BungeeCordConfiguration;
11+
import it.renvins.serverpulse.bungeecord.config.BungeeCordDatabaseConfiguration;
12+
import it.renvins.serverpulse.bungeecord.config.BungeeCordMetricsConfiguration;
13+
import it.renvins.serverpulse.bungeecord.logger.BungeeCordLogger;
14+
import it.renvins.serverpulse.bungeecord.metrics.BungeeCordPingRetriever;
15+
import it.renvins.serverpulse.bungeecord.platform.BungeeCordPlatform;
16+
import it.renvins.serverpulse.bungeecord.scheduler.BungeeCordTaskScheduler;
17+
import it.renvins.serverpulse.common.DatabaseService;
18+
import it.renvins.serverpulse.common.MetricsService;
19+
import it.renvins.serverpulse.common.config.DatabaseConfiguration;
20+
import it.renvins.serverpulse.common.config.MetricsConfiguration;
21+
import it.renvins.serverpulse.common.logger.PulseLogger;
22+
import it.renvins.serverpulse.common.metrics.DiskRetriever;
23+
import it.renvins.serverpulse.common.platform.Platform;
24+
import it.renvins.serverpulse.common.scheduler.TaskScheduler;
25+
26+
import java.util.logging.Logger;
27+
28+
public class ServerPulseBungeeCordLoader implements Service {
29+
30+
private final ServerPulseBungeeCord plugin;
31+
public static Logger LOGGER;
32+
33+
private final BungeeCordConfiguration config;
34+
private final Platform platform;
35+
36+
private final IDatabaseService databaseService;
37+
private final IMetricsService metricsService;
38+
39+
private final IDiskRetriever diskRetriever;
40+
private final IPingRetriever pingRetriever;
41+
42+
public ServerPulseBungeeCordLoader(ServerPulseBungeeCord plugin) {
43+
this.plugin = plugin;
44+
LOGGER = plugin.getLogger();
45+
46+
this.config = new BungeeCordConfiguration(plugin, "config.yml");
47+
this.platform = new BungeeCordPlatform(plugin);
48+
49+
PulseLogger pulseLogger = new BungeeCordLogger(plugin);
50+
TaskScheduler scheduler = new BungeeCordTaskScheduler(plugin);
51+
52+
DatabaseConfiguration dbConfig = new BungeeCordDatabaseConfiguration(config);
53+
MetricsConfiguration metricsConfig = new BungeeCordMetricsConfiguration(config);
54+
55+
this.databaseService = new DatabaseService(pulseLogger, platform, dbConfig, scheduler);
56+
this.metricsService = new MetricsService(pulseLogger, platform, metricsConfig, scheduler);
57+
58+
this.diskRetriever = new DiskRetriever(plugin.getDataFolder());
59+
this.pingRetriever =new BungeeCordPingRetriever(plugin);
60+
61+
LOGGER.info("ServerPulse for BungeeCord initialized - waiting for server starting...");
62+
}
63+
64+
@Override
65+
public void load() {
66+
LOGGER.info("Loading configuration...");
67+
config.load();
68+
69+
// Register commands
70+
plugin.getProxy().getPluginManager().registerCommand(plugin, new ServerPulseCommand(config));
71+
72+
ServerPulseProvider.register(new ServerPulseBungeeCordAPI(databaseService, metricsService, diskRetriever, pingRetriever));
73+
74+
databaseService.load();
75+
if (!platform.isEnabled()) {
76+
return;
77+
}
78+
metricsService.load();
79+
}
80+
81+
@Override
82+
public void unload() {
83+
databaseService.unload();
84+
metricsService.unload();
85+
86+
plugin.getProxy().getScheduler().cancel(plugin);
87+
ServerPulseProvider.unregister();
88+
}
89+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package it.renvins.serverpulse.bungeecord.commands;
2+
3+
import lombok.Getter;
4+
import net.md_5.bungee.api.CommandSender;
5+
6+
@Getter
7+
public abstract class GeneralCommand {
8+
9+
private final String permission;
10+
private final boolean isPlayerOnly;
11+
12+
public GeneralCommand(String permission, boolean isPlayerOnly) {
13+
this.permission = permission;
14+
this.isPlayerOnly = isPlayerOnly;
15+
}
16+
17+
public abstract void run(CommandSender sender, String[] args);
18+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package it.renvins.serverpulse.bungeecord.commands;
2+
3+
import it.renvins.serverpulse.common.utils.ChatUtils;
4+
import it.renvins.serverpulse.bungeecord.config.BungeeCordConfiguration;
5+
import net.md_5.bungee.api.CommandSender;
6+
import net.md_5.bungee.api.chat.TextComponent;
7+
8+
public class ReloadCommand extends GeneralCommand {
9+
10+
private final BungeeCordConfiguration config;
11+
12+
public ReloadCommand(String permission, boolean isPlayerOnly, BungeeCordConfiguration config) {
13+
super(permission, isPlayerOnly);
14+
this.config = config;
15+
}
16+
17+
@Override
18+
public void run(CommandSender sender, String[] args) {
19+
if (args.length > 0) {
20+
sender.sendMessage(new TextComponent(ChatUtils.format(config.getConfig().getString("messages.reloadConfigUsage"))));
21+
return;
22+
}
23+
if (!config.reload()) {
24+
sender.sendMessage(new TextComponent(ChatUtils.format(config.getConfig().getString("messages.reloadConfigError"))));
25+
} else {
26+
sender.sendMessage(new TextComponent(ChatUtils.format(config.getConfig().getString("messages.reloadConfig"))));
27+
}
28+
}
29+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package it.renvins.serverpulse.bungeecord.commands;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
import it.renvins.serverpulse.common.utils.ChatUtils;
7+
import it.renvins.serverpulse.bungeecord.config.BungeeCordConfiguration;
8+
import net.md_5.bungee.api.CommandSender;
9+
import net.md_5.bungee.api.chat.TextComponent;
10+
import net.md_5.bungee.api.connection.ProxiedPlayer;
11+
import net.md_5.bungee.api.plugin.Command;
12+
13+
public class ServerPulseCommand extends Command {
14+
15+
private final BungeeCordConfiguration config;
16+
private final Map<String, GeneralCommand> commands = new HashMap<>();
17+
18+
public ServerPulseCommand(BungeeCordConfiguration config) {
19+
super("serverpulsebungeecord", "serverpulse.use", "sp", "spb");
20+
this.config = config;
21+
registerCommands();
22+
}
23+
24+
@Override
25+
public void execute(CommandSender sender, String[] args) {
26+
if (args.length == 0) {
27+
sender.sendMessage(new TextComponent(ChatUtils.format(config.getConfig().getString("messages.noArgs"))));
28+
return;
29+
}
30+
String cmdName = args[0].toLowerCase();
31+
if (!commands.containsKey(cmdName)) {
32+
sender.sendMessage(new TextComponent(ChatUtils.format(config.getConfig().getString("messages.noCommand"))));
33+
return;
34+
}
35+
GeneralCommand cmd = commands.get(cmdName);
36+
if (!sender.hasPermission(cmd.getPermission())) {
37+
sender.sendMessage(new TextComponent(ChatUtils.format(config.getConfig().getString("messages.noPerms"))));
38+
return;
39+
}
40+
if (cmd.isPlayerOnly() && !(sender instanceof ProxiedPlayer)) {
41+
sender.sendMessage(new TextComponent(ChatUtils.format(config.getConfig().getString("messages.playerOnly"))));
42+
return;
43+
}
44+
if (args.length > 1) {
45+
String[] newArgs = new String[args.length - 1];
46+
System.arraycopy(args, 1, newArgs, 0, args.length - 1);
47+
cmd.run(sender, newArgs);
48+
} else {
49+
cmd.run(sender, new String[0]);
50+
}
51+
}
52+
53+
private void registerCommands() {
54+
commands.put("reload", new ReloadCommand("serverpulse.reload", false, config));
55+
commands.put("status", new StatusCommand("serverpulse.status", false, config));
56+
}
57+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package it.renvins.serverpulse.bungeecord.commands;
2+
3+
import it.renvins.serverpulse.api.ServerPulseProvider;
4+
import it.renvins.serverpulse.common.utils.ChatUtils;
5+
import it.renvins.serverpulse.bungeecord.config.BungeeCordConfiguration;
6+
import net.md_5.bungee.api.CommandSender;
7+
import net.md_5.bungee.api.chat.TextComponent;
8+
9+
public class StatusCommand extends GeneralCommand {
10+
11+
private final BungeeCordConfiguration config;
12+
13+
public StatusCommand(String permission, boolean isPlayerOnly, BungeeCordConfiguration config) {
14+
super(permission, isPlayerOnly);
15+
this.config = config;
16+
}
17+
18+
@Override
19+
public void run(CommandSender sender, String[] args) {
20+
if (args.length > 0) {
21+
sender.sendMessage(new TextComponent(ChatUtils.format(config.getConfig().getString("messages.statusConfigUsage"))));
22+
return;
23+
}
24+
sender.sendMessage(new TextComponent(ChatUtils.format(ServerPulseProvider.get().getDatabaseService().isConnected() ?
25+
config.getConfig().getString("messages.statusConnected") :
26+
config.getConfig().getString("messages.statusNotConnected"))));
27+
}
28+
}

0 commit comments

Comments
 (0)