From de6d78f0b38d3577a706aa9ca3d466403b527aa7 Mon Sep 17 00:00:00 2001 From: Dark Star Date: Mon, 20 Oct 2025 07:55:25 +0200 Subject: [PATCH 1/3] Update MOTDConfig.java Adding a Velocity feature to change the MOTD when all servers are offline --- .../xyz/jpenilla/minimotd/common/config/MOTDConfig.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/common/src/main/java/xyz/jpenilla/minimotd/common/config/MOTDConfig.java b/common/src/main/java/xyz/jpenilla/minimotd/common/config/MOTDConfig.java index a4f49688..2223a8db 100644 --- a/common/src/main/java/xyz/jpenilla/minimotd/common/config/MOTDConfig.java +++ b/common/src/main/java/xyz/jpenilla/minimotd/common/config/MOTDConfig.java @@ -59,6 +59,10 @@ public MOTDConfig(final @NonNull MOTD @NonNull ... defaults) { @Comment("Enable server list icon related features") private boolean iconEnabled = true; + @Comment("Enable offline MOTD when all servers are offline\n" + + "Requires offline-config.conf file to be present") + private boolean useOfflineMotd = false; + private PlayerCountSettings playerCountSettings = new PlayerCountSettings(); @ConfigSerializable @@ -215,4 +219,8 @@ private int calculateMaxPlayers(final int onlinePlayers, final int maxPlayers) { } return playerCount(online, max); } + + public boolean useOfflineMotd() { + return this.useOfflineMotd; + } } From 71132a7390e17e9a46ae55783831c82ba4b40e2f Mon Sep 17 00:00:00 2001 From: Dark Star Date: Mon, 20 Oct 2025 08:04:09 +0200 Subject: [PATCH 2/3] Update ConfigManager.java Adding a Velocity feature to change the MOTD when all servers are offline --- .../minimotd/common/config/ConfigManager.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/common/src/main/java/xyz/jpenilla/minimotd/common/config/ConfigManager.java b/common/src/main/java/xyz/jpenilla/minimotd/common/config/ConfigManager.java index 0b22d7b7..7e295731 100644 --- a/common/src/main/java/xyz/jpenilla/minimotd/common/config/ConfigManager.java +++ b/common/src/main/java/xyz/jpenilla/minimotd/common/config/ConfigManager.java @@ -54,6 +54,8 @@ public final class ConfigManager { private final Map extraConfigs = new HashMap<>(); + private @Nullable MOTDConfig offlineConfig = null; + public ConfigManager(final @NonNull MiniMOTD miniMOTD) { this.miniMOTD = miniMOTD; this.mainConfigLoader = new ConfigLoader<>( @@ -104,6 +106,9 @@ public void loadExtraConfigs() { this.extraConfigs.put(name, config); } } + + this.loadOfflineConfig(); + } catch (final IOException e) { throw new IllegalStateException("Failed to load virtual host configs", e); } @@ -165,4 +170,28 @@ private void createDefaultExtraConfigs(final @NonNull Path extraConfigsDir) thro return this.mainConfig(); } + public @Nullable MOTDConfig getOfflineConfig() { + return this.offlineConfig; + } + + private void loadOfflineConfig() { + final Path offlineConfigPath = this.miniMOTD.dataDirectory().resolve("offline-config.conf"); + if (Files.exists(offlineConfigPath)) { + try { + final ConfigLoader loader = new ConfigLoader<>( + MOTDConfig.class, + offlineConfigPath, + options -> options.header("MiniMOTD Offline Configuration") + ); + this.offlineConfig = loader.load(); + loader.save(this.offlineConfig); + this.miniMOTD.logger().info("Loaded offline MOTD configuration"); + } catch (final ConfigurateException e) { + this.miniMOTD.logger().error("Failed to load offline config", e); + this.offlineConfig = null; + } + } else { + this.offlineConfig = null; + } + } } From c4974900fef2e81a50332faf2cd9fe90f4e44655 Mon Sep 17 00:00:00 2001 From: darkstarworks Date: Mon, 20 Oct 2025 23:32:18 +0800 Subject: [PATCH 3/3] Update PingListener.java --- .../minimotd/velocity/PingListener.java | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/platform/velocity/src/main/java/xyz/jpenilla/minimotd/velocity/PingListener.java b/platform/velocity/src/main/java/xyz/jpenilla/minimotd/velocity/PingListener.java index a32f6188..b1417bdc 100644 --- a/platform/velocity/src/main/java/xyz/jpenilla/minimotd/velocity/PingListener.java +++ b/platform/velocity/src/main/java/xyz/jpenilla/minimotd/velocity/PingListener.java @@ -60,27 +60,49 @@ public EventTask onProxyPingEvent(final ProxyPingEvent event) { private void handle(final ProxyPingEvent event) { final MOTDConfig config = this.miniMOTD.configManager().resolveConfig(event.getConnection().getVirtualHost().orElse(null)); final ServerPing.Builder pong = event.getPing().asBuilder(); - final List targetServers = config.targetServers(); + int playersCount = 0; + boolean allServersOffline = false; if (targetServers.isEmpty()) { playersCount = pong.getOnlinePlayers(); + // See if all servers offline when no targets are specified + allServersOffline = this.proxy.getAllServers().stream() + .allMatch(server -> server.getPlayersConnected().isEmpty()); } else { final Set players = new HashSet<>(); + int onlineServerCount = 0; for (final String serverName : targetServers) { final @Nullable RegisteredServer server = this.proxy.getServer(serverName).orElse(null); if (server != null) { - playersCount += server.getPlayersConnected().size(); + final int serverPlayers = server.getPlayersConnected().size(); + if (serverPlayers > 0) { + onlineServerCount++; + } + playersCount += serverPlayers; players.addAll(server.getPlayersConnected().stream() .map(p -> new ServerPing.SamplePlayer(p.getGameProfile().getName(), p.getUniqueId())) .collect(Collectors.toList())); } } + // All servers offline if 0 players and 0 online servers + allServersOffline = (onlineServerCount == 0 && playersCount == 0); pong.clearSamplePlayers(); pong.samplePlayers(players.toArray(new ServerPing.SamplePlayer[0])); } - final PingResponse response = this.miniMOTD.createMOTD(config, playersCount, pong.getMaximumPlayers()); + // Use offline config if true and all servers are offline + final MOTDConfig activeConfig; + + if (allServersOffline && config.useOfflineMotd()) { + // Try for offline-specific config + final @Nullable MOTDConfig offlineConfig = this.miniMOTD.configManager().getOfflineConfig(); + activeConfig = offlineConfig != null ? offlineConfig : config; + } else { + activeConfig = config; + } + + final PingResponse response = this.miniMOTD.createMOTD(activeConfig, playersCount, pong.getMaximumPlayers()); response.icon(pong::favicon); response.motd(pong::description); response.playerCount().applyCount(pong::onlinePlayers, pong::maximumPlayers); @@ -94,4 +116,4 @@ private void handle(final ProxyPingEvent event) { event.setPing(pong.build()); } -} +} \ No newline at end of file