More work on the API: Up next, command senders.

This commit is contained in:
md_5 2013-01-10 19:54:12 +11:00
parent e3664cb654
commit 9196f8f61e
12 changed files with 203 additions and 16 deletions

View File

@ -23,6 +23,13 @@
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>13.0.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.11</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@ -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 <V> the type of result
*/
public interface Callback<V>
{
/**
* 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);
}

View File

@ -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.

View File

@ -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.
*

View File

@ -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<Integer> callback);
}

View File

@ -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);
}

View File

@ -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
{
}

View File

@ -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
{
}

View File

@ -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()
{
}
}

View File

@ -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;
}

View File

@ -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<String, Plugin> plugins = new HashMap<>();
@ -20,10 +23,53 @@ public class PluginManager {
*
* @return the set of loaded plugins
*/
public Collection<Plugin> getPlugins() {
public Collection<Plugin> 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 extends Event> T callEvent(T event) {
public <T extends Event> 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);
}
}

View File

@ -39,11 +39,6 @@
<artifactId>bcprov-ext-jdk15on</artifactId>
<version>1.47</version>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.11</version>
</dependency>
</dependencies>
<build>