diff --git a/api/pom.xml b/api/pom.xml index d3431afb..bcad7b4f 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -23,6 +23,13 @@ com.google.guava guava 13.0.1 + compile + + + org.yaml + snakeyaml + 1.11 + compile diff --git a/api/src/main/java/net/md_5/bungee/api/Callback.java b/api/src/main/java/net/md_5/bungee/api/Callback.java new file mode 100644 index 00000000..0cccc175 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/Callback.java @@ -0,0 +1,19 @@ +package net.md_5.bungee.api; + +/** + * Represents a method which may be called once a result has been computed + * asynchronously. + * + * @param the type of result + */ +public interface Callback +{ + + /** + * Called when the result is done. + * + * @param result the result of the computation + * @param error the error(s) that occurred, if any + */ + public void done(V result, Throwable error); +} diff --git a/api/src/main/java/net/md_5/bungee/api/ProxyConnection.java b/api/src/main/java/net/md_5/bungee/api/ProxyConnection.java index c6ba8bee..7ec64427 100644 --- a/api/src/main/java/net/md_5/bungee/api/ProxyConnection.java +++ b/api/src/main/java/net/md_5/bungee/api/ProxyConnection.java @@ -7,7 +7,8 @@ import java.net.InetSocketAddress; * It should expose information about the remote peer, however not be specific * to a type of connection, whether server or player. */ -public abstract class ProxyConnection { +public abstract class ProxyConnection +{ /** * Gets the remote address of this connection. diff --git a/api/src/main/java/net/md_5/bungee/api/ProxyServer.java b/api/src/main/java/net/md_5/bungee/api/ProxyServer.java index 423b868c..19f08dcc 100644 --- a/api/src/main/java/net/md_5/bungee/api/ProxyServer.java +++ b/api/src/main/java/net/md_5/bungee/api/ProxyServer.java @@ -3,15 +3,24 @@ package net.md_5.bungee.api; import net.md_5.bungee.api.plugin.PluginManager; import com.google.common.base.Preconditions; import java.util.Collection; +import java.util.logging.Logger; import lombok.Getter; -public abstract class ProxyServer { +public abstract class ProxyServer +{ @Getter private static ProxyServer instance; - public static void setInstance(ProxyServer instance) { - Preconditions.checkNotNull(instance, "Instance null"); + /** + * 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(instance == null, "Instance already set"); ProxyServer.instance = instance; } @@ -38,6 +47,14 @@ public abstract class ProxyServer { */ public abstract int playerCount(); + /** + * 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 currently networked connections to this proxy. * diff --git a/api/src/main/java/net/md_5/bungee/api/RemoteServer.java b/api/src/main/java/net/md_5/bungee/api/RemoteServer.java new file mode 100644 index 00000000..fe38d003 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/RemoteServer.java @@ -0,0 +1,32 @@ +package net.md_5.bungee.api; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * Represents a destination which this proxy might connect to. + */ +@RequiredArgsConstructor +public abstract class RemoteServer extends ProxyConnection +{ + + @Getter + private final String name; + + /** + * Send data by any available means to this server. + * + * @param channel the channel to send this data via + * @param data the data to send + */ + public abstract void sendData(String channel, byte[] data); + + /** + * Asynchronously gets the current player count on this server. + * + * TODO: Return all info available via the standard query protocol + * + * @param callback the callback to call when the count has been retrieved. + */ + public abstract void getPlayerCount(Callback callback); +} diff --git a/api/src/main/java/net/md_5/bungee/api/plugin/Cancellable.java b/api/src/main/java/net/md_5/bungee/api/plugin/Cancellable.java new file mode 100644 index 00000000..2b04a2b5 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/plugin/Cancellable.java @@ -0,0 +1,23 @@ +package net.md_5.bungee.api.plugin; + +/** + * Events that implement this indicate that they may be cancelled and thus + * prevented from happening. + */ +public interface Cancellable +{ + + /** + * Get whether or not this event is cancelled. + * + * @return the cancelled state of this event + */ + public boolean isCancelled(); + + /** + * Sets the cancelled state of this event. + * + * @param cancel the state to set + */ + public void setCancelled(boolean cancel); +} diff --git a/api/src/main/java/net/md_5/bungee/api/plugin/Event.java b/api/src/main/java/net/md_5/bungee/api/plugin/Event.java index 90db9139..c164343d 100644 --- a/api/src/main/java/net/md_5/bungee/api/plugin/Event.java +++ b/api/src/main/java/net/md_5/bungee/api/plugin/Event.java @@ -3,5 +3,6 @@ package net.md_5.bungee.api.plugin; /** * Dummy class which all callable events must extend. */ -public abstract class Event { +public abstract class Event +{ } diff --git a/api/src/main/java/net/md_5/bungee/api/plugin/Listener.java b/api/src/main/java/net/md_5/bungee/api/plugin/Listener.java index 4cfb17e8..31ed4eea 100644 --- a/api/src/main/java/net/md_5/bungee/api/plugin/Listener.java +++ b/api/src/main/java/net/md_5/bungee/api/plugin/Listener.java @@ -3,5 +3,6 @@ package net.md_5.bungee.api.plugin; /** * Dummy interface which all event subscribers and listeners must implement. */ -public interface Listener { +public interface Listener +{ } diff --git a/api/src/main/java/net/md_5/bungee/api/plugin/Plugin.java b/api/src/main/java/net/md_5/bungee/api/plugin/Plugin.java index e546aef3..a304b273 100644 --- a/api/src/main/java/net/md_5/bungee/api/plugin/Plugin.java +++ b/api/src/main/java/net/md_5/bungee/api/plugin/Plugin.java @@ -1,4 +1,33 @@ package net.md_5.bungee.api.plugin; -public class Plugin { +import java.util.logging.Logger; +import net.md_5.bungee.api.ProxyServer; + +/** + * Represents any Plugin that may be loaded at runtime to enhance existing + * functionality. + */ +public class Plugin +{ + + /** + * Called when this plugin is loaded. + */ + public void onLoad() + { + } + + /** + * Called when this plugin is enabled. + */ + public void onEnable() + { + } + + /** + * Called when this plugin is disabled. + */ + public void onDisable() + { + } } diff --git a/api/src/main/java/net/md_5/bungee/api/plugin/PluginDescription.java b/api/src/main/java/net/md_5/bungee/api/plugin/PluginDescription.java new file mode 100644 index 00000000..d9d9c6a0 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/plugin/PluginDescription.java @@ -0,0 +1,14 @@ +package net.md_5.bungee.api.plugin; + +import lombok.Data; + +@Data +public class PluginDescription +{ + + private final String name; + private final String main; + private final String version; + private final String author; + private final String id; +} diff --git a/api/src/main/java/net/md_5/bungee/api/plugin/PluginManager.java b/api/src/main/java/net/md_5/bungee/api/plugin/PluginManager.java index f4cdd054..8c0e24dc 100644 --- a/api/src/main/java/net/md_5/bungee/api/plugin/PluginManager.java +++ b/api/src/main/java/net/md_5/bungee/api/plugin/PluginManager.java @@ -1,7 +1,9 @@ package net.md_5.bungee.api.plugin; +import com.google.common.base.Preconditions; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; +import java.io.File; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -10,7 +12,8 @@ import java.util.Map; * Class to manage bridging between plugin duties and implementation duties, for * example event handling and plugin management. */ -public class PluginManager { +public class PluginManager +{ private final EventBus eventBus = new EventBus(); private final Map plugins = new HashMap<>(); @@ -20,10 +23,53 @@ public class PluginManager { * * @return the set of loaded plugins */ - public Collection getPlugins() { + public Collection getPlugins() + { return plugins.values(); } + /** + * Returns a loaded plugin identified by the specified name. + * + * @param name of the plugin to retrieve + * @return the retrieved plugin or null if not loaded + */ + public Plugin getPlugin(String name) + { + return plugins.get(name); + } + + /** + * Load a plugin from the specified file. This file must be in jar or zip + * format. + * + * @param file the file to load from + */ + public void load(File file) + { + Preconditions.checkNotNull(file, "file"); + Preconditions.checkArgument(file.isFile(), "Must load from file"); + } + + /** + * Load all plugins from the specified folder. + * + * @param folder the folder to search for plugins in + */ + public void loadAll(File folder) + { + Preconditions.checkNotNull(folder, "folder"); + Preconditions.checkArgument(folder.isDirectory(), "Must load from a directory"); + + for (File file : folder.listFiles()) + { + if (file.getName().endsWith(".jar")) + { + load(file); + } + } + } + /** * Dispatch an event to all subscribed listeners and return the event once * it has been handled by these listeners. @@ -32,7 +78,8 @@ public class PluginManager { * @param event the event to call * @return the called event */ - public T callEvent(T event) { + public T callEvent(T event) + { eventBus.post(event); return event; } @@ -44,7 +91,8 @@ public class PluginManager { * * @param listener the listener to register events for */ - public void registerListener(Listener listener) { + public void registerListener(Listener listener) + { eventBus.register(listener); } } diff --git a/proxy/pom.xml b/proxy/pom.xml index b059709c..02a137ce 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -39,11 +39,6 @@ bcprov-ext-jdk15on 1.47 - - org.yaml - snakeyaml - 1.11 -