package net.md_5.bungee.api; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.plugin.PluginManager; import com.google.common.base.Preconditions; import java.io.File; import java.net.InetSocketAddress; import java.util.Collection; import java.util.Map; import java.util.UUID; import java.util.logging.Logger; import lombok.Getter; import net.md_5.bungee.api.config.ConfigurationAdapter; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.scheduler.TaskScheduler; public abstract class ProxyServer { @Getter private static ProxyServer instance; /** * Sets the proxy instance. This method may only be called once per an * application. * * @param instance the new instance to set */ public static void setInstance(ProxyServer instance) { Preconditions.checkNotNull( instance, "instance" ); Preconditions.checkArgument( ProxyServer.instance == null, "Instance already set" ); ProxyServer.instance = instance; } /** * Gets the name of the currently running proxy software. * * @return the name of this instance */ public abstract String getName(); /** * Gets the version of the currently running proxy software. * * @return the version of this instance */ public abstract String getVersion(); /** * Gets a localized string from the .properties file. * * @return the localized string */ public abstract String getTranslation(String name, Object... args); /** * Gets the main logger which can be used as a suitable replacement for * {@link System#out} and {@link System#err}. * * @return the {@link Logger} instance */ public abstract Logger getLogger(); /** * Return all players currently connected. * * @return all connected players */ public abstract Collection<ProxiedPlayer> getPlayers(); /** * Gets a connected player via their unique username. * * @param name of the player * @return their player instance */ public abstract ProxiedPlayer getPlayer(String name); /** * Gets a connected player via their UUID * * @param uuid of the player * @return their player instance */ public abstract ProxiedPlayer getPlayer(UUID uuid); /** * Return all servers registered to this proxy, keyed by name. Unlike the * methods in {@link ConfigurationAdapter#getServers()}, this will not * return a fresh map each time. * * @return all registered remote server destinations */ public abstract Map<String, ServerInfo> getServers(); /** * Gets the server info of a server. * * @param name the name of the configured server * @return the server info belonging to the specified server */ public abstract ServerInfo getServerInfo(String name); /** * Get the {@link PluginManager} associated with loading plugins and * dispatching events. It is recommended that implementations use the * provided PluginManager class. * * @return the plugin manager */ public abstract PluginManager getPluginManager(); /** * Returns the currently in use configuration adapter. * * @return the used configuration adapter */ public abstract ConfigurationAdapter getConfigurationAdapter(); /** * Set the configuration adapter to be used. Must be called from * {@link Plugin#onLoad()}. * * @param adapter the adapter to use */ public abstract void setConfigurationAdapter(ConfigurationAdapter adapter); /** * Get the currently in use reconnect handler. * * @return the in use reconnect handler */ public abstract ReconnectHandler getReconnectHandler(); /** * Sets the reconnect handler to be used for subsequent connections. * * @param handler the new handler */ public abstract void setReconnectHandler(ReconnectHandler handler); /** * Gracefully mark this instance for shutdown. */ public abstract void stop(); /** * Gracefully mark this instance for shutdown. * * @param reason the reason for stopping. This will be shown to players. */ public abstract void stop(String reason); /** * Start this instance so that it may accept connections. * * @throws Exception any exception thrown during startup causing the * instance to fail to boot */ public abstract void start() throws Exception; /** * Register a channel for use with plugin messages. This is required by some * server / client implementations. * * @param channel the channel to register */ public abstract void registerChannel(String channel); /** * Unregister a previously registered channel. * * @param channel the channel to unregister */ public abstract void unregisterChannel(String channel); /** * Get an immutable set of all registered plugin channels. * * @return registered plugin channels */ public abstract Collection<String> getChannels(); /** * Get the Minecraft version supported by this proxy. * * @return the supported Minecraft version */ @Deprecated public abstract String getGameVersion(); /** * Get the Minecraft protocol version supported by this proxy. * * @return the Minecraft protocol version */ @Deprecated public abstract int getProtocolVersion(); /** * Factory method to construct an implementation specific server info * instance. * * @param name name of the server * @param address connectable Minecraft address + port of the server * @param motd the motd when used as a forced server * @param restricted whether the server info restricted property will be set * @return the constructed instance */ public abstract ServerInfo constructServerInfo(String name, InetSocketAddress address, String motd, boolean restricted); /** * Returns the console overlord for this proxy. Being the console, this * command server cannot have permissions or groups, and will be able to * execute anything. * * @return the console command sender of this proxy */ public abstract CommandSender getConsole(); /** * Return the folder used to load plugins from. * * @return the folder used to load plugin */ public abstract File getPluginsFolder(); /** * Get the scheduler instance for this proxy. * * @return the in use scheduler */ public abstract TaskScheduler getScheduler(); /** * Get the current number of connected users. The default implementation is * more efficient than {@link #getPlayers()} as it does not take a lock or * make a copy. * * @return the current number of connected players */ public abstract int getOnlineCount(); /** * Send the specified message to the console and all connected players. * * @param message the message to broadcast */ @Deprecated public abstract void broadcast(String message); /** * Send the specified message to the console and all connected players. * * @param message the message to broadcast */ public abstract void broadcast(BaseComponent... message); /** * Send the specified message to the console and all connected players. * * @param message the message to broadcast */ public abstract void broadcast(BaseComponent message); /** * Gets the commands which are disabled and will not be run on this proxy. * * @return the set of disabled commands */ public abstract Collection<String> getDisabledCommands(); /** * Gets BungeeCord's core config. * * @return the config. */ public abstract ProxyConfig getConfig(); /** * Attempts to match any players with the given name, and returns a list of * all possible matches. * * The exact algorithm to use to match players is implementation specific, * but in general you can expect this method to return player's whose names * begin with the specified prefix. * * @param match the (partial) name to match * @return list of all possible players, singleton if there is an exact * match */ public abstract Collection<ProxiedPlayer> matchPlayer(String match); /** * Creates a new empty title configuration. In most cases you will want to * {@link Title#reset()} the current title first so your title won't be * affected by a previous one. * * @return A new empty title configuration. * @see Title */ public abstract Title createTitle(); }