The ServerMaintenanceChangedEvent is a proxy-specific event that is fired whenever maintenance mode is enabled or disabled on an individual server behind a proxy (BungeeCord/Velocity).
This event is only available when using the Maintenance plugin on a proxy server (BungeeCord or Velocity). It is not available on standalone Spigot/Paper servers.
Event Details
Package: eu.kennytv.maintenance.api.event.proxy
Type: Notification event (read-only)
Available on: Proxy servers only (BungeeCord/Velocity)
Fired when:
- Maintenance mode is enabled on a specific backend server
- Maintenance mode is disabled on a specific backend server
- The
/maintenance <server> command is used to toggle server maintenance
Class Definition
public final class ServerMaintenanceChangedEvent implements MaintenanceEvent {
private final Server server;
private final boolean maintenance;
public ServerMaintenanceChangedEvent(final Server server, final boolean maintenance) {
this.server = server;
this.maintenance = maintenance;
}
public Server getServer() {
return server;
}
public boolean isMaintenance() {
return maintenance;
}
}
Methods
getServer()
Returns the wrapped server object for the server that changed maintenance status.
Returns: The Server wrapper object
The returned server does not necessarily have to be an existing/registered server. If maintenance is disabled on a previously registered server that no longer exists, this will still return a Server object. Use server.isRegisteredServer() to check if the server is currently registered under the proxy.
isMaintenance()
Returns whether maintenance mode has been enabled or disabled on the server.
Returns: true if maintenance has been enabled on the server, false if it has been disabled
Server Interface
The Server object provides the following methods:
public interface Server {
String getName();
boolean hasPlayers();
void broadcast(Component component);
boolean isRegisteredServer();
}
Usage Example
Basic Example
import eu.kennytv.maintenance.api.Maintenance;
import eu.kennytv.maintenance.api.MaintenanceProvider;
import eu.kennytv.maintenance.api.event.proxy.ServerMaintenanceChangedEvent;
import eu.kennytv.maintenance.api.event.manager.EventListener;
import eu.kennytv.maintenance.api.event.manager.EventManager;
import eu.kennytv.maintenance.api.proxy.Server;
public class MyProxyPlugin {
public void onEnable() {
Maintenance api = MaintenanceProvider.get();
EventManager eventManager = api.getEventManager();
eventManager.registerListener(new EventListener<ServerMaintenanceChangedEvent>() {
@Override
public void onEvent(ServerMaintenanceChangedEvent event) {
Server server = event.getServer();
String status = event.isMaintenance() ? "enabled" : "disabled";
System.out.println("Maintenance " + status + " on server: " + server.getName());
}
}, ServerMaintenanceChangedEvent.class);
}
}
Example: Broadcasting to Server Players
import eu.kennytv.maintenance.api.event.proxy.ServerMaintenanceChangedEvent;
import eu.kennytv.maintenance.api.event.manager.EventListener;
import eu.kennytv.maintenance.api.proxy.Server;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
public class ServerNotificationHandler {
public void register(EventManager eventManager) {
eventManager.registerListener(new EventListener<ServerMaintenanceChangedEvent>() {
@Override
public void onEvent(ServerMaintenanceChangedEvent event) {
Server server = event.getServer();
// Only send message if server is registered and has players
if (server.isRegisteredServer() && server.hasPlayers()) {
if (event.isMaintenance()) {
Component message = Component.text(
"This server is entering maintenance mode!",
NamedTextColor.RED
);
server.broadcast(message);
} else {
Component message = Component.text(
"Maintenance mode disabled on this server!",
NamedTextColor.GREEN
);
server.broadcast(message);
}
}
}
}, ServerMaintenanceChangedEvent.class);
}
}
Example: Discord Integration
import eu.kennytv.maintenance.api.event.proxy.ServerMaintenanceChangedEvent;
import eu.kennytv.maintenance.api.event.manager.EventListener;
import eu.kennytv.maintenance.api.proxy.Server;
public class DiscordServerNotifier {
private final DiscordWebhook webhook;
public DiscordServerNotifier(DiscordWebhook webhook) {
this.webhook = webhook;
}
public void register(EventManager eventManager) {
eventManager.registerListener(new EventListener<ServerMaintenanceChangedEvent>() {
@Override
public void onEvent(ServerMaintenanceChangedEvent event) {
Server server = event.getServer();
String serverName = server.getName();
if (event.isMaintenance()) {
webhook.send(
"🔧 **" + serverName + "** is now in maintenance mode",
DiscordWebhook.Color.ORANGE
);
} else {
webhook.send(
"✅ **" + serverName + "** maintenance complete - server online",
DiscordWebhook.Color.GREEN
);
}
}
}, ServerMaintenanceChangedEvent.class);
}
}
Example: Load Balancer Integration
import eu.kennytv.maintenance.api.event.proxy.ServerMaintenanceChangedEvent;
import eu.kennytv.maintenance.api.event.manager.EventListener;
import eu.kennytv.maintenance.api.proxy.Server;
public class LoadBalancerIntegration {
private final LoadBalancer loadBalancer;
public LoadBalancerIntegration(LoadBalancer loadBalancer) {
this.loadBalancer = loadBalancer;
}
public void register(EventManager eventManager) {
eventManager.registerListener(new EventListener<ServerMaintenanceChangedEvent>() {
@Override
public void onEvent(ServerMaintenanceChangedEvent event) {
Server server = event.getServer();
String serverName = server.getName();
// Skip if server is no longer registered
if (!server.isRegisteredServer()) {
loadBalancer.removeServer(serverName);
return;
}
if (event.isMaintenance()) {
// Remove server from load balancer rotation
loadBalancer.disableServer(serverName);
System.out.println("Removed " + serverName + " from load balancer");
} else {
// Add server back to load balancer rotation
loadBalancer.enableServer(serverName);
System.out.println("Added " + serverName + " to load balancer");
}
}
}, ServerMaintenanceChangedEvent.class);
}
}
Example: Metrics Tracking
import eu.kennytv.maintenance.api.event.proxy.ServerMaintenanceChangedEvent;
import eu.kennytv.maintenance.api.event.manager.EventListener;
import eu.kennytv.maintenance.api.proxy.Server;
import java.time.Instant;
public class MaintenanceMetrics {
private final MetricsCollector metrics;
public MaintenanceMetrics(MetricsCollector metrics) {
this.metrics = metrics;
}
public void register(EventManager eventManager) {
eventManager.registerListener(new EventListener<ServerMaintenanceChangedEvent>() {
@Override
public void onEvent(ServerMaintenanceChangedEvent event) {
Server server = event.getServer();
String serverName = server.getName();
if (event.isMaintenance()) {
// Record when maintenance started
metrics.recordEvent("maintenance_start", serverName, Instant.now());
metrics.incrementCounter("maintenance_activations", serverName);
} else {
// Record when maintenance ended
metrics.recordEvent("maintenance_end", serverName, Instant.now());
// Calculate and record maintenance duration
long duration = metrics.calculateDuration(serverName);
metrics.recordDuration("maintenance_duration", serverName, duration);
}
}
}, ServerMaintenanceChangedEvent.class);
}
}
See Also