Skip to main content
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.
Server getServer()
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.
boolean isMaintenance()
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

Build docs developers (and LLMs) love