From 08801f5d03b7f26784d69bad703d9474817c84b4 Mon Sep 17 00:00:00 2001 From: md_5 Date: Thu, 10 Jan 2013 11:45:58 +1100 Subject: [PATCH 01/45] Add Travis so dud PRs don't get merged. --- .travis.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..7ef0f11b --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +language: java +jdk: + - openjdk7 +notifications: + email: false From 91ac250d359c3ed5989d42be9d2ee1a1bf1c5347 Mon Sep 17 00:00:00 2001 From: KaneFreeman Date: Wed, 9 Jan 2013 08:48:20 -0500 Subject: [PATCH 02/45] Adding support for plugin packet broadcasting. --- src/main/java/net/md_5/bungee/BungeeCord.java | 58 ++++++++++++++++++- .../java/net/md_5/bungee/UserConnection.java | 15 +++++ 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/md_5/bungee/BungeeCord.java b/src/main/java/net/md_5/bungee/BungeeCord.java index bcb93bfc..b1f29aca 100644 --- a/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/src/main/java/net/md_5/bungee/BungeeCord.java @@ -7,6 +7,7 @@ import java.net.InetSocketAddress; import java.net.Socket; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; @@ -70,6 +71,7 @@ public class BungeeCord * Fully qualified connections. */ public Map connections = new ConcurrentHashMap<>(); + public Map> connectionsByServer = new ConcurrentHashMap<>(); /** * Registered commands. */ @@ -89,7 +91,7 @@ public class BungeeCord { - commandMap.put("greload",new CommandReload()); + commandMap.put("greload", new CommandReload()); commandMap.put("end", new CommandEnd()); commandMap.put("glist", new CommandList()); commandMap.put("server", new CommandServer()); @@ -270,6 +272,60 @@ public class BungeeCord } } + /** + * Broadcasts a plugin message to all servers with currently connected + * players. + * + * @param channel name + * @param message to send + */ + public void broadcastPluginMessage(String channel, String message) + { + broadcastPluginMessage(channel, message, null); + } + + /** + * Broadcasts a plugin message to all servers with currently connected + * players. + * + * @param channel name + * @param message to send + * @param server the message was sent from originally + */ + public void broadcastPluginMessage(String channel, String message, String sourceServer) + { + for (String server : connectionsByServer.keySet()) + { + if (sourceServer == null || !sourceServer.equals(server)) + { + List conns = BungeeCord.instance.connectionsByServer.get(server); + if (conns != null && conns.size() > 0) + { + UserConnection user = conns.get(0); + user.sendPluginMessage(channel, message.getBytes()); + } + } + } + } + + /** + * Send a plugin message to a specific server if it has currently connected + * players. + * + * @param channel name + * @param message to send + * @param server the message is to be sent to + */ + public void sendPluginMessage(String channel, String message, String targetServer) + { + List conns = BungeeCord.instance.connectionsByServer.get(targetServer); + if (conns != null && conns.size() > 0) + { + UserConnection user = conns.get(0); + user.sendPluginMessage(channel, message.getBytes()); + } + } + /** * Register a plugin channel for all users * diff --git a/src/main/java/net/md_5/bungee/UserConnection.java b/src/main/java/net/md_5/bungee/UserConnection.java index e6177578..dfe23c3e 100644 --- a/src/main/java/net/md_5/bungee/UserConnection.java +++ b/src/main/java/net/md_5/bungee/UserConnection.java @@ -116,6 +116,13 @@ public class UserConnection extends GenericConnection implements CommandSender reconnecting = false; downBridge = new DownstreamBridge(); server = newServer; + List conns = BungeeCord.instance.connectionsByServer.get(server.name); + if (conns == null) + { + conns = new ArrayList<>(); + BungeeCord.instance.connectionsByServer.put(server.name, conns); + } + conns.add(this); downBridge.start(); } catch (KickException ex) { @@ -153,6 +160,14 @@ public class UserConnection extends GenericConnection implements CommandSender if (BungeeCord.instance.isRunning) { BungeeCord.instance.connections.remove(username); + if (server != null) + { + List conns = BungeeCord.instance.connectionsByServer.get(server.name); + if (conns != null) + { + conns.remove(this); + } + } } disconnect(reason); if (server != null) From 90e1bc6dd8185e42568e28fc328e61c450969336 Mon Sep 17 00:00:00 2001 From: md_5 Date: Thu, 10 Jan 2013 14:49:59 +1100 Subject: [PATCH 03/45] Add Bungee command. --- src/main/java/net/md_5/bungee/BungeeCord.java | 3 ++- .../net/md_5/bungee/command/CommandBungee.java | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/md_5/bungee/command/CommandBungee.java diff --git a/src/main/java/net/md_5/bungee/BungeeCord.java b/src/main/java/net/md_5/bungee/BungeeCord.java index b1f29aca..b25ef180 100644 --- a/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/src/main/java/net/md_5/bungee/BungeeCord.java @@ -66,7 +66,7 @@ public class BungeeCord /** * Current version. */ - public String version = (getClass().getPackage().getImplementationVersion() == null) ? "unknown" : getClass().getPackage().getImplementationVersion(); + public static String version = (BungeeCord.class.getPackage().getImplementationVersion() == null) ? "unknown" : BungeeCord.class.getPackage().getImplementationVersion(); /** * Fully qualified connections. */ @@ -98,6 +98,7 @@ public class BungeeCord commandMap.put("ip", new CommandIP()); commandMap.put("alert", new CommandAlert()); commandMap.put("motd", new CommandMotd()); + commandMap.put("bungee", new CommandBungee()); } /** diff --git a/src/main/java/net/md_5/bungee/command/CommandBungee.java b/src/main/java/net/md_5/bungee/command/CommandBungee.java new file mode 100644 index 00000000..8ea902df --- /dev/null +++ b/src/main/java/net/md_5/bungee/command/CommandBungee.java @@ -0,0 +1,15 @@ +package net.md_5.bungee.command; + +import net.md_5.bungee.BungeeCord; +import net.md_5.bungee.ChatColor; + +public class CommandBungee extends Command +{ + + @Override + public void execute(CommandSender sender, String[] args) + { + sender.sendMessage(ChatColor.BLUE + "This server is running BungeeCord version " + BungeeCord.version + " by md_5"); + sender.sendMessage(ChatColor.BLUE + "Your current permission level is " + getPermission(sender).name()); + } +} From addf81f92aacad0b66e42c2d30cc84035f7fa06b Mon Sep 17 00:00:00 2001 From: KaneFreeman Date: Wed, 9 Jan 2013 23:23:24 -0500 Subject: [PATCH 04/45] Properly remove UserConnection from server's list Previous version did not properly remove a UserConnection from the server's list when they change servers. This version also prevent duplicates from being placed in a server's list. --- src/main/java/net/md_5/bungee/UserConnection.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/md_5/bungee/UserConnection.java b/src/main/java/net/md_5/bungee/UserConnection.java index dfe23c3e..c09e57ad 100644 --- a/src/main/java/net/md_5/bungee/UserConnection.java +++ b/src/main/java/net/md_5/bungee/UserConnection.java @@ -115,6 +115,14 @@ public class UserConnection extends GenericConnection implements CommandSender } reconnecting = false; downBridge = new DownstreamBridge(); + if (server != null) + { + List conns = BungeeCord.instance.connectionsByServer.get(server.name); + if (conns != null) + { + conns.remove(this); + } + } server = newServer; List conns = BungeeCord.instance.connectionsByServer.get(server.name); if (conns == null) @@ -122,7 +130,10 @@ public class UserConnection extends GenericConnection implements CommandSender conns = new ArrayList<>(); BungeeCord.instance.connectionsByServer.put(server.name, conns); } - conns.add(this); + if (!conns.contains(this)) + { + conns.add(this); + } downBridge.start(); } catch (KickException ex) { From a7f7a49fc3940e0a82e632f4e643b09f9a6b79f6 Mon Sep 17 00:00:00 2001 From: md_5 Date: Thu, 10 Jan 2013 17:41:37 +1100 Subject: [PATCH 05/45] Refactor into maven modules. --- pom.xml | 72 ++------------ proxy/nb-configuration.xml | 18 ++++ proxy/pom.xml | 98 +++++++++++++++++++ .../main/java/net/md_5/bungee/BungeeCord.java | 0 .../main/java/net/md_5/bungee/ChatColor.java | 0 .../java/net/md_5/bungee/Configuration.java | 0 .../java/net/md_5/bungee/EncryptionUtil.java | 0 .../main/java/net/md_5/bungee/EntityMap.java | 0 .../net/md_5/bungee/GenericConnection.java | 0 .../java/net/md_5/bungee/InitialHandler.java | 0 .../java/net/md_5/bungee/KickException.java | 0 .../java/net/md_5/bungee/ListenThread.java | 0 .../main/java/net/md_5/bungee/Logger.java | 0 .../main/java/net/md_5/bungee/Metrics.java | 0 .../main/java/net/md_5/bungee/Permission.java | 0 .../net/md_5/bungee/ReconnectSaveThread.java | 0 .../net/md_5/bungee/ServerConnection.java | 0 .../java/net/md_5/bungee/UserConnection.java | 0 .../src}/main/java/net/md_5/bungee/Util.java | 0 .../java/net/md_5/bungee/command/Command.java | 0 .../net/md_5/bungee/command/CommandAlert.java | 0 .../md_5/bungee/command/CommandBungee.java | 0 .../net/md_5/bungee/command/CommandEnd.java | 0 .../net/md_5/bungee/command/CommandIP.java | 0 .../net/md_5/bungee/command/CommandList.java | 0 .../net/md_5/bungee/command/CommandMotd.java | 0 .../md_5/bungee/command/CommandReload.java | 0 .../md_5/bungee/command/CommandSender.java | 0 .../md_5/bungee/command/CommandServer.java | 0 .../bungee/command/ConsoleCommandSender.java | 0 .../net/md_5/bungee/packet/DefinedPacket.java | 0 .../md_5/bungee/packet/Packet0KeepAlive.java | 0 .../net/md_5/bungee/packet/Packet1Login.java | 0 .../md_5/bungee/packet/Packet2Handshake.java | 0 .../net/md_5/bungee/packet/Packet3Chat.java | 0 .../md_5/bungee/packet/Packet9Respawn.java | 0 .../bungee/packet/PacketC9PlayerListItem.java | 0 .../bungee/packet/PacketCDClientStatus.java | 0 .../bungee/packet/PacketFAPluginMessage.java | 0 .../packet/PacketFCEncryptionResponse.java | 0 .../packet/PacketFDEncryptionRequest.java | 0 .../net/md_5/bungee/packet/PacketFFKick.java | 0 .../md_5/bungee/packet/PacketInputStream.java | 0 .../net/md_5/bungee/plugin/Cancellable.java | 0 .../net/md_5/bungee/plugin/ChatEvent.java | 0 .../bungee/plugin/InvalidPluginException.java | 0 .../net/md_5/bungee/plugin/JavaPlugin.java | 0 .../md_5/bungee/plugin/JavaPluginManager.java | 0 .../net/md_5/bungee/plugin/LoginEvent.java | 0 .../md_5/bungee/plugin/PluginDescription.java | 0 .../bungee/plugin/PluginMessageEvent.java | 0 .../bungee/plugin/ServerConnectEvent.java | 0 .../bungee/tablist/GlobalPingTabList.java | 0 .../md_5/bungee/tablist/GlobalTabList.java | 0 .../bungee/tablist/ServerUniqueTabList.java | 0 .../md_5/bungee/tablist/TabListHandler.java | 0 56 files changed, 122 insertions(+), 66 deletions(-) create mode 100644 proxy/nb-configuration.xml create mode 100644 proxy/pom.xml rename {src => proxy/src}/main/java/net/md_5/bungee/BungeeCord.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/ChatColor.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/Configuration.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/EncryptionUtil.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/EntityMap.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/GenericConnection.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/InitialHandler.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/KickException.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/ListenThread.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/Logger.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/Metrics.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/Permission.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/ReconnectSaveThread.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/ServerConnection.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/UserConnection.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/Util.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/command/Command.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/command/CommandAlert.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/command/CommandBungee.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/command/CommandEnd.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/command/CommandIP.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/command/CommandList.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/command/CommandMotd.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/command/CommandReload.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/command/CommandSender.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/command/CommandServer.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/command/ConsoleCommandSender.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/packet/DefinedPacket.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/packet/Packet0KeepAlive.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/packet/Packet1Login.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/packet/Packet2Handshake.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/packet/Packet3Chat.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/packet/Packet9Respawn.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/packet/PacketC9PlayerListItem.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/packet/PacketCDClientStatus.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/packet/PacketFAPluginMessage.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/packet/PacketFCEncryptionResponse.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/packet/PacketFDEncryptionRequest.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/packet/PacketFFKick.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/packet/PacketInputStream.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/plugin/Cancellable.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/plugin/ChatEvent.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/plugin/InvalidPluginException.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/plugin/JavaPlugin.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/plugin/JavaPluginManager.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/plugin/LoginEvent.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/plugin/PluginDescription.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/plugin/PluginMessageEvent.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/plugin/ServerConnectEvent.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/tablist/GlobalTabList.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java (100%) rename {src => proxy/src}/main/java/net/md_5/bungee/tablist/TabListHandler.java (100%) diff --git a/pom.xml b/pom.xml index bcd47e5a..8463a12c 100644 --- a/pom.xml +++ b/pom.xml @@ -10,9 +10,9 @@ net.md-5 - bungeecord + bungeecord-parent 1.0-SNAPSHOT - jar + pom BungeeCord Proxy component of the Elastic Portal Suite @@ -36,6 +36,10 @@ + + proxy + + scm:git:git@github.com:ElasticPortalSuite/BungeeCord.git scm:git:git@github.com:ElasticPortalSuite/BungeeCord.git @@ -57,31 +61,6 @@ - - com.google.code.findbugs - jsr305 - 2.0.1 - - - com.google.guava - guava - 13.0.1 - - - net.md-5 - mendax - 1.4.6-SNAPSHOT - - - org.bouncycastle - bcprov-ext-jdk15on - 1.47 - - - org.yaml - snakeyaml - 1.11 - org.projectlombok lombok @@ -119,45 +98,6 @@ 1.7 - - org.apache.maven.plugins - maven-jar-plugin - 2.4 - - - - ${main.class} - ${describe} - - - - - - org.apache.maven.plugins - maven-shade-plugin - 2.0 - - - package - - shade - - - - - - - *:* - - **/*.java - **/*.properties - **/*.SF - **/*.DSA - - - - - com.github.wvengen proguard-maven-plugin diff --git a/proxy/nb-configuration.xml b/proxy/nb-configuration.xml new file mode 100644 index 00000000..c2decf16 --- /dev/null +++ b/proxy/nb-configuration.xml @@ -0,0 +1,18 @@ + + + + + + JDK_1.7 + + diff --git a/proxy/pom.xml b/proxy/pom.xml new file mode 100644 index 00000000..d36cbbb3 --- /dev/null +++ b/proxy/pom.xml @@ -0,0 +1,98 @@ + + + 4.0.0 + + + net.md-5 + bungeecord-parent + 1.0-SNAPSHOT + ../pom.xml + + + net.md-5 + bungeecord-proxy + 1.0-SNAPSHOT + jar + + BungeeCord + Proxy component of the Elastic Portal Suite + + + + com.google.code.findbugs + jsr305 + 2.0.1 + + + com.google.guava + guava + 13.0.1 + + + net.md-5 + mendax + 1.4.6-SNAPSHOT + + + org.bouncycastle + bcprov-ext-jdk15on + 1.47 + + + org.yaml + snakeyaml + 1.11 + + + org.projectlombok + lombok + 0.11.6 + provided + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + + net.md_5.bungee.BungeeCord + ${describe} + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.0 + + + package + + shade + + + + + + + *:* + + **/*.java + **/*.properties + **/*.SF + **/*.DSA + + + + + + + + diff --git a/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java similarity index 100% rename from src/main/java/net/md_5/bungee/BungeeCord.java rename to proxy/src/main/java/net/md_5/bungee/BungeeCord.java diff --git a/src/main/java/net/md_5/bungee/ChatColor.java b/proxy/src/main/java/net/md_5/bungee/ChatColor.java similarity index 100% rename from src/main/java/net/md_5/bungee/ChatColor.java rename to proxy/src/main/java/net/md_5/bungee/ChatColor.java diff --git a/src/main/java/net/md_5/bungee/Configuration.java b/proxy/src/main/java/net/md_5/bungee/Configuration.java similarity index 100% rename from src/main/java/net/md_5/bungee/Configuration.java rename to proxy/src/main/java/net/md_5/bungee/Configuration.java diff --git a/src/main/java/net/md_5/bungee/EncryptionUtil.java b/proxy/src/main/java/net/md_5/bungee/EncryptionUtil.java similarity index 100% rename from src/main/java/net/md_5/bungee/EncryptionUtil.java rename to proxy/src/main/java/net/md_5/bungee/EncryptionUtil.java diff --git a/src/main/java/net/md_5/bungee/EntityMap.java b/proxy/src/main/java/net/md_5/bungee/EntityMap.java similarity index 100% rename from src/main/java/net/md_5/bungee/EntityMap.java rename to proxy/src/main/java/net/md_5/bungee/EntityMap.java diff --git a/src/main/java/net/md_5/bungee/GenericConnection.java b/proxy/src/main/java/net/md_5/bungee/GenericConnection.java similarity index 100% rename from src/main/java/net/md_5/bungee/GenericConnection.java rename to proxy/src/main/java/net/md_5/bungee/GenericConnection.java diff --git a/src/main/java/net/md_5/bungee/InitialHandler.java b/proxy/src/main/java/net/md_5/bungee/InitialHandler.java similarity index 100% rename from src/main/java/net/md_5/bungee/InitialHandler.java rename to proxy/src/main/java/net/md_5/bungee/InitialHandler.java diff --git a/src/main/java/net/md_5/bungee/KickException.java b/proxy/src/main/java/net/md_5/bungee/KickException.java similarity index 100% rename from src/main/java/net/md_5/bungee/KickException.java rename to proxy/src/main/java/net/md_5/bungee/KickException.java diff --git a/src/main/java/net/md_5/bungee/ListenThread.java b/proxy/src/main/java/net/md_5/bungee/ListenThread.java similarity index 100% rename from src/main/java/net/md_5/bungee/ListenThread.java rename to proxy/src/main/java/net/md_5/bungee/ListenThread.java diff --git a/src/main/java/net/md_5/bungee/Logger.java b/proxy/src/main/java/net/md_5/bungee/Logger.java similarity index 100% rename from src/main/java/net/md_5/bungee/Logger.java rename to proxy/src/main/java/net/md_5/bungee/Logger.java diff --git a/src/main/java/net/md_5/bungee/Metrics.java b/proxy/src/main/java/net/md_5/bungee/Metrics.java similarity index 100% rename from src/main/java/net/md_5/bungee/Metrics.java rename to proxy/src/main/java/net/md_5/bungee/Metrics.java diff --git a/src/main/java/net/md_5/bungee/Permission.java b/proxy/src/main/java/net/md_5/bungee/Permission.java similarity index 100% rename from src/main/java/net/md_5/bungee/Permission.java rename to proxy/src/main/java/net/md_5/bungee/Permission.java diff --git a/src/main/java/net/md_5/bungee/ReconnectSaveThread.java b/proxy/src/main/java/net/md_5/bungee/ReconnectSaveThread.java similarity index 100% rename from src/main/java/net/md_5/bungee/ReconnectSaveThread.java rename to proxy/src/main/java/net/md_5/bungee/ReconnectSaveThread.java diff --git a/src/main/java/net/md_5/bungee/ServerConnection.java b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java similarity index 100% rename from src/main/java/net/md_5/bungee/ServerConnection.java rename to proxy/src/main/java/net/md_5/bungee/ServerConnection.java diff --git a/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java similarity index 100% rename from src/main/java/net/md_5/bungee/UserConnection.java rename to proxy/src/main/java/net/md_5/bungee/UserConnection.java diff --git a/src/main/java/net/md_5/bungee/Util.java b/proxy/src/main/java/net/md_5/bungee/Util.java similarity index 100% rename from src/main/java/net/md_5/bungee/Util.java rename to proxy/src/main/java/net/md_5/bungee/Util.java diff --git a/src/main/java/net/md_5/bungee/command/Command.java b/proxy/src/main/java/net/md_5/bungee/command/Command.java similarity index 100% rename from src/main/java/net/md_5/bungee/command/Command.java rename to proxy/src/main/java/net/md_5/bungee/command/Command.java diff --git a/src/main/java/net/md_5/bungee/command/CommandAlert.java b/proxy/src/main/java/net/md_5/bungee/command/CommandAlert.java similarity index 100% rename from src/main/java/net/md_5/bungee/command/CommandAlert.java rename to proxy/src/main/java/net/md_5/bungee/command/CommandAlert.java diff --git a/src/main/java/net/md_5/bungee/command/CommandBungee.java b/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java similarity index 100% rename from src/main/java/net/md_5/bungee/command/CommandBungee.java rename to proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java diff --git a/src/main/java/net/md_5/bungee/command/CommandEnd.java b/proxy/src/main/java/net/md_5/bungee/command/CommandEnd.java similarity index 100% rename from src/main/java/net/md_5/bungee/command/CommandEnd.java rename to proxy/src/main/java/net/md_5/bungee/command/CommandEnd.java diff --git a/src/main/java/net/md_5/bungee/command/CommandIP.java b/proxy/src/main/java/net/md_5/bungee/command/CommandIP.java similarity index 100% rename from src/main/java/net/md_5/bungee/command/CommandIP.java rename to proxy/src/main/java/net/md_5/bungee/command/CommandIP.java diff --git a/src/main/java/net/md_5/bungee/command/CommandList.java b/proxy/src/main/java/net/md_5/bungee/command/CommandList.java similarity index 100% rename from src/main/java/net/md_5/bungee/command/CommandList.java rename to proxy/src/main/java/net/md_5/bungee/command/CommandList.java diff --git a/src/main/java/net/md_5/bungee/command/CommandMotd.java b/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java similarity index 100% rename from src/main/java/net/md_5/bungee/command/CommandMotd.java rename to proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java diff --git a/src/main/java/net/md_5/bungee/command/CommandReload.java b/proxy/src/main/java/net/md_5/bungee/command/CommandReload.java similarity index 100% rename from src/main/java/net/md_5/bungee/command/CommandReload.java rename to proxy/src/main/java/net/md_5/bungee/command/CommandReload.java diff --git a/src/main/java/net/md_5/bungee/command/CommandSender.java b/proxy/src/main/java/net/md_5/bungee/command/CommandSender.java similarity index 100% rename from src/main/java/net/md_5/bungee/command/CommandSender.java rename to proxy/src/main/java/net/md_5/bungee/command/CommandSender.java diff --git a/src/main/java/net/md_5/bungee/command/CommandServer.java b/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java similarity index 100% rename from src/main/java/net/md_5/bungee/command/CommandServer.java rename to proxy/src/main/java/net/md_5/bungee/command/CommandServer.java diff --git a/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java b/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java similarity index 100% rename from src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java rename to proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java diff --git a/src/main/java/net/md_5/bungee/packet/DefinedPacket.java b/proxy/src/main/java/net/md_5/bungee/packet/DefinedPacket.java similarity index 100% rename from src/main/java/net/md_5/bungee/packet/DefinedPacket.java rename to proxy/src/main/java/net/md_5/bungee/packet/DefinedPacket.java diff --git a/src/main/java/net/md_5/bungee/packet/Packet0KeepAlive.java b/proxy/src/main/java/net/md_5/bungee/packet/Packet0KeepAlive.java similarity index 100% rename from src/main/java/net/md_5/bungee/packet/Packet0KeepAlive.java rename to proxy/src/main/java/net/md_5/bungee/packet/Packet0KeepAlive.java diff --git a/src/main/java/net/md_5/bungee/packet/Packet1Login.java b/proxy/src/main/java/net/md_5/bungee/packet/Packet1Login.java similarity index 100% rename from src/main/java/net/md_5/bungee/packet/Packet1Login.java rename to proxy/src/main/java/net/md_5/bungee/packet/Packet1Login.java diff --git a/src/main/java/net/md_5/bungee/packet/Packet2Handshake.java b/proxy/src/main/java/net/md_5/bungee/packet/Packet2Handshake.java similarity index 100% rename from src/main/java/net/md_5/bungee/packet/Packet2Handshake.java rename to proxy/src/main/java/net/md_5/bungee/packet/Packet2Handshake.java diff --git a/src/main/java/net/md_5/bungee/packet/Packet3Chat.java b/proxy/src/main/java/net/md_5/bungee/packet/Packet3Chat.java similarity index 100% rename from src/main/java/net/md_5/bungee/packet/Packet3Chat.java rename to proxy/src/main/java/net/md_5/bungee/packet/Packet3Chat.java diff --git a/src/main/java/net/md_5/bungee/packet/Packet9Respawn.java b/proxy/src/main/java/net/md_5/bungee/packet/Packet9Respawn.java similarity index 100% rename from src/main/java/net/md_5/bungee/packet/Packet9Respawn.java rename to proxy/src/main/java/net/md_5/bungee/packet/Packet9Respawn.java diff --git a/src/main/java/net/md_5/bungee/packet/PacketC9PlayerListItem.java b/proxy/src/main/java/net/md_5/bungee/packet/PacketC9PlayerListItem.java similarity index 100% rename from src/main/java/net/md_5/bungee/packet/PacketC9PlayerListItem.java rename to proxy/src/main/java/net/md_5/bungee/packet/PacketC9PlayerListItem.java diff --git a/src/main/java/net/md_5/bungee/packet/PacketCDClientStatus.java b/proxy/src/main/java/net/md_5/bungee/packet/PacketCDClientStatus.java similarity index 100% rename from src/main/java/net/md_5/bungee/packet/PacketCDClientStatus.java rename to proxy/src/main/java/net/md_5/bungee/packet/PacketCDClientStatus.java diff --git a/src/main/java/net/md_5/bungee/packet/PacketFAPluginMessage.java b/proxy/src/main/java/net/md_5/bungee/packet/PacketFAPluginMessage.java similarity index 100% rename from src/main/java/net/md_5/bungee/packet/PacketFAPluginMessage.java rename to proxy/src/main/java/net/md_5/bungee/packet/PacketFAPluginMessage.java diff --git a/src/main/java/net/md_5/bungee/packet/PacketFCEncryptionResponse.java b/proxy/src/main/java/net/md_5/bungee/packet/PacketFCEncryptionResponse.java similarity index 100% rename from src/main/java/net/md_5/bungee/packet/PacketFCEncryptionResponse.java rename to proxy/src/main/java/net/md_5/bungee/packet/PacketFCEncryptionResponse.java diff --git a/src/main/java/net/md_5/bungee/packet/PacketFDEncryptionRequest.java b/proxy/src/main/java/net/md_5/bungee/packet/PacketFDEncryptionRequest.java similarity index 100% rename from src/main/java/net/md_5/bungee/packet/PacketFDEncryptionRequest.java rename to proxy/src/main/java/net/md_5/bungee/packet/PacketFDEncryptionRequest.java diff --git a/src/main/java/net/md_5/bungee/packet/PacketFFKick.java b/proxy/src/main/java/net/md_5/bungee/packet/PacketFFKick.java similarity index 100% rename from src/main/java/net/md_5/bungee/packet/PacketFFKick.java rename to proxy/src/main/java/net/md_5/bungee/packet/PacketFFKick.java diff --git a/src/main/java/net/md_5/bungee/packet/PacketInputStream.java b/proxy/src/main/java/net/md_5/bungee/packet/PacketInputStream.java similarity index 100% rename from src/main/java/net/md_5/bungee/packet/PacketInputStream.java rename to proxy/src/main/java/net/md_5/bungee/packet/PacketInputStream.java diff --git a/src/main/java/net/md_5/bungee/plugin/Cancellable.java b/proxy/src/main/java/net/md_5/bungee/plugin/Cancellable.java similarity index 100% rename from src/main/java/net/md_5/bungee/plugin/Cancellable.java rename to proxy/src/main/java/net/md_5/bungee/plugin/Cancellable.java diff --git a/src/main/java/net/md_5/bungee/plugin/ChatEvent.java b/proxy/src/main/java/net/md_5/bungee/plugin/ChatEvent.java similarity index 100% rename from src/main/java/net/md_5/bungee/plugin/ChatEvent.java rename to proxy/src/main/java/net/md_5/bungee/plugin/ChatEvent.java diff --git a/src/main/java/net/md_5/bungee/plugin/InvalidPluginException.java b/proxy/src/main/java/net/md_5/bungee/plugin/InvalidPluginException.java similarity index 100% rename from src/main/java/net/md_5/bungee/plugin/InvalidPluginException.java rename to proxy/src/main/java/net/md_5/bungee/plugin/InvalidPluginException.java diff --git a/src/main/java/net/md_5/bungee/plugin/JavaPlugin.java b/proxy/src/main/java/net/md_5/bungee/plugin/JavaPlugin.java similarity index 100% rename from src/main/java/net/md_5/bungee/plugin/JavaPlugin.java rename to proxy/src/main/java/net/md_5/bungee/plugin/JavaPlugin.java diff --git a/src/main/java/net/md_5/bungee/plugin/JavaPluginManager.java b/proxy/src/main/java/net/md_5/bungee/plugin/JavaPluginManager.java similarity index 100% rename from src/main/java/net/md_5/bungee/plugin/JavaPluginManager.java rename to proxy/src/main/java/net/md_5/bungee/plugin/JavaPluginManager.java diff --git a/src/main/java/net/md_5/bungee/plugin/LoginEvent.java b/proxy/src/main/java/net/md_5/bungee/plugin/LoginEvent.java similarity index 100% rename from src/main/java/net/md_5/bungee/plugin/LoginEvent.java rename to proxy/src/main/java/net/md_5/bungee/plugin/LoginEvent.java diff --git a/src/main/java/net/md_5/bungee/plugin/PluginDescription.java b/proxy/src/main/java/net/md_5/bungee/plugin/PluginDescription.java similarity index 100% rename from src/main/java/net/md_5/bungee/plugin/PluginDescription.java rename to proxy/src/main/java/net/md_5/bungee/plugin/PluginDescription.java diff --git a/src/main/java/net/md_5/bungee/plugin/PluginMessageEvent.java b/proxy/src/main/java/net/md_5/bungee/plugin/PluginMessageEvent.java similarity index 100% rename from src/main/java/net/md_5/bungee/plugin/PluginMessageEvent.java rename to proxy/src/main/java/net/md_5/bungee/plugin/PluginMessageEvent.java diff --git a/src/main/java/net/md_5/bungee/plugin/ServerConnectEvent.java b/proxy/src/main/java/net/md_5/bungee/plugin/ServerConnectEvent.java similarity index 100% rename from src/main/java/net/md_5/bungee/plugin/ServerConnectEvent.java rename to proxy/src/main/java/net/md_5/bungee/plugin/ServerConnectEvent.java diff --git a/src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java similarity index 100% rename from src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java rename to proxy/src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java diff --git a/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java similarity index 100% rename from src/main/java/net/md_5/bungee/tablist/GlobalTabList.java rename to proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java diff --git a/src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java b/proxy/src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java similarity index 100% rename from src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java rename to proxy/src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java diff --git a/src/main/java/net/md_5/bungee/tablist/TabListHandler.java b/proxy/src/main/java/net/md_5/bungee/tablist/TabListHandler.java similarity index 100% rename from src/main/java/net/md_5/bungee/tablist/TabListHandler.java rename to proxy/src/main/java/net/md_5/bungee/tablist/TabListHandler.java From 0354ce3588dc9eaa63560d47d50e2d7606f96c98 Mon Sep 17 00:00:00 2001 From: md_5 Date: Thu, 10 Jan 2013 17:43:23 +1100 Subject: [PATCH 06/45] Don't want to stage them - update gitignore. --- .gitignore | 4 ++-- proxy/nb-configuration.xml | 18 ------------------ 2 files changed, 2 insertions(+), 20 deletions(-) delete mode 100644 proxy/nb-configuration.xml diff --git a/.gitignore b/.gitignore index 92725511..fb9eb761 100644 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,8 @@ # netbeans /nbproject -/nbactions.xml -/nb-configuration.xml +nbactions.xml +nb-configuration.xml # we use maven! /build.xml diff --git a/proxy/nb-configuration.xml b/proxy/nb-configuration.xml deleted file mode 100644 index c2decf16..00000000 --- a/proxy/nb-configuration.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - JDK_1.7 - - From 162f75423dbf870a88776913759f32dae92f7a0c Mon Sep 17 00:00:00 2001 From: md_5 Date: Thu, 10 Jan 2013 17:56:09 +1100 Subject: [PATCH 07/45] Add stub api class. --- .gitignore | 26 +++++----- api/pom.xml | 28 ++++++++++ .../java/net/md_5/bungee/api/ProxyServer.java | 16 ++++++ pom.xml | 43 ++------------- proxy/pom.xml | 52 ++++++++++++++----- 5 files changed, 101 insertions(+), 64 deletions(-) create mode 100644 api/pom.xml create mode 100644 api/src/main/java/net/md_5/bungee/api/ProxyServer.java diff --git a/.gitignore b/.gitignore index fb9eb761..fa02ff80 100644 --- a/.gitignore +++ b/.gitignore @@ -1,31 +1,31 @@ # Eclipse stuff -/.classpath -/.project -/.settings +.classpath/ +.project/ +.settings/ # netbeans -/nbproject +nbproject/ nbactions.xml nb-configuration.xml # we use maven! -/build.xml +build.xml # maven -/target -/dependency-reduced-pom.xml +target/ +dependency-reduced-pom.xml # vim .*.sw[a-p] # various other potential build files -/build -/bin -/dist -/manifest.mf +build/ +bin/ +dist/ +manifest.mf # Mac filesystem dust -/.DS_Store +.DS_Store/ # intellij *.iml @@ -34,5 +34,5 @@ nb-configuration.xml .idea/ # other files -/*log* +*.log* *.yml diff --git a/api/pom.xml b/api/pom.xml new file mode 100644 index 00000000..d3431afb --- /dev/null +++ b/api/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + + net.md-5 + bungeecord-parent + 1.0-SNAPSHOT + ../pom.xml + + + net.md-5 + bungeecord-api + 1.0-SNAPSHOT + jar + + BungeeCord-API + API implemented by the Elastic Portal Suite + + + + com.google.guava + guava + 13.0.1 + + + 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 new file mode 100644 index 00000000..1de8da1a --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/ProxyServer.java @@ -0,0 +1,16 @@ +package net.md_5.bungee.api; + +import com.google.common.base.Preconditions; +import lombok.Getter; + +public abstract class ProxyServer { + + @Getter + private static ProxyServer instance; + + public static void setInstance(ProxyServer instance) { + Preconditions.checkNotNull(instance, "Instance null"); + Preconditions.checkArgument(instance == null, "Instance already set"); + ProxyServer.instance = instance; + } +} diff --git a/pom.xml b/pom.xml index 8463a12c..194e9cba 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,5 @@ - - + + 4.0.0 @@ -15,7 +14,7 @@ pom BungeeCord - Proxy component of the Elastic Portal Suite + Parent project for all BungeeCord modules. https://github.com/ElasticPortalSuite/BungeeCord 2012 @@ -38,6 +37,7 @@ proxy + api @@ -57,7 +57,6 @@ UTF-8 unknown - net.md_5.bungee.BungeeCord @@ -70,7 +69,6 @@ - ${project.name} com.lukegb.mojo @@ -98,39 +96,6 @@ 1.7 - - com.github.wvengen - proguard-maven-plugin - 2.0.6 - - - package - - proguard - - - - - true - false - - ${java.home}/lib/rt.jar - ${java.home}/lib/jce.jar - - false - - - - - - - - net.sf.proguard - proguard-base - 4.8 - - - diff --git a/proxy/pom.xml b/proxy/pom.xml index d36cbbb3..b059709c 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -15,7 +15,7 @@ 1.0-SNAPSHOT jar - BungeeCord + BungeeCord-Proxy Proxy component of the Elastic Portal Suite @@ -24,16 +24,16 @@ jsr305 2.0.1 - - com.google.guava - guava - 13.0.1 - net.md-5 mendax 1.4.6-SNAPSHOT + + net.md-5 + bungeecord-api + ${project.version} + org.bouncycastle bcprov-ext-jdk15on @@ -44,15 +44,10 @@ snakeyaml 1.11 - - org.projectlombok - lombok - 0.11.6 - provided - + BungeeCord org.apache.maven.plugins @@ -93,6 +88,39 @@ + + com.github.wvengen + proguard-maven-plugin + 2.0.6 + + + package + + proguard + + + + + true + false + + ${java.home}/lib/rt.jar + ${java.home}/lib/jce.jar + + false + + + + + + + + net.sf.proguard + proguard-base + 4.8 + + + From e3664cb6544103be73a73ded4f5d931ffda0df2e Mon Sep 17 00:00:00 2001 From: md_5 Date: Thu, 10 Jan 2013 18:16:29 +1100 Subject: [PATCH 08/45] Api spec is already looking really good. --- .../net/md_5/bungee/api/ProxyConnection.java | 18 +++++++ .../java/net/md_5/bungee/api/ProxyServer.java | 40 +++++++++++++++ .../net/md_5/bungee/api/plugin/Event.java | 7 +++ .../net/md_5/bungee/api/plugin/Listener.java | 7 +++ .../net/md_5/bungee/api/plugin/Plugin.java | 4 ++ .../md_5/bungee/api/plugin/PluginManager.java | 50 +++++++++++++++++++ 6 files changed, 126 insertions(+) create mode 100644 api/src/main/java/net/md_5/bungee/api/ProxyConnection.java create mode 100644 api/src/main/java/net/md_5/bungee/api/plugin/Event.java create mode 100644 api/src/main/java/net/md_5/bungee/api/plugin/Listener.java create mode 100644 api/src/main/java/net/md_5/bungee/api/plugin/Plugin.java create mode 100644 api/src/main/java/net/md_5/bungee/api/plugin/PluginManager.java 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 new file mode 100644 index 00000000..c6ba8bee --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/ProxyConnection.java @@ -0,0 +1,18 @@ +package net.md_5.bungee.api; + +import java.net.InetSocketAddress; + +/** + * A proxy connection is defined as a connection directly connected to a socket. + * 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 { + + /** + * Gets the remote address of this connection. + * + * @return the remote address + */ + public abstract InetSocketAddress getAddress(); +} 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 1de8da1a..423b868c 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 @@ -1,6 +1,8 @@ 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 lombok.Getter; public abstract class ProxyServer { @@ -13,4 +15,42 @@ public abstract class ProxyServer { Preconditions.checkArgument(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(); + + /** + * The current number of players connected to this proxy. This total should + * include virtual players that may be connected from other servers. + * + * @return current player count + */ + public abstract int playerCount(); + + /** + * Return all currently networked connections to this proxy. + * + * @return all networked users + */ + public abstract Collection getConnections(); + + /** + * 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(); } 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 new file mode 100644 index 00000000..90db9139 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/plugin/Event.java @@ -0,0 +1,7 @@ +package net.md_5.bungee.api.plugin; + +/** + * Dummy class which all callable events must extend. + */ +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 new file mode 100644 index 00000000..4cfb17e8 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/plugin/Listener.java @@ -0,0 +1,7 @@ +package net.md_5.bungee.api.plugin; + +/** + * Dummy interface which all event subscribers and listeners must implement. + */ +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 new file mode 100644 index 00000000..e546aef3 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/plugin/Plugin.java @@ -0,0 +1,4 @@ +package net.md_5.bungee.api.plugin; + +public class Plugin { +} 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 new file mode 100644 index 00000000..f4cdd054 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/plugin/PluginManager.java @@ -0,0 +1,50 @@ +package net.md_5.bungee.api.plugin; + +import com.google.common.eventbus.EventBus; +import com.google.common.eventbus.Subscribe; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +/** + * Class to manage bridging between plugin duties and implementation duties, for + * example event handling and plugin management. + */ +public class PluginManager { + + private final EventBus eventBus = new EventBus(); + private final Map plugins = new HashMap<>(); + + /** + * Returns the {@link Plugin} objects corresponding to all loaded plugins. + * + * @return the set of loaded plugins + */ + public Collection getPlugins() { + return plugins.values(); + } + + /** + * Dispatch an event to all subscribed listeners and return the event once + * it has been handled by these listeners. + * + * @param the type bounds, must be a class which extends event + * @param event the event to call + * @return the called event + */ + public T callEvent(T event) { + eventBus.post(event); + return event; + } + + /** + * Register a {@link Listener} for receiving called events. Methods in this + * Object which wish to receive events must be annotated with the + * {@link Subscribe} annotation. + * + * @param listener the listener to register events for + */ + public void registerListener(Listener listener) { + eventBus.register(listener); + } +} From 9196f8f61ed00138d01b4881a85ed867dcb31a08 Mon Sep 17 00:00:00 2001 From: md_5 Date: Thu, 10 Jan 2013 19:54:12 +1100 Subject: [PATCH 09/45] More work on the API: Up next, command senders. --- api/pom.xml | 7 +++ .../java/net/md_5/bungee/api/Callback.java | 19 +++++++ .../net/md_5/bungee/api/ProxyConnection.java | 3 +- .../java/net/md_5/bungee/api/ProxyServer.java | 23 +++++++- .../net/md_5/bungee/api/RemoteServer.java | 32 +++++++++++ .../md_5/bungee/api/plugin/Cancellable.java | 23 ++++++++ .../net/md_5/bungee/api/plugin/Event.java | 3 +- .../net/md_5/bungee/api/plugin/Listener.java | 3 +- .../net/md_5/bungee/api/plugin/Plugin.java | 31 +++++++++- .../bungee/api/plugin/PluginDescription.java | 14 +++++ .../md_5/bungee/api/plugin/PluginManager.java | 56 +++++++++++++++++-- proxy/pom.xml | 5 -- 12 files changed, 203 insertions(+), 16 deletions(-) create mode 100644 api/src/main/java/net/md_5/bungee/api/Callback.java create mode 100644 api/src/main/java/net/md_5/bungee/api/RemoteServer.java create mode 100644 api/src/main/java/net/md_5/bungee/api/plugin/Cancellable.java create mode 100644 api/src/main/java/net/md_5/bungee/api/plugin/PluginDescription.java 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 - From 5402bd2cb1b9b0962910f683d69740d019a4c529 Mon Sep 17 00:00:00 2001 From: md_5 Date: Thu, 10 Jan 2013 20:41:05 +1100 Subject: [PATCH 10/45] Add plugin loading. --- .../java/net/md_5/bungee/api/ProxyServer.java | 27 ++++++++---- .../net/md_5/bungee/api/plugin/Plugin.java | 21 ++++++---- .../bungee/api/plugin/PluginDescription.java | 1 - .../md_5/bungee/api/plugin/PluginManager.java | 41 +++++++++++++++++-- 4 files changed, 69 insertions(+), 21 deletions(-) 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 19f08dcc..f5a71978 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 @@ -5,12 +5,21 @@ import com.google.common.base.Preconditions; import java.util.Collection; import java.util.logging.Logger; import lombok.Getter; +import org.yaml.snakeyaml.Yaml; public abstract class ProxyServer { @Getter private static ProxyServer instance; + private ThreadLocal yaml = new ThreadLocal() + { + @Override + protected Yaml initialValue() + { + return new Yaml(); + } + }; /** * Sets the proxy instance. This method may only be called once per an @@ -25,6 +34,16 @@ public abstract class ProxyServer ProxyServer.instance = instance; } + /** + * Gets a reusable, thread safe {@link Yaml} instance. + * + * @return an {@link Yaml} instance + */ + public Yaml getYaml() + { + return yaml.get(); + } + /** * Gets the name of the currently running proxy software. * @@ -39,14 +58,6 @@ public abstract class ProxyServer */ public abstract String getVersion(); - /** - * The current number of players connected to this proxy. This total should - * include virtual players that may be connected from other servers. - * - * @return current player count - */ - public abstract int playerCount(); - /** * Gets the main logger which can be used as a suitable replacement for * {@link System#out} and {@link System#err}. 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 a304b273..5d50ef98 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,7 +1,6 @@ package net.md_5.bungee.api.plugin; -import java.util.logging.Logger; -import net.md_5.bungee.api.ProxyServer; +import lombok.Getter; /** * Represents any Plugin that may be loaded at runtime to enhance existing @@ -10,12 +9,8 @@ import net.md_5.bungee.api.ProxyServer; public class Plugin { - /** - * Called when this plugin is loaded. - */ - public void onLoad() - { - } + @Getter + private PluginDescription description; /** * Called when this plugin is enabled. @@ -30,4 +25,14 @@ public class Plugin public void onDisable() { } + + /** + * Called by the loader to initialize the fields in this plugin. + * + * @param description the description that describes this plugin + */ + final void init(PluginDescription description) + { + this.description = description; + } } 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 index d9d9c6a0..6f124efa 100644 --- 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 @@ -10,5 +10,4 @@ public class PluginDescription 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 8c0e24dc..72f58ff3 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 @@ -4,9 +4,16 @@ import com.google.common.base.Preconditions; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; import java.io.File; +import java.io.InputStream; +import java.net.URL; +import java.net.URLClassLoader; import java.util.Collection; import java.util.HashMap; import java.util.Map; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.logging.Level; +import net.md_5.bungee.api.ProxyServer; /** * Class to manage bridging between plugin duties and implementation duties, for @@ -40,15 +47,35 @@ public class PluginManager } /** - * Load a plugin from the specified file. This file must be in jar or zip - * format. + * Load a plugin from the specified file. This file must be in jar format. * * @param file the file to load from + * @throws Exception Any exceptions encountered when loading a plugin from + * this file. */ - public void load(File file) + public void load(File file) throws Exception { Preconditions.checkNotNull(file, "file"); Preconditions.checkArgument(file.isFile(), "Must load from file"); + + try (JarFile jar = new JarFile(file)) + { + JarEntry pdf = jar.getJarEntry("plugin.yml"); + try (InputStream in = jar.getInputStream(pdf)) + { + PluginDescription desc = ProxyServer.getInstance().getYaml().loadAs(in, PluginDescription.class); + URLClassLoader loader = new URLClassLoader(new URL[] + { + file.toURI().toURL() + }); + Class main = loader.loadClass(desc.getMain()); + Plugin plugin = (Plugin) main.getDeclaredConstructor().newInstance(); + + plugin.init(desc); + plugins.put(pdf.getName(), plugin); + plugin.onEnable(); + } + } } /** @@ -65,7 +92,13 @@ public class PluginManager { if (file.getName().endsWith(".jar")) { - load(file); + try + { + load(file); + } catch (Exception ex) + { + ProxyServer.getInstance().getLogger().log(Level.WARNING, "Could not load plugin from file " + file, ex); + } } } } From 434b950a9261f2a6dbb17c717d098e6bd66591f3 Mon Sep 17 00:00:00 2001 From: md_5 Date: Fri, 11 Jan 2013 09:49:54 +1100 Subject: [PATCH 11/45] More changes. API is going well, but struggling to break it up into sensible classes whilst allowing for the fact that in the future we will have: - Player to Proxy - Proxy to Proxy - Player to Internal Server Connections. --- api/pom.xml | 4 +- .../net/md_5/bungee/api/CommandSender.java | 21 +++++++++ .../net/md_5/bungee/api/ConnectedPlayer.java | 8 ++++ .../{ProxyConnection.java => Connection.java} | 4 +- .../net/md_5/bungee/api/ProxiedPlayer.java | 9 ++++ .../java/net/md_5/bungee/api/ProxyServer.java | 21 +-------- .../api/{RemoteServer.java => Server.java} | 2 +- .../net/md_5/bungee/api/event/ChatEvent.java | 28 ++++++++++++ .../net/md_5/bungee/api/event/LoginEvent.java | 34 ++++++++++++++ .../bungee/api/event/PluginMessageEvent.java | 35 +++++++++++++++ .../md_5/bungee/api/plugin/PluginManager.java | 4 +- pom.xml | 2 +- proxy/pom.xml | 45 ++----------------- 13 files changed, 149 insertions(+), 68 deletions(-) create mode 100644 api/src/main/java/net/md_5/bungee/api/CommandSender.java create mode 100644 api/src/main/java/net/md_5/bungee/api/ConnectedPlayer.java rename api/src/main/java/net/md_5/bungee/api/{ProxyConnection.java => Connection.java} (81%) create mode 100644 api/src/main/java/net/md_5/bungee/api/ProxiedPlayer.java rename api/src/main/java/net/md_5/bungee/api/{RemoteServer.java => Server.java} (93%) create mode 100644 api/src/main/java/net/md_5/bungee/api/event/ChatEvent.java create mode 100644 api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java create mode 100644 api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java diff --git a/api/pom.xml b/api/pom.xml index bcad7b4f..dce9e57c 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -6,13 +6,13 @@ net.md-5 bungeecord-parent - 1.0-SNAPSHOT + 1.4.7-SNAPSHOT ../pom.xml net.md-5 bungeecord-api - 1.0-SNAPSHOT + 1.4.7-SNAPSHOT jar BungeeCord-API diff --git a/api/src/main/java/net/md_5/bungee/api/CommandSender.java b/api/src/main/java/net/md_5/bungee/api/CommandSender.java new file mode 100644 index 00000000..7ba6288a --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/CommandSender.java @@ -0,0 +1,21 @@ +package net.md_5.bungee.api; + +import java.util.Collection; + +public interface CommandSender +{ + + public String getName(); + + public void sendMessage(String message); + + public Collection getGroups(); + + public void addGroups(String... groups); + + public void removeGroups(String... groups); + + public boolean hasPermission(String permission); + + public boolean setPermission(String permission, boolean value); +} diff --git a/api/src/main/java/net/md_5/bungee/api/ConnectedPlayer.java b/api/src/main/java/net/md_5/bungee/api/ConnectedPlayer.java new file mode 100644 index 00000000..6c82fa08 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/ConnectedPlayer.java @@ -0,0 +1,8 @@ +package net.md_5.bungee.api; + +/** + * Represents a player physically connected to the world hosted on this server. + */ +public interface ConnectedPlayer extends ProxiedPlayer +{ +} diff --git a/api/src/main/java/net/md_5/bungee/api/ProxyConnection.java b/api/src/main/java/net/md_5/bungee/api/Connection.java similarity index 81% rename from api/src/main/java/net/md_5/bungee/api/ProxyConnection.java rename to api/src/main/java/net/md_5/bungee/api/Connection.java index 7ec64427..bd1cbfec 100644 --- a/api/src/main/java/net/md_5/bungee/api/ProxyConnection.java +++ b/api/src/main/java/net/md_5/bungee/api/Connection.java @@ -7,7 +7,7 @@ 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 interface Connection { /** @@ -15,5 +15,5 @@ public abstract class ProxyConnection * * @return the remote address */ - public abstract InetSocketAddress getAddress(); + public InetSocketAddress getAddress(); } diff --git a/api/src/main/java/net/md_5/bungee/api/ProxiedPlayer.java b/api/src/main/java/net/md_5/bungee/api/ProxiedPlayer.java new file mode 100644 index 00000000..c858cb49 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/ProxiedPlayer.java @@ -0,0 +1,9 @@ +package net.md_5.bungee.api; + +/** + * Represents a player who's connection is being connected to somewhere else, + * whether it be a remote or embedded server. + */ +public interface ProxiedPlayer extends Connection, CommandSender +{ +} 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 f5a71978..a3ddf173 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 @@ -5,21 +5,12 @@ import com.google.common.base.Preconditions; import java.util.Collection; import java.util.logging.Logger; import lombok.Getter; -import org.yaml.snakeyaml.Yaml; public abstract class ProxyServer { @Getter private static ProxyServer instance; - private ThreadLocal yaml = new ThreadLocal() - { - @Override - protected Yaml initialValue() - { - return new Yaml(); - } - }; /** * Sets the proxy instance. This method may only be called once per an @@ -34,16 +25,6 @@ public abstract class ProxyServer ProxyServer.instance = instance; } - /** - * Gets a reusable, thread safe {@link Yaml} instance. - * - * @return an {@link Yaml} instance - */ - public Yaml getYaml() - { - return yaml.get(); - } - /** * Gets the name of the currently running proxy software. * @@ -71,7 +52,7 @@ public abstract class ProxyServer * * @return all networked users */ - public abstract Collection getConnections(); + public abstract Collection getConnections(); /** * Get the {@link PluginManager} associated with loading plugins and diff --git a/api/src/main/java/net/md_5/bungee/api/RemoteServer.java b/api/src/main/java/net/md_5/bungee/api/Server.java similarity index 93% rename from api/src/main/java/net/md_5/bungee/api/RemoteServer.java rename to api/src/main/java/net/md_5/bungee/api/Server.java index fe38d003..83f2fee2 100644 --- a/api/src/main/java/net/md_5/bungee/api/RemoteServer.java +++ b/api/src/main/java/net/md_5/bungee/api/Server.java @@ -7,7 +7,7 @@ import lombok.RequiredArgsConstructor; * Represents a destination which this proxy might connect to. */ @RequiredArgsConstructor -public abstract class RemoteServer extends ProxyConnection +public abstract class Server implements Connection { @Getter diff --git a/api/src/main/java/net/md_5/bungee/api/event/ChatEvent.java b/api/src/main/java/net/md_5/bungee/api/event/ChatEvent.java new file mode 100644 index 00000000..022e9c49 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/event/ChatEvent.java @@ -0,0 +1,28 @@ +package net.md_5.bungee.api.event; + +import lombok.Data; +import net.md_5.bungee.api.Connection; +import net.md_5.bungee.api.ProxiedPlayer; +import net.md_5.bungee.api.plugin.Cancellable; + +@Data +public class ChatEvent implements Cancellable +{ + + /** + * Cancelled state. + */ + private boolean cancelled; + /** + * Where this message is being sent to. + */ + private final Connection destination; + /** + * User involved with sending or receiving this message. + */ + private final ProxiedPlayer player; + /** + * Text contained in this chat. + */ + private String message; +} diff --git a/api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java b/api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java new file mode 100644 index 00000000..473518ff --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java @@ -0,0 +1,34 @@ +package net.md_5.bungee.api.event; + +import java.net.InetAddress; +import lombok.Data; +import net.md_5.bungee.api.plugin.Cancellable; + +/** + * Event called to represent a player logging in. + */ +@Data +public class LoginEvent implements Cancellable +{ + + /** + * Cancelled state. + */ + private boolean cancelled; + /** + * Message to use when kicking if this event is canceled. + */ + private String cancelReason; + /** + * Username which the player wishes to use. + */ + private final String username; + /** + * IP address of the remote connection. + */ + private final InetAddress address; + /** + * Hostname which the user tried to connect to. + */ + private final String hostname; +} diff --git a/api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java b/api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java new file mode 100644 index 00000000..27fa0744 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java @@ -0,0 +1,35 @@ +package net.md_5.bungee.api.event; + +import lombok.Data; +import net.md_5.bungee.api.Connection; +import net.md_5.bungee.api.ProxiedPlayer; +import net.md_5.bungee.api.plugin.Cancellable; + +/** + * Event called when a plugin message is sent to the client or server. + */ +@Data +public class PluginMessageEvent implements Cancellable +{ + + /** + * Cancelled state. + */ + private boolean cancelled; + /** + * Dispatcher of this message. + */ + private final Connection sender; + /** + * Player involved with sending or receiving this message. + */ + private final ProxiedPlayer player; + /** + * Tag specified for this plugin message. + */ + private String tag; + /** + * Data contained in this plugin message. + */ + private byte[] data; +} 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 72f58ff3..8974c0a2 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 @@ -14,6 +14,7 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.logging.Level; import net.md_5.bungee.api.ProxyServer; +import org.yaml.snakeyaml.Yaml; /** * Class to manage bridging between plugin duties and implementation duties, for @@ -22,6 +23,7 @@ import net.md_5.bungee.api.ProxyServer; public class PluginManager { + private final Yaml yaml = new Yaml(); private final EventBus eventBus = new EventBus(); private final Map plugins = new HashMap<>(); @@ -63,7 +65,7 @@ public class PluginManager JarEntry pdf = jar.getJarEntry("plugin.yml"); try (InputStream in = jar.getInputStream(pdf)) { - PluginDescription desc = ProxyServer.getInstance().getYaml().loadAs(in, PluginDescription.class); + PluginDescription desc = yaml.loadAs(in, PluginDescription.class); URLClassLoader loader = new URLClassLoader(new URL[] { file.toURI().toURL() diff --git a/pom.xml b/pom.xml index 194e9cba..360d920c 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ net.md-5 bungeecord-parent - 1.0-SNAPSHOT + 1.4.7-SNAPSHOT pom BungeeCord diff --git a/proxy/pom.xml b/proxy/pom.xml index 02a137ce..3a3d0f5a 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -6,24 +6,19 @@ net.md-5 bungeecord-parent - 1.0-SNAPSHOT + 1.4.7-SNAPSHOT ../pom.xml net.md-5 bungeecord-proxy - 1.0-SNAPSHOT + 1.4.7-SNAPSHOT jar BungeeCord-Proxy Proxy component of the Elastic Portal Suite - - com.google.code.findbugs - jsr305 - 2.0.1 - net.md-5 mendax @@ -36,7 +31,7 @@ org.bouncycastle - bcprov-ext-jdk15on + bcprov-jdk15on 1.47 @@ -81,41 +76,9 @@ + true - - com.github.wvengen - proguard-maven-plugin - 2.0.6 - - - package - - proguard - - - - - true - false - - ${java.home}/lib/rt.jar - ${java.home}/lib/jce.jar - - false - - - - - - - - net.sf.proguard - proguard-base - 4.8 - - - From 4f0a02dccacdcb28ac39471bef7f042e45d8774b Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 12 Jan 2013 11:15:40 +1100 Subject: [PATCH 12/45] Think this is a good way to manage events, since many will be targeted between specific nodes. It is expected for developers to cast as needed. --- .../md_5/bungee/api/PendingConnection.java | 8 ++++++ .../net/md_5/bungee/api/event/ChatEvent.java | 25 +++++++++++-------- .../net/md_5/bungee/api/event/LoginEvent.java | 14 +++-------- .../bungee/api/event/PluginMessageEvent.java | 22 ++++++++-------- .../md_5/bungee/api/event/TargetedEvent.java | 20 +++++++++++++++ 5 files changed, 58 insertions(+), 31 deletions(-) create mode 100644 api/src/main/java/net/md_5/bungee/api/PendingConnection.java create mode 100644 api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java diff --git a/api/src/main/java/net/md_5/bungee/api/PendingConnection.java b/api/src/main/java/net/md_5/bungee/api/PendingConnection.java new file mode 100644 index 00000000..246dc44c --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/PendingConnection.java @@ -0,0 +1,8 @@ +package net.md_5.bungee.api; + +/** + * Represents a user attempting to log into the proxy. + */ +public interface PendingConnection extends Connection +{ +} diff --git a/api/src/main/java/net/md_5/bungee/api/event/ChatEvent.java b/api/src/main/java/net/md_5/bungee/api/event/ChatEvent.java index 022e9c49..af76d1d7 100644 --- a/api/src/main/java/net/md_5/bungee/api/event/ChatEvent.java +++ b/api/src/main/java/net/md_5/bungee/api/event/ChatEvent.java @@ -1,28 +1,33 @@ package net.md_5.bungee.api.event; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; import net.md_5.bungee.api.Connection; -import net.md_5.bungee.api.ProxiedPlayer; import net.md_5.bungee.api.plugin.Cancellable; +/** + * Event called when a player sends a message to a server, or a server sends a + * message to a player. + */ @Data -public class ChatEvent implements Cancellable +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class ChatEvent extends TargetedEvent implements Cancellable { /** * Cancelled state. */ private boolean cancelled; - /** - * Where this message is being sent to. - */ - private final Connection destination; - /** - * User involved with sending or receiving this message. - */ - private final ProxiedPlayer player; /** * Text contained in this chat. */ private String message; + + public ChatEvent(Connection sender, Connection receiver, String message) + { + super(sender, receiver); + this.message = message; + } } diff --git a/api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java b/api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java index 473518ff..bc300590 100644 --- a/api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java +++ b/api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java @@ -1,7 +1,7 @@ package net.md_5.bungee.api.event; -import java.net.InetAddress; import lombok.Data; +import net.md_5.bungee.api.PendingConnection; import net.md_5.bungee.api.plugin.Cancellable; /** @@ -20,15 +20,7 @@ public class LoginEvent implements Cancellable */ private String cancelReason; /** - * Username which the player wishes to use. + * Connection attempting to login. */ - private final String username; - /** - * IP address of the remote connection. - */ - private final InetAddress address; - /** - * Hostname which the user tried to connect to. - */ - private final String hostname; + private final PendingConnection connection; } diff --git a/api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java b/api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java index 27fa0744..3daec111 100644 --- a/api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java +++ b/api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java @@ -1,29 +1,24 @@ package net.md_5.bungee.api.event; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; import net.md_5.bungee.api.Connection; -import net.md_5.bungee.api.ProxiedPlayer; import net.md_5.bungee.api.plugin.Cancellable; /** * Event called when a plugin message is sent to the client or server. */ @Data -public class PluginMessageEvent implements Cancellable +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class PluginMessageEvent extends TargetedEvent implements Cancellable { /** * Cancelled state. */ private boolean cancelled; - /** - * Dispatcher of this message. - */ - private final Connection sender; - /** - * Player involved with sending or receiving this message. - */ - private final ProxiedPlayer player; /** * Tag specified for this plugin message. */ @@ -32,4 +27,11 @@ public class PluginMessageEvent implements Cancellable * Data contained in this plugin message. */ private byte[] data; + + public PluginMessageEvent(Connection sender, Connection receiver, String tag, byte[] data) + { + super(sender, receiver); + this.tag = tag; + this.data = data; + } } diff --git a/api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java b/api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java new file mode 100644 index 00000000..c04d9be6 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java @@ -0,0 +1,20 @@ +package net.md_5.bungee.api.event; + +import lombok.AllArgsConstructor; +import lombok.Data; +import net.md_5.bungee.api.Connection; + +/** + * An event which occurs in the communication between two nodes. It is not + * recommended to call {@link #setSender(net.md_5.bungee.api.Connection)} or + * {@link #setReceiver(net.md_5.bungee.api.Connection)} and the results of doing + * so are undefined. + */ +@Data +@AllArgsConstructor +public abstract class TargetedEvent +{ + + private Connection sender; + private Connection receiver; +} From 14e196e95267d15e21ec28b6928a1dc713cc7ba9 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 12 Jan 2013 11:18:35 +1100 Subject: [PATCH 13/45] Expand server ping method. --- .../main/java/net/md_5/bungee/api/Server.java | 4 +--- .../java/net/md_5/bungee/api/ServerPing.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 api/src/main/java/net/md_5/bungee/api/ServerPing.java diff --git a/api/src/main/java/net/md_5/bungee/api/Server.java b/api/src/main/java/net/md_5/bungee/api/Server.java index 83f2fee2..12476d0d 100644 --- a/api/src/main/java/net/md_5/bungee/api/Server.java +++ b/api/src/main/java/net/md_5/bungee/api/Server.java @@ -24,9 +24,7 @@ public abstract class Server implements Connection /** * 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); + public abstract void getPlayerCount(Callback callback); } diff --git a/api/src/main/java/net/md_5/bungee/api/ServerPing.java b/api/src/main/java/net/md_5/bungee/api/ServerPing.java new file mode 100644 index 00000000..a12498a1 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/ServerPing.java @@ -0,0 +1,18 @@ +package net.md_5.bungee.api; + +import lombok.Data; + +/** + * Represents the standard list data returned by opening a server in the + * Minecraft client server list, or hitting it with a packet 0xFE. + */ +@Data +public class ServerPing +{ + + private final byte protocolVersion; + private final String gameVersion; + private final String motd; + private final String currentPlayers; + private final String maxPlayers; +} From 4cef0b23959d8333ea067c416d25d04cbcff458f Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 12 Jan 2013 11:26:26 +1100 Subject: [PATCH 14/45] Add a tab list handler to allow plugins to customize the tab list. --- .../java/net/md_5/bungee/api/ProxyServer.java | 1 + .../net/md_5/bungee/api/TabListHandler.java | 47 +++++++++++++++++++ .../api/{ => connection}/ConnectedPlayer.java | 2 +- .../api/{ => connection}/Connection.java | 2 +- .../{ => connection}/PendingConnection.java | 2 +- .../api/{ => connection}/ProxiedPlayer.java | 4 +- .../bungee/api/{ => connection}/Server.java | 4 +- .../net/md_5/bungee/api/event/ChatEvent.java | 2 +- .../net/md_5/bungee/api/event/LoginEvent.java | 2 +- .../bungee/api/event/PluginMessageEvent.java | 2 +- .../md_5/bungee/api/event/TargetedEvent.java | 2 +- 11 files changed, 61 insertions(+), 9 deletions(-) create mode 100644 api/src/main/java/net/md_5/bungee/api/TabListHandler.java rename api/src/main/java/net/md_5/bungee/api/{ => connection}/ConnectedPlayer.java (78%) rename api/src/main/java/net/md_5/bungee/api/{ => connection}/Connection.java (91%) rename api/src/main/java/net/md_5/bungee/api/{ => connection}/PendingConnection.java (75%) rename api/src/main/java/net/md_5/bungee/api/{ => connection}/ProxiedPlayer.java (70%) rename api/src/main/java/net/md_5/bungee/api/{ => connection}/Server.java (86%) 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 a3ddf173..d6145f91 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 @@ -1,5 +1,6 @@ package net.md_5.bungee.api; +import net.md_5.bungee.api.connection.Connection; import net.md_5.bungee.api.plugin.PluginManager; import com.google.common.base.Preconditions; import java.util.Collection; diff --git a/api/src/main/java/net/md_5/bungee/api/TabListHandler.java b/api/src/main/java/net/md_5/bungee/api/TabListHandler.java new file mode 100644 index 00000000..832e95c5 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/TabListHandler.java @@ -0,0 +1,47 @@ +package net.md_5.bungee.api; + +import net.md_5.bungee.api.connection.ProxiedPlayer; + +public interface TabListHandler +{ + + /** + * Called when a player first connects to the proxy. + * + * @param player the connecting player + */ + public void onConnect(ProxiedPlayer player); + + /** + * Called when a player changes their connected server. + * + * @param player the player who changed servers + */ + public void onServerChange(ProxiedPlayer player); + + /** + * Called when a players ping changes. + * + * @param player the player who's ping changed + * @param ping the player's new ping. + */ + public void onPingChange(ProxiedPlayer player, int ping); + + /** + * Called when a player disconnects. + * + * @param player the disconnected player + */ + public void onDisconnect(ProxiedPlayer player); + + /** + * Called when a list update packet is sent from server to client. + * + * @param player receiving this packet + * @param name the player which this packet is relevant to + * @param online whether the subject player is online + * @param ping ping of the subject player + * @return whether to send the packet to the client + */ + public boolean onListUpdate(ProxiedPlayer player, String name, boolean online, int ping); +} diff --git a/api/src/main/java/net/md_5/bungee/api/ConnectedPlayer.java b/api/src/main/java/net/md_5/bungee/api/connection/ConnectedPlayer.java similarity index 78% rename from api/src/main/java/net/md_5/bungee/api/ConnectedPlayer.java rename to api/src/main/java/net/md_5/bungee/api/connection/ConnectedPlayer.java index 6c82fa08..cf09a65a 100644 --- a/api/src/main/java/net/md_5/bungee/api/ConnectedPlayer.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/ConnectedPlayer.java @@ -1,4 +1,4 @@ -package net.md_5.bungee.api; +package net.md_5.bungee.api.connection; /** * Represents a player physically connected to the world hosted on this server. diff --git a/api/src/main/java/net/md_5/bungee/api/Connection.java b/api/src/main/java/net/md_5/bungee/api/connection/Connection.java similarity index 91% rename from api/src/main/java/net/md_5/bungee/api/Connection.java rename to api/src/main/java/net/md_5/bungee/api/connection/Connection.java index bd1cbfec..3962b9a9 100644 --- a/api/src/main/java/net/md_5/bungee/api/Connection.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/Connection.java @@ -1,4 +1,4 @@ -package net.md_5.bungee.api; +package net.md_5.bungee.api.connection; import java.net.InetSocketAddress; diff --git a/api/src/main/java/net/md_5/bungee/api/PendingConnection.java b/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java similarity index 75% rename from api/src/main/java/net/md_5/bungee/api/PendingConnection.java rename to api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java index 246dc44c..54fc4e8e 100644 --- a/api/src/main/java/net/md_5/bungee/api/PendingConnection.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java @@ -1,4 +1,4 @@ -package net.md_5.bungee.api; +package net.md_5.bungee.api.connection; /** * Represents a user attempting to log into the proxy. diff --git a/api/src/main/java/net/md_5/bungee/api/ProxiedPlayer.java b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java similarity index 70% rename from api/src/main/java/net/md_5/bungee/api/ProxiedPlayer.java rename to api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java index c858cb49..166b43a6 100644 --- a/api/src/main/java/net/md_5/bungee/api/ProxiedPlayer.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java @@ -1,4 +1,6 @@ -package net.md_5.bungee.api; +package net.md_5.bungee.api.connection; + +import net.md_5.bungee.api.CommandSender; /** * Represents a player who's connection is being connected to somewhere else, diff --git a/api/src/main/java/net/md_5/bungee/api/Server.java b/api/src/main/java/net/md_5/bungee/api/connection/Server.java similarity index 86% rename from api/src/main/java/net/md_5/bungee/api/Server.java rename to api/src/main/java/net/md_5/bungee/api/connection/Server.java index 12476d0d..6e746f04 100644 --- a/api/src/main/java/net/md_5/bungee/api/Server.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/Server.java @@ -1,7 +1,9 @@ -package net.md_5.bungee.api; +package net.md_5.bungee.api.connection; import lombok.Getter; import lombok.RequiredArgsConstructor; +import net.md_5.bungee.api.Callback; +import net.md_5.bungee.api.ServerPing; /** * Represents a destination which this proxy might connect to. diff --git a/api/src/main/java/net/md_5/bungee/api/event/ChatEvent.java b/api/src/main/java/net/md_5/bungee/api/event/ChatEvent.java index af76d1d7..d0285329 100644 --- a/api/src/main/java/net/md_5/bungee/api/event/ChatEvent.java +++ b/api/src/main/java/net/md_5/bungee/api/event/ChatEvent.java @@ -3,7 +3,7 @@ package net.md_5.bungee.api.event; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -import net.md_5.bungee.api.Connection; +import net.md_5.bungee.api.connection.Connection; import net.md_5.bungee.api.plugin.Cancellable; /** diff --git a/api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java b/api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java index bc300590..8b7db16c 100644 --- a/api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java +++ b/api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java @@ -1,7 +1,7 @@ package net.md_5.bungee.api.event; import lombok.Data; -import net.md_5.bungee.api.PendingConnection; +import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.plugin.Cancellable; /** diff --git a/api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java b/api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java index 3daec111..8ef3ac9b 100644 --- a/api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java +++ b/api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java @@ -3,7 +3,7 @@ package net.md_5.bungee.api.event; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -import net.md_5.bungee.api.Connection; +import net.md_5.bungee.api.connection.Connection; import net.md_5.bungee.api.plugin.Cancellable; /** diff --git a/api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java b/api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java index c04d9be6..b4d3208c 100644 --- a/api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java +++ b/api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java @@ -2,7 +2,7 @@ package net.md_5.bungee.api.event; import lombok.AllArgsConstructor; import lombok.Data; -import net.md_5.bungee.api.Connection; +import net.md_5.bungee.api.connection.Connection; /** * An event which occurs in the communication between two nodes. It is not From f065d0099f5f749051562ee2f3b8f414fdda454f Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 12 Jan 2013 11:35:55 +1100 Subject: [PATCH 15/45] Add reconnect api to allow mysql reconnect locations. --- .../net/md_5/bungee/api/ReconnectHandler.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 api/src/main/java/net/md_5/bungee/api/ReconnectHandler.java diff --git a/api/src/main/java/net/md_5/bungee/api/ReconnectHandler.java b/api/src/main/java/net/md_5/bungee/api/ReconnectHandler.java new file mode 100644 index 00000000..b835fc30 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/ReconnectHandler.java @@ -0,0 +1,22 @@ +package net.md_5.bungee.api; + +import net.md_5.bungee.api.connection.ProxiedPlayer; + +public interface ReconnectHandler +{ + + /** + * Gets the initial server name for a connecting player. + * + * @param player the connecting player + * @return the server name + */ + public String getServer(ProxiedPlayer player); + + /** + * Save all pending reconnect locations. Whilst not used for database + * connections, this method will be called at a predefined interval to allow + * the saving of reconnect files. + */ + public void save(); +} From b4105f80819f04fd54b7c137a5478b3b014e8bb0 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 12 Jan 2013 12:03:59 +1100 Subject: [PATCH 16/45] Finish up command API, with permissions and aliases! --- .../java/net/md_5/bungee/api}/ChatColor.java | 2 +- .../net/md_5/bungee/api/plugin/Command.java | 42 ++++++++++++ .../md_5/bungee/api/plugin/PluginManager.java | 67 +++++++++++++++++++ .../main/java/net/md_5/bungee/BungeeCord.java | 1 + .../java/net/md_5/bungee/Configuration.java | 1 + .../java/net/md_5/bungee/InitialHandler.java | 2 +- .../net/md_5/bungee/command/CommandAlert.java | 2 +- .../md_5/bungee/command/CommandBungee.java | 2 +- .../net/md_5/bungee/command/CommandEnd.java | 2 +- .../net/md_5/bungee/command/CommandIP.java | 2 +- .../net/md_5/bungee/command/CommandList.java | 2 +- .../net/md_5/bungee/command/CommandMotd.java | 2 +- .../md_5/bungee/command/CommandReload.java | 2 +- .../md_5/bungee/command/CommandServer.java | 2 +- .../bungee/command/ConsoleCommandSender.java | 2 +- 15 files changed, 122 insertions(+), 11 deletions(-) rename {proxy/src/main/java/net/md_5/bungee => api/src/main/java/net/md_5/bungee/api}/ChatColor.java (99%) create mode 100644 api/src/main/java/net/md_5/bungee/api/plugin/Command.java diff --git a/proxy/src/main/java/net/md_5/bungee/ChatColor.java b/api/src/main/java/net/md_5/bungee/api/ChatColor.java similarity index 99% rename from proxy/src/main/java/net/md_5/bungee/ChatColor.java rename to api/src/main/java/net/md_5/bungee/api/ChatColor.java index ca157672..a72c01d1 100644 --- a/proxy/src/main/java/net/md_5/bungee/ChatColor.java +++ b/api/src/main/java/net/md_5/bungee/api/ChatColor.java @@ -1,4 +1,4 @@ -package net.md_5.bungee; +package net.md_5.bungee.api; import java.util.regex.Pattern; diff --git a/api/src/main/java/net/md_5/bungee/api/plugin/Command.java b/api/src/main/java/net/md_5/bungee/api/plugin/Command.java new file mode 100644 index 00000000..d89a910d --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/plugin/Command.java @@ -0,0 +1,42 @@ +package net.md_5.bungee.api.plugin; + +import lombok.AccessLevel; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import net.md_5.bungee.api.CommandSender; + +/** + * A command that can be executed by a {@link CommandSender}. + */ +@Data +@RequiredArgsConstructor(access = AccessLevel.NONE) +public abstract class Command +{ + + private final String name; + private final String permission; + private final String[] aliases; + + /** + * Construct a new command. + * + * @param name primary name of this command + * @param permission the permission node required to execute this command, + * null or empty string allows it to be executed by everyone + * @param aliases aliases which map back to this command + */ + public Command(String name, String permission, String... aliases) + { + this.name = name; + this.permission = permission; + this.aliases = aliases; + } + + /** + * Execute this command with the specified sender and arguments. + * + * @param sender the executor of this command + * @param args arguments used to invoke this command + */ + public abstract void execute(CommandSender sender, String[] args); +} 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 8974c0a2..89ec5aa0 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 @@ -7,12 +7,16 @@ import java.io.File; import java.io.InputStream; import java.net.URL; import java.net.URLClassLoader; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.logging.Level; +import java.util.regex.Pattern; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.ProxyServer; import org.yaml.snakeyaml.Yaml; @@ -23,9 +27,72 @@ import org.yaml.snakeyaml.Yaml; public class PluginManager { + private static final Pattern argsSplit = Pattern.compile(" "); + /*========================================================================*/ private final Yaml yaml = new Yaml(); private final EventBus eventBus = new EventBus(); private final Map plugins = new HashMap<>(); + private final Map commandMap = new HashMap<>(); + + /** + * Register a command so that it may be executed. + * + * @param command the command to register + */ + public void registerCommand(Command command) + { + commandMap.put(command.getName(), command); + for (String alias : command.getAliases()) + { + commandMap.put(alias, command); + } + } + + /** + * Unregister a command so it will no longer be executed. + * + * @param command the command to unregister + */ + public void unregisterCommand(Command command) + { + commandMap.values().remove(command); + } + + /** + * Execute a command if it is registered, else return false. + * + * @param sender the sender executing the command + * @param commandLine the complete command line including command name and + * arguments + * @return whether the command was handled + */ + public boolean dispatchCommand(CommandSender sender, String commandLine) + { + String[] split = argsSplit.split(commandLine); + Command command = commandMap.get(split[0]); + if (command == null) + { + return false; + } + + String permission = command.getPermission(); + if (permission != null && !permission.isEmpty() && !sender.hasPermission(permission)) + { + sender.sendMessage(ChatColor.RED + "You do not have permission to execute this command!"); + return true; + } + + String[] args = Arrays.copyOfRange(split, 1, split.length); + try + { + command.execute(sender, args); + } catch (Exception ex) + { + sender.sendMessage(ChatColor.RED + "An internal error occurred whilst executing this command, please check the console log for details."); + ProxyServer.getInstance().getLogger().log(Level.WARNING, "Error in dispatching command", ex); + } + return true; + } /** * Returns the {@link Plugin} objects corresponding to all loaded plugins. diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java index b25ef180..c8d9fdf2 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -16,6 +16,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Level; import static net.md_5.bungee.Logger.$; +import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.command.*; import net.md_5.bungee.packet.DefinedPacket; import net.md_5.bungee.packet.PacketFAPluginMessage; diff --git a/proxy/src/main/java/net/md_5/bungee/Configuration.java b/proxy/src/main/java/net/md_5/bungee/Configuration.java index 23ec2af3..01b507b0 100644 --- a/proxy/src/main/java/net/md_5/bungee/Configuration.java +++ b/proxy/src/main/java/net/md_5/bungee/Configuration.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; import static net.md_5.bungee.Logger.$; +import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.command.CommandSender; import net.md_5.bungee.command.ConsoleCommandSender; import org.yaml.snakeyaml.DumperOptions; diff --git a/proxy/src/main/java/net/md_5/bungee/InitialHandler.java b/proxy/src/main/java/net/md_5/bungee/InitialHandler.java index 28872d34..b2fe6660 100644 --- a/proxy/src/main/java/net/md_5/bungee/InitialHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/InitialHandler.java @@ -1,12 +1,12 @@ package net.md_5.bungee; -import java.io.BufferedOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.util.ArrayList; import java.util.List; import javax.crypto.SecretKey; +import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.packet.Packet2Handshake; import net.md_5.bungee.packet.PacketFCEncryptionResponse; import net.md_5.bungee.packet.PacketFDEncryptionRequest; diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandAlert.java b/proxy/src/main/java/net/md_5/bungee/command/CommandAlert.java index 270e89c1..f8d1c761 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandAlert.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandAlert.java @@ -1,9 +1,9 @@ package net.md_5.bungee.command; import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.ChatColor; import net.md_5.bungee.Permission; import net.md_5.bungee.UserConnection; +import net.md_5.bungee.api.ChatColor; public class CommandAlert extends Command { diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java b/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java index 8ea902df..7e34debb 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java @@ -1,7 +1,7 @@ package net.md_5.bungee.command; import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.ChatColor; +import net.md_5.bungee.api.ChatColor; public class CommandBungee extends Command { diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandEnd.java b/proxy/src/main/java/net/md_5/bungee/command/CommandEnd.java index 3750dfd1..570d308c 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandEnd.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandEnd.java @@ -1,8 +1,8 @@ package net.md_5.bungee.command; import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.ChatColor; import net.md_5.bungee.Permission; +import net.md_5.bungee.api.ChatColor; /** * Command to terminate the proxy instance. May only be used by the console. diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandIP.java b/proxy/src/main/java/net/md_5/bungee/command/CommandIP.java index d1b75f4b..755f7b6c 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandIP.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandIP.java @@ -1,9 +1,9 @@ package net.md_5.bungee.command; import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.ChatColor; import net.md_5.bungee.Permission; import net.md_5.bungee.UserConnection; +import net.md_5.bungee.api.ChatColor; public class CommandIP extends Command { diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandList.java b/proxy/src/main/java/net/md_5/bungee/command/CommandList.java index 42584a4d..988106dd 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandList.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandList.java @@ -2,8 +2,8 @@ package net.md_5.bungee.command; import java.util.Collection; import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.ChatColor; import net.md_5.bungee.UserConnection; +import net.md_5.bungee.api.ChatColor; /** * Command to list all players connected to the proxy. diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java b/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java index 3d26c066..3acab4c1 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java @@ -1,8 +1,8 @@ package net.md_5.bungee.command; import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.ChatColor; import net.md_5.bungee.Permission; +import net.md_5.bungee.api.ChatColor; /** * Command to set a temp copy of the motd in real-time without stopping the diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandReload.java b/proxy/src/main/java/net/md_5/bungee/command/CommandReload.java index 18c922d0..337fdf1e 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandReload.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandReload.java @@ -1,8 +1,8 @@ package net.md_5.bungee.command; import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.ChatColor; import net.md_5.bungee.Permission; +import net.md_5.bungee.api.ChatColor; public class CommandReload extends Command { diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java b/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java index a2956b56..f7bdce4d 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java @@ -2,8 +2,8 @@ package net.md_5.bungee.command; import java.util.Collection; import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.ChatColor; import net.md_5.bungee.UserConnection; +import net.md_5.bungee.api.ChatColor; /** * Command to list and switch a player between available servers. diff --git a/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java b/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java index 79401a03..52d2216c 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java +++ b/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java @@ -1,6 +1,6 @@ package net.md_5.bungee.command; -import net.md_5.bungee.ChatColor; +import net.md_5.bungee.api.ChatColor; /** * Command sender representing the proxy console. From 7a137b7e347070d10a55f4b7fe5901f4db84960f Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 12 Jan 2013 12:29:22 +1100 Subject: [PATCH 17/45] Add API to allow overriding of the configuration storage system. --- .../java/net/md_5/bungee/api/ProxyServer.java | 10 ++++ .../api/config/ConfigurationAdapter.java | 57 +++++++++++++++++++ .../md_5/bungee/api/config/ListenerInfo.java | 26 +++++++++ .../md_5/bungee/api/config/ServerInfo.java | 27 +++++++++ .../md_5/bungee/api/connection/Server.java | 14 ++++- .../net/md_5/bungee/api/plugin/Plugin.java | 10 ++++ .../md_5/bungee/api/plugin/PluginManager.java | 26 +++++++-- 7 files changed, 165 insertions(+), 5 deletions(-) create mode 100644 api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java create mode 100644 api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java create mode 100644 api/src/main/java/net/md_5/bungee/api/config/ServerInfo.java 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 d6145f91..0f38f5b2 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 @@ -6,6 +6,8 @@ import com.google.common.base.Preconditions; import java.util.Collection; import java.util.logging.Logger; import lombok.Getter; +import net.md_5.bungee.api.config.ConfigurationAdapter; +import net.md_5.bungee.api.plugin.Plugin; public abstract class ProxyServer { @@ -63,4 +65,12 @@ public abstract class ProxyServer * @return the plugin manager */ public abstract PluginManager getPluginManager(); + + /** + * 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); } diff --git a/api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java b/api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java new file mode 100644 index 00000000..dc5f6fd8 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java @@ -0,0 +1,57 @@ +package net.md_5.bungee.api.config; + +import java.util.List; +import net.md_5.bungee.api.CommandSender; + +/** + * This class allows plugins to set their own configuration adapter to load + * settings from a different place. + */ +public interface ConfigurationAdapter +{ + + /** + * Gets an integer from the specified path. + * + * @param path the path to retrieve the integer from + * @return the retrieved integer + */ + public int getInt(String path); + + /** + * Gets a string from the specified path. + * + * @param path the path to retrieve the string from. + * @return the retrieved string + */ + public String getString(String path); + + /** + * Get a string list from the specified path. + * + * @param path the path to retrieve the list from. + * @return the retrieved list. + */ + public List getStringList(String path); + + /** + * Get the configuration all servers which may be accessible via the proxy. + * + * @return all accessible servers + */ + public List getServers(); + + /** + * Get information about all hosts to bind the proxy to. + * + * @return a list of all hosts to bind to + */ + public List getListeners(); + + /** + * Set the permissions of the specified {@link CommandSender} + * + * @param sender the sender to set permissions on. + */ + public void setPermissions(CommandSender sender); +} diff --git a/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java b/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java new file mode 100644 index 00000000..47e29389 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java @@ -0,0 +1,26 @@ +package net.md_5.bungee.api.config; + +import java.net.InetSocketAddress; +import lombok.Data; + +/** + * Class representing the configuration of a server listener. Used for allowing + * multiple listeners on different ports. + */ +@Data +public class ListenerInfo +{ + + /** + * Host to bind to. + */ + private final InetSocketAddress host; + /** + * Displayed motd. + */ + private final String motd; + /** + * Max amount of slots displayed on the ping page. + */ + private final int maxPlayers; +} diff --git a/api/src/main/java/net/md_5/bungee/api/config/ServerInfo.java b/api/src/main/java/net/md_5/bungee/api/config/ServerInfo.java new file mode 100644 index 00000000..65aee741 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/config/ServerInfo.java @@ -0,0 +1,27 @@ +package net.md_5.bungee.api.config; + +import java.net.InetSocketAddress; +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * Class used to represent a server to connect to. + */ +@Data +@AllArgsConstructor +public class ServerInfo +{ + + /** + * Name this server displays as. + */ + private final String name; + /** + * Connectable address of this server. + */ + private final InetSocketAddress address; + /** + * Permission node required to access this server. + */ + private String permission; +} diff --git a/api/src/main/java/net/md_5/bungee/api/connection/Server.java b/api/src/main/java/net/md_5/bungee/api/connection/Server.java index 6e746f04..268f63e8 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/Server.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/Server.java @@ -1,8 +1,10 @@ package net.md_5.bungee.api.connection; +import java.net.InetSocketAddress; import lombok.Getter; import lombok.RequiredArgsConstructor; import net.md_5.bungee.api.Callback; +import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.ServerPing; /** @@ -12,8 +14,18 @@ import net.md_5.bungee.api.ServerPing; public abstract class Server implements Connection { + /** + * Information about the address, name and configuration regarding this + * server. + */ @Getter - private final String name; + private final ServerInfo info; + + @Override + public InetSocketAddress getAddress() + { + return info.getAddress(); + } /** * Send data by any available means to this server. 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 5d50ef98..ce315855 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,6 +1,7 @@ package net.md_5.bungee.api.plugin; import lombok.Getter; +import net.md_5.bungee.api.config.ConfigurationAdapter; /** * Represents any Plugin that may be loaded at runtime to enhance existing @@ -12,6 +13,15 @@ public class Plugin @Getter private PluginDescription description; + /** + * Called when the plugin has just been loaded. Most of the proxy will not + * be initialized, so only use it for registering + * {@link ConfigurationAdapter}'s and other predefined behavior. + */ + public void onLoad() + { + } + /** * Called when this plugin is enabled. */ 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 89ec5aa0..0f16347d 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 @@ -115,14 +115,32 @@ public class PluginManager return plugins.get(name); } + /** + * Enable all plugins by calling the {@link Plugin#onEnable()} method. + */ + public void enablePlugins() + { + for (Map.Entry plugin : plugins.entrySet()) + { + try + { + plugin.getValue().onEnable(); + } catch (Exception ex) + { + ProxyServer.getInstance().getLogger().log(Level.WARNING, "Exception encountered when loading plugin: " + plugin.getKey(), ex); + } + } + } + /** * Load a plugin from the specified file. This file must be in jar format. + * This will not enable plugins, {@link #enablePlugins()} must be called. * * @param file the file to load from * @throws Exception Any exceptions encountered when loading a plugin from * this file. */ - public void load(File file) throws Exception + public void loadPlugin(File file) throws Exception { Preconditions.checkNotNull(file, "file"); Preconditions.checkArgument(file.isFile(), "Must load from file"); @@ -142,7 +160,7 @@ public class PluginManager plugin.init(desc); plugins.put(pdf.getName(), plugin); - plugin.onEnable(); + plugin.onLoad(); } } } @@ -152,7 +170,7 @@ public class PluginManager * * @param folder the folder to search for plugins in */ - public void loadAll(File folder) + public void loadPlugins(File folder) { Preconditions.checkNotNull(folder, "folder"); Preconditions.checkArgument(folder.isDirectory(), "Must load from a directory"); @@ -163,7 +181,7 @@ public class PluginManager { try { - load(file); + loadPlugin(file); } catch (Exception ex) { ProxyServer.getInstance().getLogger().log(Level.WARNING, "Could not load plugin from file " + file, ex); From febb661eb33e5b1b930f86362fa7a68a6271f65b Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 12 Jan 2013 12:36:41 +1100 Subject: [PATCH 18/45] Add more methods to sum up pending connection. --- .../api/connection/PendingConnection.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java b/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java index 54fc4e8e..4163239a 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java @@ -1,8 +1,31 @@ package net.md_5.bungee.api.connection; +import java.net.InetSocketAddress; + /** * Represents a user attempting to log into the proxy. */ public interface PendingConnection extends Connection { + + /** + * Get the requested username. + * + * @return the requested username, or null if not set + */ + public String getName(); + + /** + * Get the numerical client version of the player attempting to log in. + * + * @return the protocol version of the remote client + */ + public byte getVersion(); + + /** + * Get the requested virtual host that the client tried to connect to. + * + * @return request virtual host or null if invalid / not specified. + */ + public InetSocketAddress getVirtualHost(); } From 4ce799ac9bea4875620c14d1b774b834399461c3 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 12 Jan 2013 14:03:50 +1100 Subject: [PATCH 19/45] I think that just about sums up the API, requesting comments from everyone before I start implementing it. --- .../bungee/api/connection/ProxiedPlayer.java | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java index 166b43a6..efa662ad 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java @@ -1,11 +1,52 @@ package net.md_5.bungee.api.connection; +import lombok.Getter; +import lombok.Setter; import net.md_5.bungee.api.CommandSender; /** * Represents a player who's connection is being connected to somewhere else, * whether it be a remote or embedded server. */ -public interface ProxiedPlayer extends Connection, CommandSender +public abstract class ProxiedPlayer implements Connection, CommandSender { + + /** + * Name displayed to other users in areas such as the tab list. + */ + @Getter + @Setter + private String displayName; + + /** + * Connects / transfers this user to the specified connection, gracefully + * closing the current one. Depending on the implementation, this method + * might return before the user has been connected. + * + * @param server the new server to connect to + */ + public abstract void connect(Server server); + + /** + * Gets the ping time between the proxy and this connection. + * + * @return the current ping time + */ + public abstract int getPing(); + + /** + * Completely kick this user from the proxy and all of its child + * connections. + * + * @param reason the disconnect reason displayed to the player + */ + public abstract void disconnect(String reason); + + /** + * Send a plugin message to this player. + * + * @param channel the channel to send this data via + * @param data the data to send + */ + public abstract void sendData(String channel, byte[] data); } From ded4d52151d6a3c3e79a141d29127bce9483d77c Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 12 Jan 2013 14:17:02 +1100 Subject: [PATCH 20/45] Add ping event, change group management and other stuff. --- .../net/md_5/bungee/api/CommandSender.java | 39 ++++++++++++++++++- .../api/config/ConfigurationAdapter.java | 23 ++++++++--- .../api/connection/ConnectedPlayer.java | 2 +- .../net/md_5/bungee/api/event/LoginEvent.java | 7 +++- .../md_5/bungee/api/event/ProxyPingEvent.java | 32 +++++++++++++++ 5 files changed, 94 insertions(+), 9 deletions(-) create mode 100644 api/src/main/java/net/md_5/bungee/api/event/ProxyPingEvent.java diff --git a/api/src/main/java/net/md_5/bungee/api/CommandSender.java b/api/src/main/java/net/md_5/bungee/api/CommandSender.java index 7ba6288a..7570f457 100644 --- a/api/src/main/java/net/md_5/bungee/api/CommandSender.java +++ b/api/src/main/java/net/md_5/bungee/api/CommandSender.java @@ -5,17 +5,54 @@ import java.util.Collection; public interface CommandSender { + /** + * Get the unique name of this command sender. + * + * @return the senders username + */ public String getName(); + /** + * Send a message to this sender. + * + * @param message the message to send + */ public void sendMessage(String message); + /** + * Get all groups this user is part of. + * + * @return the users groups + */ public Collection getGroups(); + /** + * Adds groups to a this user for the current session only. + * + * @param groups the groups to add + */ public void addGroups(String... groups); + /** + * Remove groups from this user for the current session only. + * + * @param groups the groups to remove + */ public void removeGroups(String... groups); + /** + * Checks if this user has the specified permission node. + * + * @param permission the node to check + * @return whether they have this node + */ public boolean hasPermission(String permission); - public boolean setPermission(String permission, boolean value); + /** + * Set a permission node for this user. + * + * @param permission the node to set + * @param value the value of the node + */ + public void setPermission(String permission, boolean value); } diff --git a/api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java b/api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java index dc5f6fd8..0f3c3d14 100644 --- a/api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java +++ b/api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java @@ -1,5 +1,6 @@ package net.md_5.bungee.api.config; +import java.util.Collection; import java.util.List; import net.md_5.bungee.api.CommandSender; @@ -32,26 +33,36 @@ public interface ConfigurationAdapter * @param path the path to retrieve the list from. * @return the retrieved list. */ - public List getStringList(String path); + public Collection getStrings(String path); /** * Get the configuration all servers which may be accessible via the proxy. * * @return all accessible servers */ - public List getServers(); + public Collection getServers(); /** * Get information about all hosts to bind the proxy to. * * @return a list of all hosts to bind to */ - public List getListeners(); + public Collection getListeners(); /** - * Set the permissions of the specified {@link CommandSender} + * Get all groups this user is in. * - * @param sender the sender to set permissions on. + * @param user the user to check + * @return all the user's groups. */ - public void setPermissions(CommandSender sender); + public Collection getGroups(String user); + + /** + * Get all permission corresponding to the specified group. The result of + * this method may or may not be cached, depending on the implementation. + * + * @param group the group to check + * @return all true permissions for this group + */ + public Collection getPermissions(String group); } diff --git a/api/src/main/java/net/md_5/bungee/api/connection/ConnectedPlayer.java b/api/src/main/java/net/md_5/bungee/api/connection/ConnectedPlayer.java index cf09a65a..904edfb7 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/ConnectedPlayer.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/ConnectedPlayer.java @@ -3,6 +3,6 @@ package net.md_5.bungee.api.connection; /** * Represents a player physically connected to the world hosted on this server. */ -public interface ConnectedPlayer extends ProxiedPlayer +public abstract class ConnectedPlayer extends ProxiedPlayer { } diff --git a/api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java b/api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java index 8b7db16c..2da25457 100644 --- a/api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java +++ b/api/src/main/java/net/md_5/bungee/api/event/LoginEvent.java @@ -1,14 +1,19 @@ package net.md_5.bungee.api.event; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.plugin.Cancellable; +import net.md_5.bungee.api.plugin.Event; /** * Event called to represent a player logging in. */ @Data -public class LoginEvent implements Cancellable +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class LoginEvent extends Event implements Cancellable { /** diff --git a/api/src/main/java/net/md_5/bungee/api/event/ProxyPingEvent.java b/api/src/main/java/net/md_5/bungee/api/event/ProxyPingEvent.java new file mode 100644 index 00000000..e48e59cf --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/event/ProxyPingEvent.java @@ -0,0 +1,32 @@ +package net.md_5.bungee.api.event; + +import java.net.InetSocketAddress; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import net.md_5.bungee.api.ServerPing; +import net.md_5.bungee.api.config.ListenerInfo; +import net.md_5.bungee.api.plugin.Event; + +/** + * Called when the proxy is pinged with packet 0xFE from the server list. + */ +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class ProxyPingEvent extends Event +{ + + /** + * The address of the user pinging. + */ + private final InetSocketAddress remoteAddress; + /** + * The data corresponding to the server which received this ping. + */ + private final ListenerInfo server; + /** + * The data to respond with. + */ + private ServerPing response; +} From 6dda7e1c147751050dccc8d0368c2566db535782 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 12 Jan 2013 14:19:16 +1100 Subject: [PATCH 21/45] Just in case people make directories ending in .jar --- api/src/main/java/net/md_5/bungee/api/plugin/PluginManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 0f16347d..684f4141 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 @@ -177,7 +177,7 @@ public class PluginManager for (File file : folder.listFiles()) { - if (file.getName().endsWith(".jar")) + if (file.isFile() && file.getName().endsWith(".jar")) { try { From 6b6aae8020da2f3e231e763cdceccc01670ecaae Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 12 Jan 2013 14:24:39 +1100 Subject: [PATCH 22/45] Maven ocd --- pom.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 360d920c..ca0dd096 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,6 @@ - - + + 4.0.0 @@ -36,8 +37,8 @@ - proxy api + proxy From a946e988bf57eedf2331efb47b9be9e85f66b9f8 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 12 Jan 2013 14:40:58 +1100 Subject: [PATCH 23/45] Add server getPlayer method and rename the ping/getPlayerCount methods. --- api/src/main/java/net/md_5/bungee/api/ProxyServer.java | 7 ++++--- .../java/net/md_5/bungee/api/connection/Server.java | 10 +++++++++- 2 files changed, 13 insertions(+), 4 deletions(-) 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 0f38f5b2..b95321cd 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 @@ -7,6 +7,7 @@ import java.util.Collection; import java.util.logging.Logger; import lombok.Getter; import net.md_5.bungee.api.config.ConfigurationAdapter; +import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Plugin; public abstract class ProxyServer @@ -51,11 +52,11 @@ public abstract class ProxyServer public abstract Logger getLogger(); /** - * Return all currently networked connections to this proxy. + * Return all players currently connected. * - * @return all networked users + * @return all connected players */ - public abstract Collection getConnections(); + public abstract Collection getPlayers(); /** * Get the {@link PluginManager} associated with loading plugins and diff --git a/api/src/main/java/net/md_5/bungee/api/connection/Server.java b/api/src/main/java/net/md_5/bungee/api/connection/Server.java index 268f63e8..692729ad 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/Server.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/Server.java @@ -1,6 +1,7 @@ package net.md_5.bungee.api.connection; import java.net.InetSocketAddress; +import java.util.Collection; import lombok.Getter; import lombok.RequiredArgsConstructor; import net.md_5.bungee.api.Callback; @@ -40,5 +41,12 @@ public abstract class Server implements Connection * * @param callback the callback to call when the count has been retrieved. */ - public abstract void getPlayerCount(Callback callback); + public abstract void ping(Callback callback); + + /** + * Get all players on this instance connected to this server. + * + * @return all players connected to this server + */ + public abstract Collection getPlayers(); } From fe6b40a6a8ecb61c702917c97219846165428d60 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 12 Jan 2013 14:43:21 +1100 Subject: [PATCH 24/45] Add methods to get players / servers. --- .../java/net/md_5/bungee/api/ProxyServer.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) 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 b95321cd..609db868 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 @@ -1,6 +1,5 @@ package net.md_5.bungee.api; -import net.md_5.bungee.api.connection.Connection; import net.md_5.bungee.api.plugin.PluginManager; import com.google.common.base.Preconditions; import java.util.Collection; @@ -8,6 +7,7 @@ import java.util.logging.Logger; import lombok.Getter; import net.md_5.bungee.api.config.ConfigurationAdapter; import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.plugin.Plugin; public abstract class ProxyServer @@ -58,6 +58,29 @@ public abstract class ProxyServer */ public abstract Collection getPlayers(); + /** + * Gets a connected player via their unique username. + * + * @param name of the player + * @return their player instance + */ + public abstract ProxiedPlayer getPlayer(String name); + + /** + * Get a server by its name. + * + * @param name the name to lookup + * @return the associated server + */ + public abstract Server getServer(String name); + + /** + * Return all servers configured as proxy targets. + * + * @return all known target servers + */ + public abstract Collection getServers(); + /** * Get the {@link PluginManager} associated with loading plugins and * dispatching events. It is recommended that implementations use the From 8c942e299f2ca84ce0467af6d3af7016e2b47280 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 12 Jan 2013 17:31:21 +1100 Subject: [PATCH 25/45] Tad more Javadoc --- .../main/java/net/md_5/bungee/api/ServerPing.java | 15 +++++++++++++++ .../bungee/api/config/ConfigurationAdapter.java | 10 ++++------ .../net/md_5/bungee/api/config/ListenerInfo.java | 2 +- .../net/md_5/bungee/api/event/TargetedEvent.java | 6 ++++++ .../md_5/bungee/api/plugin/PluginDescription.java | 15 +++++++++++++++ 5 files changed, 41 insertions(+), 7 deletions(-) diff --git a/api/src/main/java/net/md_5/bungee/api/ServerPing.java b/api/src/main/java/net/md_5/bungee/api/ServerPing.java index a12498a1..d1dda171 100644 --- a/api/src/main/java/net/md_5/bungee/api/ServerPing.java +++ b/api/src/main/java/net/md_5/bungee/api/ServerPing.java @@ -10,9 +10,24 @@ import lombok.Data; public class ServerPing { + /** + * Numeric protocol version supported by the server. + */ private final byte protocolVersion; + /** + * Human readable game version. + */ private final String gameVersion; + /** + * Server MOTD. + */ private final String motd; + /** + * Current amount of players on the server. + */ private final String currentPlayers; + /** + * Max amount of players the server will allow. + */ private final String maxPlayers; } diff --git a/api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java b/api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java index 0f3c3d14..7e5981d5 100644 --- a/api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java +++ b/api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java @@ -1,8 +1,6 @@ package net.md_5.bungee.api.config; import java.util.Collection; -import java.util.List; -import net.md_5.bungee.api.CommandSender; /** * This class allows plugins to set their own configuration adapter to load @@ -50,12 +48,12 @@ public interface ConfigurationAdapter public Collection getListeners(); /** - * Get all groups this user is in. + * Get all groups this player is in. * - * @param user the user to check - * @return all the user's groups. + * @param player the player to check + * @return all the player's groups. */ - public Collection getGroups(String user); + public Collection getGroups(String player); /** * Get all permission corresponding to the specified group. The result of diff --git a/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java b/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java index 47e29389..84765ad7 100644 --- a/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java +++ b/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java @@ -16,7 +16,7 @@ public class ListenerInfo */ private final InetSocketAddress host; /** - * Displayed motd. + * Displayed MOTD. */ private final String motd; /** diff --git a/api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java b/api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java index b4d3208c..800990b8 100644 --- a/api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java +++ b/api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java @@ -15,6 +15,12 @@ import net.md_5.bungee.api.connection.Connection; public abstract class TargetedEvent { + /** + * Creator of the action. + */ private Connection sender; + /** + * Receiver of the action. + */ private Connection receiver; } 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 index 6f124efa..0739cec8 100644 --- 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 @@ -2,12 +2,27 @@ package net.md_5.bungee.api.plugin; import lombok.Data; +/** + * POJO representing the plugin.yml file. + */ @Data public class PluginDescription { + /** + * Friendly name of the plugin. + */ private final String name; + /** + * Plugin main class. Needs to extend {@link Plugin}. + */ private final String main; + /** + * Plugin version. + */ private final String version; + /** + * Plugin author. + */ private final String author; } From 098ca5920e9dfa2f5ec0e2e8bb5cea646f332ffc Mon Sep 17 00:00:00 2001 From: md_5 Date: Wed, 16 Jan 2013 11:16:21 +1100 Subject: [PATCH 26/45] Start a hugely messy implementation of the API --- .../java/net/md_5/bungee/api/ProxyServer.java | 10 ++ .../bungee/api/connection/ProxiedPlayer.java | 7 + .../net/md_5/bungee/api/plugin/Command.java | 10 ++ .../main/java/net/md_5/bungee/BungeeCord.java | 96 ++++++++++--- .../main/java/net/md_5/bungee/Permission.java | 18 --- .../net/md_5/bungee/ReconnectSaveThread.java | 30 ----- .../java/net/md_5/bungee/command/Command.java | 26 ---- .../net/md_5/bungee/command/CommandAlert.java | 21 +-- .../md_5/bungee/command/CommandBungee.java | 8 +- .../net/md_5/bungee/command/CommandEnd.java | 17 ++- .../net/md_5/bungee/command/CommandIP.java | 19 +-- .../net/md_5/bungee/command/CommandList.java | 26 ++-- .../net/md_5/bungee/command/CommandMotd.java | 25 ++-- .../md_5/bungee/command/CommandReload.java | 16 ++- .../md_5/bungee/command/CommandSender.java | 19 --- .../md_5/bungee/command/CommandServer.java | 36 +++-- .../bungee/command/ConsoleCommandSender.java | 33 +++++ .../net/md_5/bungee/plugin/Cancellable.java | 22 --- .../net/md_5/bungee/plugin/ChatEvent.java | 36 ----- .../bungee/plugin/InvalidPluginException.java | 20 --- .../net/md_5/bungee/plugin/JavaPlugin.java | 75 ----------- .../md_5/bungee/plugin/JavaPluginManager.java | 127 ------------------ .../net/md_5/bungee/plugin/LoginEvent.java | 33 ----- .../md_5/bungee/plugin/PluginDescription.java | 48 ------- .../bungee/plugin/PluginMessageEvent.java | 47 ------- .../bungee/plugin/ServerConnectEvent.java | 33 ----- .../bungee/tablist/GlobalPingTabList.java | 12 +- .../md_5/bungee/tablist/GlobalTabList.java | 32 ++--- .../bungee/tablist/ServerUniqueTabList.java | 45 ++++--- .../md_5/bungee/tablist/TabListHandler.java | 18 --- 30 files changed, 275 insertions(+), 690 deletions(-) delete mode 100644 proxy/src/main/java/net/md_5/bungee/Permission.java delete mode 100644 proxy/src/main/java/net/md_5/bungee/ReconnectSaveThread.java delete mode 100644 proxy/src/main/java/net/md_5/bungee/command/Command.java delete mode 100644 proxy/src/main/java/net/md_5/bungee/command/CommandSender.java delete mode 100644 proxy/src/main/java/net/md_5/bungee/plugin/Cancellable.java delete mode 100644 proxy/src/main/java/net/md_5/bungee/plugin/ChatEvent.java delete mode 100644 proxy/src/main/java/net/md_5/bungee/plugin/InvalidPluginException.java delete mode 100644 proxy/src/main/java/net/md_5/bungee/plugin/JavaPlugin.java delete mode 100644 proxy/src/main/java/net/md_5/bungee/plugin/JavaPluginManager.java delete mode 100644 proxy/src/main/java/net/md_5/bungee/plugin/LoginEvent.java delete mode 100644 proxy/src/main/java/net/md_5/bungee/plugin/PluginDescription.java delete mode 100644 proxy/src/main/java/net/md_5/bungee/plugin/PluginMessageEvent.java delete mode 100644 proxy/src/main/java/net/md_5/bungee/plugin/ServerConnectEvent.java delete mode 100644 proxy/src/main/java/net/md_5/bungee/tablist/TabListHandler.java 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 609db868..9f9280cd 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 @@ -97,4 +97,14 @@ public abstract class ProxyServer * @param adapter the adapter to use */ public abstract void setConfigurationAdapter(ConfigurationAdapter adapter); + + /** + * Gracefully mark this instance for shutdown. + */ + public abstract void stop(); + + /** + * Start this instance so that it may accept connections. + */ + public abstract void start(); } diff --git a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java index efa662ad..30a6cfaa 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java @@ -27,6 +27,13 @@ public abstract class ProxiedPlayer implements Connection, CommandSender */ public abstract void connect(Server server); + /** + * Gets the server this player is connected to. + * + * @return the server this player is connected to + */ + public abstract Server getServer(); + /** * Gets the ping time between the proxy and this connection. * diff --git a/api/src/main/java/net/md_5/bungee/api/plugin/Command.java b/api/src/main/java/net/md_5/bungee/api/plugin/Command.java index d89a910d..9f5d088f 100644 --- a/api/src/main/java/net/md_5/bungee/api/plugin/Command.java +++ b/api/src/main/java/net/md_5/bungee/api/plugin/Command.java @@ -17,6 +17,16 @@ public abstract class Command private final String permission; private final String[] aliases; + /** + * Construct a new command with no permissions or aliases. + * + * @param name the name of this command + */ + public Command(String name) + { + this(name, null); + } + /** * Construct a new command. * diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java index c8d9fdf2..7cb20d28 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -6,17 +6,26 @@ import java.io.InputStreamReader; import java.net.InetSocketAddress; import java.net.Socket; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Queue; +import java.util.Timer; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Level; +import java.util.logging.Logger; +import lombok.Getter; import static net.md_5.bungee.Logger.$; import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.config.ConfigurationAdapter; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.connection.Server; +import net.md_5.bungee.api.plugin.PluginManager; import net.md_5.bungee.command.*; import net.md_5.bungee.packet.DefinedPacket; import net.md_5.bungee.packet.PacketFAPluginMessage; @@ -29,7 +38,7 @@ import net.md_5.bungee.tablist.TabListHandler; /** * Main BungeeCord proxy class. */ -public class BungeeCord +public class BungeeCord extends ProxyServer { /** @@ -40,10 +49,6 @@ public class BungeeCord * Server game version. */ public static final String GAME_VERSION = "1.4.6"; - /** - * Current software instance. - */ - public static BungeeCord instance; /** * Current operation state. */ @@ -59,7 +64,7 @@ public class BungeeCord /** * locations.yml save thread. */ - private final ReconnectSaveThread saveThread = new ReconnectSaveThread(); + private final Timer saveThread = new Timer("Reconnect Saver"); /** * Server socket listener. */ @@ -88,18 +93,20 @@ public class BungeeCord /** * Plugin manager. */ - public final JavaPluginManager pluginManager = new JavaPluginManager(); + @Getter + public final PluginManager pluginManager = new PluginManager(); { - commandMap.put("greload", new CommandReload()); - commandMap.put("end", new CommandEnd()); - commandMap.put("glist", new CommandList()); - commandMap.put("server", new CommandServer()); - commandMap.put("ip", new CommandIP()); - commandMap.put("alert", new CommandAlert()); - commandMap.put("motd", new CommandMotd()); - commandMap.put("bungee", new CommandBungee()); + getPluginManager().registerCommand(new CommandReload()); + getPluginManager().registerCommand(new CommandReload()); + getPluginManager().registerCommand(new CommandEnd()); + getPluginManager().registerCommand(new CommandList()); + getPluginManager().registerCommand(new CommandServer()); + getPluginManager().registerCommand(new CommandIP()); + getPluginManager().registerCommand(new CommandAlert()); + getPluginManager().registerCommand(new CommandMotd()); + getPluginManager().registerCommand(new CommandBungee()); } /** @@ -110,17 +117,18 @@ public class BungeeCord */ public static void main(String[] args) throws IOException { - instance = new BungeeCord(); - $().info("Enabled BungeeCord version " + instance.version); - instance.start(); + BungeeCord bungee = new BungeeCord(); + ProxyServer.setInstance(bungee); + $().info("Enabled BungeeCord version " + bungee.getVersion()); + bungee.start(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - while (instance.isRunning) + while (bungee.isRunning) { String line = br.readLine(); if (line != null) { - boolean handled = instance.dispatchCommand(line, ConsoleCommandSender.instance); + boolean handled = getInstance().getPluginManager().dispatchCommand(ConsoleCommandSender.instance, line); if (!handled) { System.err.println("Command not found"); @@ -338,4 +346,52 @@ public class BungeeCord globalPluginChannels.add(channel); broadcast(new PacketFAPluginMessage("REGISTER", channel.getBytes())); } + + @Override + public String getName() + { + return "BungeeCord"; + } + + @Override + public String getVersion() + { + return version; + } + + @Override + public Logger getLogger() + { + return $(); + } + + @Override + public Collection getPlayers() + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public ProxiedPlayer getPlayer(String name) + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public Server getServer(String name) + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public Collection getServers() + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void setConfigurationAdapter(ConfigurationAdapter adapter) + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } } diff --git a/proxy/src/main/java/net/md_5/bungee/Permission.java b/proxy/src/main/java/net/md_5/bungee/Permission.java deleted file mode 100644 index 7a912ad7..00000000 --- a/proxy/src/main/java/net/md_5/bungee/Permission.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.md_5.bungee; - -public enum Permission -{ - - /** - * Can access all commands. - */ - ADMIN, - /** - * Can access commands which do not affect everyone. - */ - MODERATOR, - /** - * Can access other commands. - */ - DEFAULT; -} diff --git a/proxy/src/main/java/net/md_5/bungee/ReconnectSaveThread.java b/proxy/src/main/java/net/md_5/bungee/ReconnectSaveThread.java deleted file mode 100644 index 92745688..00000000 --- a/proxy/src/main/java/net/md_5/bungee/ReconnectSaveThread.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.md_5.bungee; - -/** - * Class to call the {@link Configuration#saveHosts() } method at 5 minute - * intervals. - */ -public class ReconnectSaveThread extends Thread -{ - - public ReconnectSaveThread() - { - super("Location Save Thread"); - setPriority(Thread.MIN_PRIORITY); - } - - @Override - public void run() - { - while (BungeeCord.instance.isRunning) - { - try - { - Thread.sleep(5 * 1000 * 60); // 5 minutes - } catch (InterruptedException ex) - { - } - BungeeCord.instance.config.saveHosts(); - } - } -} diff --git a/proxy/src/main/java/net/md_5/bungee/command/Command.java b/proxy/src/main/java/net/md_5/bungee/command/Command.java deleted file mode 100644 index f08336e7..00000000 --- a/proxy/src/main/java/net/md_5/bungee/command/Command.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.md_5.bungee.command; - -import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.Permission; - -/** - * Class which represents a proxy command. The {@link #execute(net.md_5.bungee.command.CommandSender, java.lang.String[]) - * } method will be called to dispatch the command. - */ -public abstract class Command -{ - - /** - * Execute this command. - * - * @param sender the sender executing this command - * @param args the parameters to this command, does not include the '/' or - * the original command. - */ - public abstract void execute(CommandSender sender, String[] args); - - public Permission getPermission(CommandSender sender) - { - return BungeeCord.instance.config.getPermission(sender); - } -} diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandAlert.java b/proxy/src/main/java/net/md_5/bungee/command/CommandAlert.java index f8d1c761..5958c967 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandAlert.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandAlert.java @@ -1,21 +1,22 @@ package net.md_5.bungee.command; -import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.Permission; -import net.md_5.bungee.UserConnection; import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.plugin.Command; public class CommandAlert extends Command { + public CommandAlert() + { + super("alert", "bungee.command.alert"); + } + @Override public void execute(CommandSender sender, String[] args) { - if (getPermission(sender) != Permission.ADMIN) - { - sender.sendMessage(ChatColor.RED + "You do not have permission to execute this command!"); - return; - } if (args.length == 0) { sender.sendMessage(ChatColor.RED + "You must supply a message."); @@ -36,9 +37,9 @@ public class CommandAlert extends Command } String message = builder.substring(0, builder.length() - 1); - for (UserConnection con : BungeeCord.instance.connections.values()) + for (ProxiedPlayer player : ProxyServer.getInstance().getPlayers()) { - con.sendMessage(message); + player.sendMessage(message); } } } diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java b/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java index 7e34debb..490e81b9 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java @@ -2,14 +2,20 @@ package net.md_5.bungee.command; import net.md_5.bungee.BungeeCord; import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.plugin.Command; public class CommandBungee extends Command { + public CommandBungee() + { + super("bungee"); + } + @Override public void execute(CommandSender sender, String[] args) { sender.sendMessage(ChatColor.BLUE + "This server is running BungeeCord version " + BungeeCord.version + " by md_5"); - sender.sendMessage(ChatColor.BLUE + "Your current permission level is " + getPermission(sender).name()); } } diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandEnd.java b/proxy/src/main/java/net/md_5/bungee/command/CommandEnd.java index 570d308c..349ef805 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandEnd.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandEnd.java @@ -1,8 +1,8 @@ package net.md_5.bungee.command; import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.Permission; -import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.plugin.Command; /** * Command to terminate the proxy instance. May only be used by the console. @@ -10,15 +10,14 @@ import net.md_5.bungee.api.ChatColor; public class CommandEnd extends Command { + public CommandEnd() + { + super("end", "bungeecord.command.end"); + } + @Override public void execute(CommandSender sender, String[] args) { - if (getPermission(sender) != Permission.ADMIN) - { - sender.sendMessage(ChatColor.RED + "You do not have permission to use this command"); - } else - { - BungeeCord.instance.stop(); - } + BungeeCord.getInstance().stop(); } } diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandIP.java b/proxy/src/main/java/net/md_5/bungee/command/CommandIP.java index 755f7b6c..b11c7fea 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandIP.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandIP.java @@ -1,27 +1,28 @@ package net.md_5.bungee.command; -import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.Permission; -import net.md_5.bungee.UserConnection; import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.plugin.Command; public class CommandIP extends Command { + public CommandIP() + { + super("ip", "bungeecord.command.ip"); + } + @Override public void execute(CommandSender sender, String[] args) { - if (getPermission(sender) != Permission.MODERATOR && getPermission(sender) != Permission.ADMIN) - { - sender.sendMessage(ChatColor.RED + "You do not have permission to use this command"); - return; - } if (args.length < 1) { sender.sendMessage(ChatColor.RED + "Please follow this command by a user name"); return; } - UserConnection user = BungeeCord.instance.connections.get(args[0]); + ProxiedPlayer user = ProxyServer.getInstance().getPlayer(args[0]); if (user == null) { sender.sendMessage(ChatColor.RED + "That user is not online"); diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandList.java b/proxy/src/main/java/net/md_5/bungee/command/CommandList.java index 988106dd..f836b26b 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandList.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandList.java @@ -1,9 +1,11 @@ package net.md_5.bungee.command; import java.util.Collection; -import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.UserConnection; import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.plugin.Command; /** * Command to list all players connected to the proxy. @@ -11,11 +13,16 @@ import net.md_5.bungee.api.ChatColor; public class CommandList extends Command { + public CommandList() + { + super("list", "bungeecord.command.list"); + } + @Override public void execute(CommandSender sender, String[] args) { StringBuilder users = new StringBuilder(); - Collection connections = BungeeCord.instance.connections.values(); + Collection connections = ProxyServer.getInstance().getPlayers(); if (connections.isEmpty()) { @@ -23,18 +30,9 @@ public class CommandList extends Command return; } - for (UserConnection con : connections) + for (ProxiedPlayer player : connections) { - switch (getPermission(con)) - { - case ADMIN: - users.append(ChatColor.RED); - break; - case MODERATOR: - users.append(ChatColor.GREEN); - break; - } - users.append(con.username); + users.append(player.getDisplayName()); users.append(", "); users.append(ChatColor.RESET); } diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java b/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java index 3acab4c1..22a5ee1c 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java @@ -1,8 +1,10 @@ package net.md_5.bungee.command; import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.Permission; import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.plugin.Command; /** * Command to set a temp copy of the motd in real-time without stopping the @@ -11,21 +13,20 @@ import net.md_5.bungee.api.ChatColor; public class CommandMotd extends Command { + public CommandMotd() + { + super("bungeecord.command.motd"); + } + @Override public void execute(CommandSender sender, String[] args) { - if (getPermission(sender) != Permission.ADMIN) + StringBuilder newMOTD = new StringBuilder(); + for (String s : args) { - sender.sendMessage(ChatColor.RED + "You do not have permission to use this command"); - } else - { - String newMOTD = ""; - for (String s : args) - { - newMOTD = newMOTD + s + " "; - } - newMOTD = newMOTD.substring(0, newMOTD.length() - 1); - BungeeCord.instance.config.motd = ChatColor.translateAlternateColorCodes('&', newMOTD); + newMOTD.append(s); + newMOTD.append(" "); } + ((BungeeCord) ProxyServer.getInstance()).config.motd = ChatColor.translateAlternateColorCodes('&', newMOTD.substring(0, newMOTD.length() - 1)); } } diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandReload.java b/proxy/src/main/java/net/md_5/bungee/command/CommandReload.java index 337fdf1e..268a8d46 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandReload.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandReload.java @@ -1,21 +1,23 @@ package net.md_5.bungee.command; import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.Permission; import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.plugin.Command; public class CommandReload extends Command { + public CommandReload() + { + super("greload", "bungeecord.command.reload"); + } + @Override public void execute(CommandSender sender, String[] args) { - if (getPermission(sender) != Permission.ADMIN) - { - sender.sendMessage(ChatColor.RED + "You do not have permission to execute this command!"); - return; - } - BungeeCord.instance.config.load(); + ((BungeeCord) ProxyServer.getInstance()).config.load(); sender.sendMessage(ChatColor.GREEN + "Reloaded config, please restart if you have any issues"); } } diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandSender.java b/proxy/src/main/java/net/md_5/bungee/command/CommandSender.java deleted file mode 100644 index fb0adf36..00000000 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandSender.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.md_5.bungee.command; - -public interface CommandSender -{ - - /** - * Sends a message to the client at the earliest available opportunity. - * - * @param message the message to send - */ - public abstract void sendMessage(String message); - - /** - * Get the senders name or CONSOLE for console. - * - * @return the friendly name of the player. - */ - public abstract String getName(); -} diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java b/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java index f7bdce4d..746b585a 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java @@ -4,6 +4,11 @@ import java.util.Collection; import net.md_5.bungee.BungeeCord; import net.md_5.bungee.UserConnection; import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.connection.Server; +import net.md_5.bungee.api.plugin.Command; /** * Command to list and switch a player between available servers. @@ -11,37 +16,42 @@ import net.md_5.bungee.api.ChatColor; public class CommandServer extends Command { + public CommandServer() + { + super("server", "bungeecord.command.server"); + } + @Override public void execute(CommandSender sender, String[] args) { - if (!(sender instanceof UserConnection)) + if (!(sender instanceof ProxiedPlayer)) { return; } - UserConnection con = (UserConnection) sender; - Collection servers = BungeeCord.instance.config.servers.keySet(); - if (args.length <= 0) + ProxiedPlayer player = (ProxiedPlayer) sender; + Collection servers = ProxyServer.getInstance().getServers(); + if (args.length == 0) { StringBuilder serverList = new StringBuilder(); - for (String server : servers) + for (Server server : servers) { - serverList.append(server); + serverList.append(server.getInfo().getName()); serverList.append(", "); } serverList.setLength(serverList.length() - 2); - con.sendMessage(ChatColor.GOLD + "You may connect to the following servers at this time: " + serverList.toString()); + player.sendMessage(ChatColor.GOLD + "You may connect to the following servers at this time: " + serverList.toString()); } else { - String server = args[0]; - if (!servers.contains(server)) + Server server = ProxyServer.getInstance().getServer(args[0]); + if (server == null) { - con.sendMessage(ChatColor.RED + "The specified server does not exist"); - } else if (args[0].equals(con.getServer())) + player.sendMessage(ChatColor.RED + "The specified server does not exist"); + } else if (server == player.getServer()) { - con.sendMessage(ChatColor.RED + "You are already on this server."); + player.sendMessage(ChatColor.RED + "You are already on this server."); } else { - con.connect(server); + player.connect(server); } } } diff --git a/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java b/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java index 52d2216c..77a1a956 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java +++ b/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java @@ -1,6 +1,9 @@ package net.md_5.bungee.command; +import java.util.Collection; +import java.util.Collections; import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.CommandSender; /** * Command sender representing the proxy console. @@ -21,4 +24,34 @@ public class ConsoleCommandSender implements CommandSender { return "CONSOLE"; } + + @Override + public Collection getGroups() + { + return Collections.emptySet(); + } + + @Override + public void addGroups(String... groups) + { + throw new UnsupportedOperationException("Console may not have groups"); + } + + @Override + public void removeGroups(String... groups) + { + throw new UnsupportedOperationException("Console may not have groups"); + } + + @Override + public boolean hasPermission(String permission) + { + return true; + } + + @Override + public void setPermission(String permission, boolean value) + { + throw new UnsupportedOperationException("Console has all permissions"); + } } diff --git a/proxy/src/main/java/net/md_5/bungee/plugin/Cancellable.java b/proxy/src/main/java/net/md_5/bungee/plugin/Cancellable.java deleted file mode 100644 index f4c9bceb..00000000 --- a/proxy/src/main/java/net/md_5/bungee/plugin/Cancellable.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.md_5.bungee.plugin; - -/** - * An event which may be canceled and this be prevented from happening. - */ -public interface Cancellable -{ - - /** - * Sets the canceled state of this event. - * - * @param canceled whether this event is canceled or not - */ - public void setCancelled(boolean canceled); - - /** - * Gets the canceled state of this event. - * - * @return whether this event is canceled or not - */ - public boolean isCancelled(); -} diff --git a/proxy/src/main/java/net/md_5/bungee/plugin/ChatEvent.java b/proxy/src/main/java/net/md_5/bungee/plugin/ChatEvent.java deleted file mode 100644 index 76fab296..00000000 --- a/proxy/src/main/java/net/md_5/bungee/plugin/ChatEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.md_5.bungee.plugin; - -import lombok.Data; -import net.md_5.bungee.UserConnection; - -@Data -public class ChatEvent implements Cancellable -{ - - /** - * Canceled state. - */ - private boolean cancelled; - /** - * Whether this packet is destined for the server or the client. - */ - private final Destination destination; - /** - * User in question. - */ - private final UserConnection connection; - /** - * Text contained in this chat. - */ - private String text; - - /** - * An enum that signifies the destination for this packet. - */ - public enum Destination - { - - SERVER, - CLIENT - } -} diff --git a/proxy/src/main/java/net/md_5/bungee/plugin/InvalidPluginException.java b/proxy/src/main/java/net/md_5/bungee/plugin/InvalidPluginException.java deleted file mode 100644 index 1c277afd..00000000 --- a/proxy/src/main/java/net/md_5/bungee/plugin/InvalidPluginException.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.md_5.bungee.plugin; - -/** - * Exception thrown when a plugin could not be loaded for any reason. - */ -public class InvalidPluginException extends RuntimeException -{ - - private static final long serialVersionUID = 1L; - - public InvalidPluginException(String message, Throwable cause) - { - super(message, cause); - } - - public InvalidPluginException(String message) - { - super(message); - } -} diff --git a/proxy/src/main/java/net/md_5/bungee/plugin/JavaPlugin.java b/proxy/src/main/java/net/md_5/bungee/plugin/JavaPlugin.java deleted file mode 100644 index 74bbe182..00000000 --- a/proxy/src/main/java/net/md_5/bungee/plugin/JavaPlugin.java +++ /dev/null @@ -1,75 +0,0 @@ -package net.md_5.bungee.plugin; - -import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.command.Command; - -/** - * Base class which all proxy plugins should extend. - */ -public abstract class JavaPlugin -{ - - /** - * Description file. - */ - PluginDescription description; - - /** - * Called on enable. - */ - public void onEnable() - { - } - - /** - * Called on disable. - */ - public void onDisable() - { - } - - /** - * Called when a user connects with their name and address. To keep things - * simple this name has not been checked with minecraft.net. - */ - public void onHandshake(LoginEvent event) - { - } - - /** - * Called after a user has been authed with minecraftt.net and is about to - * log into the proxy. - */ - public void onLogin(LoginEvent event) - { - } - - /** - * Called when a user is connecting to a new server. - */ - public void onServerConnect(ServerConnectEvent event) - { - } - - /** - * Called when a plugin message is sent to the client or server - */ - public void onPluginMessage(PluginMessageEvent event) - { - } - - /** - * Called when a chat message is sent to the client or server - */ - public void onChat(ChatEvent event) - { - } - - /** - * Register a command for use with the proxy. - */ - protected final void registerCommand(String label, Command command) - { - BungeeCord.instance.commandMap.put(label, command); - } -} diff --git a/proxy/src/main/java/net/md_5/bungee/plugin/JavaPluginManager.java b/proxy/src/main/java/net/md_5/bungee/plugin/JavaPluginManager.java deleted file mode 100644 index 1a695cc9..00000000 --- a/proxy/src/main/java/net/md_5/bungee/plugin/JavaPluginManager.java +++ /dev/null @@ -1,127 +0,0 @@ -package net.md_5.bungee.plugin; - -import com.google.common.io.PatternFilenameFilter; -import java.io.File; -import java.io.InputStream; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.HashSet; -import java.util.Set; -import java.util.jar.JarFile; -import java.util.zip.ZipEntry; -import lombok.Getter; -import static net.md_5.bungee.Logger.$; - -/** - * Plugin manager to handle loading and saving other JavaPlugin's. This class is - * itself a plugin for ease of use. - */ -public class JavaPluginManager extends JavaPlugin -{ - - /** - * Set of loaded plugins. - */ - @Getter - private final Set plugins = new HashSet<>(); - - /** - * Load all plugins from the plugins folder. This method must only be called - * once per instance. - */ - public void loadPlugins() - { - File dir = new File("plugins"); - dir.mkdir(); - - for (File file : dir.listFiles(new PatternFilenameFilter(".*\\.jar"))) - { - try - { - JarFile jar = new JarFile(file); - ZipEntry entry = jar.getEntry("plugin.yml"); - if (entry == null) - { - throw new InvalidPluginException("Jar does not contain a plugin.yml"); - } - - PluginDescription description; - try (InputStream is = jar.getInputStream(entry)) - { - description = PluginDescription.load(is); - } - URLClassLoader classloader = new URLClassLoader(new URL[] - { - file.toURI().toURL() - }, getClass().getClassLoader()); - Class clazz = Class.forName(description.getMain(), true, classloader); - Class subClazz = clazz.asSubclass(JavaPlugin.class); - JavaPlugin plugin = subClazz.getDeclaredConstructor().newInstance(); - - plugin.description = description; - plugin.onEnable(); - plugins.add(plugin); - - $().info("Loaded plugin: " + plugin.description.getName()); - } catch (Exception ex) - { - $().severe("Could not load plugin: " + file); - ex.printStackTrace(); - } - } - } - - @Override - public void onDisable() - { - for (JavaPlugin p : plugins) - { - p.onDisable(); - } - } - - @Override - public void onHandshake(LoginEvent event) - { - for (JavaPlugin p : plugins) - { - p.onHandshake(event); - } - } - - @Override - public void onLogin(LoginEvent event) - { - for (JavaPlugin p : plugins) - { - p.onLogin(event); - } - } - - @Override - public void onServerConnect(ServerConnectEvent event) - { - for (JavaPlugin p : plugins) - { - p.onServerConnect(event); - } - } - - @Override - public void onPluginMessage(PluginMessageEvent event) - { - for (JavaPlugin p : plugins) - { - p.onPluginMessage(event); - } - } - - @Override - public void onChat(ChatEvent event) - { - for (JavaPlugin p : plugins) - { - p.onChat(event); - } - } -} diff --git a/proxy/src/main/java/net/md_5/bungee/plugin/LoginEvent.java b/proxy/src/main/java/net/md_5/bungee/plugin/LoginEvent.java deleted file mode 100644 index 16479c84..00000000 --- a/proxy/src/main/java/net/md_5/bungee/plugin/LoginEvent.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.md_5.bungee.plugin; - -import java.net.InetAddress; -import lombok.Data; - -/** - * Event called to represent a player logging in. - */ -@Data -public class LoginEvent implements Cancellable -{ - - /** - * Canceled state. - */ - private boolean cancelled; - /** - * Message to use when kicking if this event is canceled. - */ - private String cancelReason; - /** - * Username which the player wishes to use. - */ - private final String username; - /** - * IP address of the remote connection. - */ - private final InetAddress address; - /** - * Hostname which the user tried to connect to. - */ - private final String hostname; -} diff --git a/proxy/src/main/java/net/md_5/bungee/plugin/PluginDescription.java b/proxy/src/main/java/net/md_5/bungee/plugin/PluginDescription.java deleted file mode 100644 index 78cca603..00000000 --- a/proxy/src/main/java/net/md_5/bungee/plugin/PluginDescription.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.md_5.bungee.plugin; - -import java.io.InputStream; -import java.lang.reflect.Field; -import lombok.Data; -import org.yaml.snakeyaml.Yaml; - -/** - * File which contains information about a plugin, its authors, and how to load - * it. - */ -@Data -public class PluginDescription -{ - - private String name; - private String main; - private String version; - private String author; - - private PluginDescription() - { - } - - public static PluginDescription load(InputStream is) - { - PluginDescription ret = new Yaml().loadAs(is, PluginDescription.class); - if (ret == null) - { - throw new InvalidPluginException("Could not load plugin description file."); - } - - for (Field f : PluginDescription.class.getDeclaredFields()) - { - try - { - if (f.get(ret) == null) - { - throw new InvalidPluginException(f.getName() + " is not set properly in plugin description"); - } - } catch (IllegalArgumentException | IllegalAccessException ex) - { - } - } - - return ret; - } -} diff --git a/proxy/src/main/java/net/md_5/bungee/plugin/PluginMessageEvent.java b/proxy/src/main/java/net/md_5/bungee/plugin/PluginMessageEvent.java deleted file mode 100644 index ad74ebdd..00000000 --- a/proxy/src/main/java/net/md_5/bungee/plugin/PluginMessageEvent.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.md_5.bungee.plugin; - -import lombok.Data; -import net.md_5.bungee.UserConnection; - -/** - * Event called when a plugin message is sent to the client or server - */ -@Data -public class PluginMessageEvent implements Cancellable -{ - - /** - * Canceled state. - */ - private boolean cancelled; - /** - * Message to use when kicking if this event is canceled. - */ - private String cancelReason; - /** - * Whether this packet is destined for the server or the client - */ - private final Destination destination; - /** - * User in question - */ - private final UserConnection connection; - /** - * Tag specified for this plugin message. - */ - private String tag; - /** - * Data contained in this plugin message. - */ - private String data; - - /** - * An enum that signifies the destination for this packet - */ - public enum Destination - { - - SERVER, - CLIENT - } -} diff --git a/proxy/src/main/java/net/md_5/bungee/plugin/ServerConnectEvent.java b/proxy/src/main/java/net/md_5/bungee/plugin/ServerConnectEvent.java deleted file mode 100644 index 6a7339bb..00000000 --- a/proxy/src/main/java/net/md_5/bungee/plugin/ServerConnectEvent.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.md_5.bungee.plugin; - -import lombok.Data; -import net.md_5.bungee.UserConnection; - -/** - * Event called when the decision is made to decide which server to connect to. - */ -@Data -public class ServerConnectEvent -{ - - /** - * If the player currently has no server, this is true - */ - private final boolean firstTime; - /** - * Message to send just before the change. null for no message - */ - private String message; - /** - * User in question. - */ - private final UserConnection connection; - /** - * Name of the server they are connecting to. - */ - private final String server; - /** - * Name of the server which they will be forwarded to instead. - */ - private String newServer; -} diff --git a/proxy/src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java index c8b39b5b..7eba09ce 100644 --- a/proxy/src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java +++ b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java @@ -4,23 +4,23 @@ import java.util.Collections; import java.util.Map; import java.util.WeakHashMap; import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.UserConnection; +import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.packet.PacketC9PlayerListItem; public class GlobalPingTabList extends GlobalTabList { public static final int PING_THRESHOLD = 20; - private Map lastPings = Collections.synchronizedMap(new WeakHashMap()); + private Map lastPings = Collections.synchronizedMap(new WeakHashMap()); @Override - public void onPingChange(final UserConnection con, final int ping) + public void onPingChange(ProxiedPlayer player, int ping) { - Integer lastPing = lastPings.get(con); + Integer lastPing = lastPings.get(player); if (lastPing == null || (ping - PING_THRESHOLD > lastPing && ping + PING_THRESHOLD < lastPing)) { - BungeeCord.instance.broadcast(new PacketC9PlayerListItem(con.tabListName, true, ping)); - lastPings.put(con, ping); + BungeeCord.instance.broadcast(new PacketC9PlayerListItem(player.getDisplayName(), true, ping)); + lastPings.put(player, ping); } } } diff --git a/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java index f97fd0e8..eae6aa68 100644 --- a/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java +++ b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java @@ -5,15 +5,17 @@ import java.util.HashSet; import java.util.Set; import net.md_5.bungee.BungeeCord; import net.md_5.bungee.UserConnection; +import net.md_5.bungee.api.TabListHandler; +import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.packet.PacketC9PlayerListItem; public class GlobalTabList implements TabListHandler { - private Set sentPings = Collections.synchronizedSet(new HashSet()); + private Set sentPings = Collections.synchronizedSet(new HashSet()); @Override - public void onJoin(UserConnection con) + public void onConnect(ProxiedPlayer player) { for (UserConnection c : BungeeCord.instance.connections.values()) { @@ -22,29 +24,29 @@ public class GlobalTabList implements TabListHandler } @Override - public void onServerChange(UserConnection con) + public void onPingChange(ProxiedPlayer player, int ping) { - } - - @Override - public void onPingChange(final UserConnection con, final int ping) - { - if (!sentPings.contains(con)) + if (!sentPings.contains(player)) { - BungeeCord.instance.broadcast(new PacketC9PlayerListItem(con.tabListName, true, con.getPing())); - sentPings.add(con); + BungeeCord.instance.broadcast(new PacketC9PlayerListItem(player.getDisplayName(), true, player.getPing())); + sentPings.add(player); } } @Override - public void onDisconnect(final UserConnection con) + public void onDisconnect(ProxiedPlayer player) { - BungeeCord.instance.broadcast(new PacketC9PlayerListItem(con.tabListName, false, 9999)); - sentPings.remove(con); + BungeeCord.instance.broadcast(new PacketC9PlayerListItem(player.getDisplayName(), false, 9999)); + sentPings.remove(player); } @Override - public boolean onPacketC9(UserConnection con, PacketC9PlayerListItem packet) + public void onServerChange(ProxiedPlayer player) + { + } + + @Override + public boolean onListUpdate(ProxiedPlayer player, String name, boolean online, int ping) { return false; } diff --git a/proxy/src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java b/proxy/src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java index e17f7ce4..ea17938c 100644 --- a/proxy/src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java +++ b/proxy/src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java @@ -5,30 +5,41 @@ import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import java.util.WeakHashMap; -import net.md_5.bungee.UserConnection; +import net.md_5.bungee.api.TabListHandler; +import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.packet.PacketC9PlayerListItem; public class ServerUniqueTabList implements TabListHandler { - private Map> sentUsernames = Collections.synchronizedMap(new WeakHashMap>()); + private Map> sentUsernames = Collections.synchronizedMap(new WeakHashMap>()); @Override - public void onJoin(UserConnection con) + public void onConnect(ProxiedPlayer player) { } @Override - public void onServerChange(UserConnection con) + public void onPingChange(ProxiedPlayer player, int ping) { - Set usernames = sentUsernames.get(con); + } + + @Override + public void onDisconnect(ProxiedPlayer player) + { + } + + @Override + public void onServerChange(ProxiedPlayer player) + { + Set usernames = sentUsernames.get(player); if (usernames != null) { synchronized (usernames) { for (String username : usernames) { - con.packetQueue.add(new PacketC9PlayerListItem(username, false, 9999)); + player.packetQueue.add(new PacketC9PlayerListItem(username, false, 9999)); } usernames.clear(); } @@ -36,31 +47,21 @@ public class ServerUniqueTabList implements TabListHandler } @Override - public void onPingChange(UserConnection con, int ping) + public boolean onListUpdate(ProxiedPlayer player, String name, boolean online, int ping) { - } - - @Override - public void onDisconnect(UserConnection con) - { - } - - @Override - public boolean onPacketC9(final UserConnection con, final PacketC9PlayerListItem packet) - { - Set usernames = sentUsernames.get(con); + Set usernames = sentUsernames.get(player); if (usernames == null) { usernames = new LinkedHashSet<>(); - sentUsernames.put(con, usernames); + sentUsernames.put(player, usernames); } - if (packet.online) + if (online) { - usernames.add(packet.username); + usernames.add(name); } else { - usernames.remove(packet.username); + usernames.remove(name); } return true; diff --git a/proxy/src/main/java/net/md_5/bungee/tablist/TabListHandler.java b/proxy/src/main/java/net/md_5/bungee/tablist/TabListHandler.java deleted file mode 100644 index b11d92e7..00000000 --- a/proxy/src/main/java/net/md_5/bungee/tablist/TabListHandler.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.md_5.bungee.tablist; - -import net.md_5.bungee.UserConnection; -import net.md_5.bungee.packet.PacketC9PlayerListItem; - -public interface TabListHandler -{ - - public void onJoin(UserConnection con); - - public void onServerChange(UserConnection con); - - public void onPingChange(UserConnection con, int ping); - - public void onDisconnect(UserConnection con); - - public boolean onPacketC9(UserConnection con, PacketC9PlayerListItem packet); -} From 592a504e77e3b6c4f45d3e565f0e8d9196e2f222 Mon Sep 17 00:00:00 2001 From: md_5 Date: Thu, 17 Jan 2013 11:59:59 +1100 Subject: [PATCH 27/45] Start work on making it compile again. --- .../java/net/md_5/bungee/api/ProxyServer.java | 5 +- .../api/connection/ConnectedPlayer.java | 2 +- .../bungee/api/connection/ProxiedPlayer.java | 28 ++++--- .../md_5/bungee/api/connection/Server.java | 17 ++-- .../main/java/net/md_5/bungee/BungeeCord.java | 56 +++---------- .../java/net/md_5/bungee/Configuration.java | 21 ----- .../java/net/md_5/bungee/ListenThread.java | 6 +- .../src/main/java/net/md_5/bungee/Logger.java | 2 +- .../main/java/net/md_5/bungee/Metrics.java | 7 +- .../net/md_5/bungee/ServerConnection.java | 46 +++++++++-- .../java/net/md_5/bungee/UserConnection.java | 79 +++++++++++++++++-- .../bungee/tablist/GlobalPingTabList.java | 2 +- .../md_5/bungee/tablist/GlobalTabList.java | 8 +- .../bungee/tablist/ServerUniqueTabList.java | 3 +- 14 files changed, 168 insertions(+), 114 deletions(-) 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 9f9280cd..112beac5 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 @@ -105,6 +105,9 @@ public abstract class ProxyServer /** * 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(); + public abstract void start() throws Exception; } diff --git a/api/src/main/java/net/md_5/bungee/api/connection/ConnectedPlayer.java b/api/src/main/java/net/md_5/bungee/api/connection/ConnectedPlayer.java index 904edfb7..cf09a65a 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/ConnectedPlayer.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/ConnectedPlayer.java @@ -3,6 +3,6 @@ package net.md_5.bungee.api.connection; /** * Represents a player physically connected to the world hosted on this server. */ -public abstract class ConnectedPlayer extends ProxiedPlayer +public interface ConnectedPlayer extends ProxiedPlayer { } diff --git a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java index 30a6cfaa..e3409786 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java @@ -8,15 +8,23 @@ import net.md_5.bungee.api.CommandSender; * Represents a player who's connection is being connected to somewhere else, * whether it be a remote or embedded server. */ -public abstract class ProxiedPlayer implements Connection, CommandSender +public interface ProxiedPlayer extends Connection, CommandSender { /** - * Name displayed to other users in areas such as the tab list. + * Gets this player's display name. + * + * @return the players current display name */ - @Getter - @Setter - private String displayName; + public String getDisplayName(); + + /** + * Sets this players display name to be used as their nametag and tab list + * name. + * + * @param name the name to set + */ + public void setDisplayName(String name); /** * Connects / transfers this user to the specified connection, gracefully @@ -25,21 +33,21 @@ public abstract class ProxiedPlayer implements Connection, CommandSender * * @param server the new server to connect to */ - public abstract void connect(Server server); + public void connect(Server server); /** * Gets the server this player is connected to. * * @return the server this player is connected to */ - public abstract Server getServer(); + public Server getServer(); /** * Gets the ping time between the proxy and this connection. * * @return the current ping time */ - public abstract int getPing(); + public int getPing(); /** * Completely kick this user from the proxy and all of its child @@ -47,7 +55,7 @@ public abstract class ProxiedPlayer implements Connection, CommandSender * * @param reason the disconnect reason displayed to the player */ - public abstract void disconnect(String reason); + public void disconnect(String reason); /** * Send a plugin message to this player. @@ -55,5 +63,5 @@ public abstract class ProxiedPlayer implements Connection, CommandSender * @param channel the channel to send this data via * @param data the data to send */ - public abstract void sendData(String channel, byte[] data); + public void sendData(String channel, byte[] data); } diff --git a/api/src/main/java/net/md_5/bungee/api/connection/Server.java b/api/src/main/java/net/md_5/bungee/api/connection/Server.java index 692729ad..1bb0d04f 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/Server.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/Server.java @@ -11,22 +11,15 @@ import net.md_5.bungee.api.ServerPing; /** * Represents a destination which this proxy might connect to. */ -@RequiredArgsConstructor -public abstract class Server implements Connection +public interface Server extends Connection { /** - * Information about the address, name and configuration regarding this - * server. + * Returns the basic information about this server. + * + * @return the {@link ServerInfo} for this server */ - @Getter - private final ServerInfo info; - - @Override - public InetSocketAddress getAddress() - { - return info.getAddress(); - } + public ServerInfo getInfo(); /** * Send data by any available means to this server. diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java index 7cb20d28..999af46b 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -1,13 +1,12 @@ package net.md_5.bungee; import java.io.BufferedReader; +import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetSocketAddress; import java.net.Socket; -import java.util.Arrays; import java.util.Collection; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Queue; @@ -16,12 +15,11 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.logging.Level; import java.util.logging.Logger; import lombok.Getter; import static net.md_5.bungee.Logger.$; -import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.TabListHandler; import net.md_5.bungee.api.config.ConfigurationAdapter; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.Server; @@ -29,11 +27,9 @@ import net.md_5.bungee.api.plugin.PluginManager; import net.md_5.bungee.command.*; import net.md_5.bungee.packet.DefinedPacket; import net.md_5.bungee.packet.PacketFAPluginMessage; -import net.md_5.bungee.plugin.JavaPluginManager; import net.md_5.bungee.tablist.GlobalPingTabList; import net.md_5.bungee.tablist.GlobalTabList; import net.md_5.bungee.tablist.ServerUniqueTabList; -import net.md_5.bungee.tablist.TabListHandler; /** * Main BungeeCord proxy class. @@ -78,10 +74,6 @@ public class BungeeCord extends ProxyServer */ public Map connections = new ConcurrentHashMap<>(); public Map> connectionsByServer = new ConcurrentHashMap<>(); - /** - * Registered commands. - */ - public Map commandMap = new HashMap<>(); /** * Tab list handler */ @@ -109,6 +101,11 @@ public class BungeeCord extends ProxyServer getPluginManager().registerCommand(new CommandBungee()); } + public static BungeeCord getInstance() + { + return (BungeeCord) ProxyServer.getInstance(); + } + /** * Starts a new instance of BungeeCord. * @@ -137,39 +134,6 @@ public class BungeeCord extends ProxyServer } } - /** - * Dispatch a command by formatting the arguments and then executing it. - * - * @param commandLine the entire command and arguments string - * @param sender which executed the command - * @return whether the command was handled or not. - */ - public boolean dispatchCommand(String commandLine, CommandSender sender) - { - String[] split = commandLine.trim().split(" "); - String commandName = split[0].toLowerCase(); - Command command = commandMap.get(commandName); - if (config.disabledCommands != null && config.disabledCommands.contains(commandName)) - { - return false; - } else if (command != null) - { - String[] args = Arrays.copyOfRange(split, 1, split.length); - try - { - command.execute(sender, args); - } catch (Exception ex) - { - sender.sendMessage(ChatColor.RED + "An error occurred while executing this command!"); - $().severe("----------------------- [Start of command error] -----------------------"); - $().log(Level.SEVERE, "", ex); - $().severe("----------------------- [End of command error] -----------------------"); - } - } - - return command != null; - } - /** * Start this proxy instance by loading the configuration, plugins and * starting the connect thread. @@ -181,7 +145,9 @@ public class BungeeCord extends ProxyServer config.load(); isRunning = true; - pluginManager.loadPlugins(); + File plugins = new File("plugins"); + plugins.mkdir(); + pluginManager.loadPlugins(plugins); switch (config.tabList) { @@ -328,7 +294,7 @@ public class BungeeCord extends ProxyServer */ public void sendPluginMessage(String channel, String message, String targetServer) { - List conns = BungeeCord.instance.connectionsByServer.get(targetServer); + List conns = connectionsByServer.get(targetServer); if (conns != null && conns.size() > 0) { UserConnection user = conns.get(0); diff --git a/proxy/src/main/java/net/md_5/bungee/Configuration.java b/proxy/src/main/java/net/md_5/bungee/Configuration.java index 01b507b0..86545f6c 100644 --- a/proxy/src/main/java/net/md_5/bungee/Configuration.java +++ b/proxy/src/main/java/net/md_5/bungee/Configuration.java @@ -16,8 +16,6 @@ import java.util.Map; import java.util.UUID; import static net.md_5.bungee.Logger.$; import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.command.CommandSender; -import net.md_5.bungee.command.ConsoleCommandSender; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; @@ -293,23 +291,4 @@ public class Configuration save(reconnect, reconnectLocations); $().info("Saved reconnect locations to " + reconnect); } - - /** - * Get the highest permission a player has. - * - * @param sender to get permissions of - * @return their permission - */ - public Permission getPermission(CommandSender sender) - { - Permission permission = Permission.DEFAULT; - if (admins.contains(sender.getName()) || sender instanceof ConsoleCommandSender) - { - permission = Permission.ADMIN; - } else if (moderators.contains(sender.getName())) - { - permission = Permission.MODERATOR; - } - return permission; - } } diff --git a/proxy/src/main/java/net/md_5/bungee/ListenThread.java b/proxy/src/main/java/net/md_5/bungee/ListenThread.java index e42e04ad..5d6cbae1 100644 --- a/proxy/src/main/java/net/md_5/bungee/ListenThread.java +++ b/proxy/src/main/java/net/md_5/bungee/ListenThread.java @@ -25,15 +25,15 @@ public class ListenThread extends Thread @Override public void run() { - while (BungeeCord.instance.isRunning) + while (BungeeCord.getInstance().isRunning) { try { Socket client = socket.accept(); - BungeeCord.instance.setSocketOptions(client); + BungeeCord.getInstance().setSocketOptions(client); $().info(client.getInetAddress() + " has connected"); InitialHandler handler = new InitialHandler(client); - BungeeCord.instance.threadPool.submit(handler); + BungeeCord.getInstance().threadPool.submit(handler); } catch (SocketException ex) { } catch (IOException ex) diff --git a/proxy/src/main/java/net/md_5/bungee/Logger.java b/proxy/src/main/java/net/md_5/bungee/Logger.java index 52f4ffd9..63964fe1 100644 --- a/proxy/src/main/java/net/md_5/bungee/Logger.java +++ b/proxy/src/main/java/net/md_5/bungee/Logger.java @@ -23,7 +23,7 @@ public class Logger extends java.util.logging.Logger super("RubberBand", null); try { - FileHandler handler = new FileHandler("proxy.log", BungeeCord.instance.config.logNumLines, 1, true); + FileHandler handler = new FileHandler("proxy.log", BungeeCord.getInstance().config.logNumLines, 1, true); handler.setFormatter(formatter); addHandler(handler); } catch (IOException ex) diff --git a/proxy/src/main/java/net/md_5/bungee/Metrics.java b/proxy/src/main/java/net/md_5/bungee/Metrics.java index fc5e81e5..2be00b5a 100644 --- a/proxy/src/main/java/net/md_5/bungee/Metrics.java +++ b/proxy/src/main/java/net/md_5/bungee/Metrics.java @@ -9,6 +9,7 @@ import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import static net.md_5.bungee.Logger.$; +import net.md_5.bungee.api.ProxyServer; public class Metrics extends Thread { @@ -73,10 +74,10 @@ public class Metrics extends Thread { // Construct the post data final StringBuilder data = new StringBuilder(); - data.append(encode("guid")).append('=').append(encode(BungeeCord.instance.config.statsUuid)); - encodeDataPair(data, "version", BungeeCord.instance.version); + data.append(encode("guid")).append('=').append(encode(BungeeCord.getInstance().config.statsUuid)); + encodeDataPair(data, "version", ProxyServer.getInstance().getVersion()); encodeDataPair(data, "server", "0"); - encodeDataPair(data, "players", Integer.toString(BungeeCord.instance.connections.size())); + encodeDataPair(data, "players", Integer.toString(ProxyServer.getInstance().getPlayers().size())); encodeDataPair(data, "revision", String.valueOf(REVISION)); // If we're pinging, append it diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java index 70f7edb9..b1afe67b 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java @@ -4,9 +4,15 @@ import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.security.PublicKey; +import java.util.Collection; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import javax.crypto.SecretKey; +import net.md_5.bungee.api.Callback; +import net.md_5.bungee.api.ServerPing; +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.packet.DefinedPacket; import net.md_5.bungee.packet.Packet1Login; import net.md_5.bungee.packet.Packet2Handshake; @@ -22,7 +28,7 @@ import org.bouncycastle.crypto.io.CipherOutputStream; /** * Class representing a connection from the proxy to the server; ie upstream. */ -public class ServerConnection extends GenericConnection +public class ServerConnection extends GenericConnection implements Server { public final String name; @@ -41,8 +47,8 @@ public class ServerConnection extends GenericConnection try { Socket socket = new Socket(); - socket.connect(address, BungeeCord.instance.config.timeout); - BungeeCord.instance.setSocketOptions(socket); + socket.connect(address, BungeeCord.getInstance().config.timeout); + BungeeCord.getInstance().setSocketOptions(socket); PacketInputStream in = new PacketInputStream(socket.getInputStream()); OutputStream out = socket.getOutputStream(); @@ -80,7 +86,7 @@ public class ServerConnection extends GenericConnection // Register all global plugin message channels // TODO: Allow player-specific plugin message channels for full mod support - for (String channel : BungeeCord.instance.globalPluginChannels) + for (String channel : BungeeCord.getInstance().globalPluginChannels) { out.write(new PacketFAPluginMessage("REGISTER", channel.getBytes()).getPacket()); } @@ -91,7 +97,7 @@ public class ServerConnection extends GenericConnection throw ex; } catch (Exception ex) { - InetSocketAddress def = BungeeCord.instance.config.getServer(null); + InetSocketAddress def = BungeeCord.getInstance().config.getServer(null); if (retry && !address.equals(def)) { return connect(user, name, def, handshake, false); @@ -101,4 +107,34 @@ public class ServerConnection extends GenericConnection } } } + + @Override + public ServerInfo getInfo() + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void sendData(String channel, byte[] data) + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void ping(Callback callback) + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public Collection getPlayers() + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public InetSocketAddress getAddress() + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } } diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index c09e57ad..815cf20c 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -6,17 +6,18 @@ import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; -import net.md_5.bungee.command.CommandSender; +import javax.print.attribute.standard.Destination; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.connection.Server; +import net.md_5.bungee.api.event.ChatEvent; +import net.md_5.bungee.api.event.PluginMessageEvent; import net.md_5.bungee.packet.*; -import net.md_5.bungee.plugin.ChatEvent; -import net.md_5.bungee.plugin.PluginMessageEvent; -import net.md_5.bungee.plugin.PluginMessageEvent.Destination; -import net.md_5.bungee.plugin.ServerConnectEvent; -public class UserConnection extends GenericConnection implements CommandSender +public class UserConnection extends GenericConnection implements ProxiedPlayer { public final Packet2Handshake handshake; @@ -212,6 +213,72 @@ public class UserConnection extends GenericConnection implements CommandSender return username; } + @Override + public String getDisplayName() + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void setDisplayName(String name) + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void connect(Server server) + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public Server getServer() + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void sendData(String channel, byte[] data) + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public InetSocketAddress getAddress() + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public Collection getGroups() + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addGroups(String... groups) + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void removeGroups(String... groups) + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public boolean hasPermission(String permission) + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void setPermission(String permission, boolean value) + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + private class UpstreamBridge extends Thread { diff --git a/proxy/src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java index 7eba09ce..056ecc28 100644 --- a/proxy/src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java +++ b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java @@ -19,7 +19,7 @@ public class GlobalPingTabList extends GlobalTabList Integer lastPing = lastPings.get(player); if (lastPing == null || (ping - PING_THRESHOLD > lastPing && ping + PING_THRESHOLD < lastPing)) { - BungeeCord.instance.broadcast(new PacketC9PlayerListItem(player.getDisplayName(), true, ping)); + BungeeCord.getInstance().broadcast(new PacketC9PlayerListItem(player.getDisplayName(), true, ping)); lastPings.put(player, ping); } } diff --git a/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java index eae6aa68..08432b5a 100644 --- a/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java +++ b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java @@ -17,9 +17,9 @@ public class GlobalTabList implements TabListHandler @Override public void onConnect(ProxiedPlayer player) { - for (UserConnection c : BungeeCord.instance.connections.values()) + for (UserConnection c : BungeeCord.getInstance().connections.values()) { - con.packetQueue.add(new PacketC9PlayerListItem(c.tabListName, true, c.getPing())); + c.packetQueue.add(new PacketC9PlayerListItem(c.tabListName, true, c.getPing())); } } @@ -28,7 +28,7 @@ public class GlobalTabList implements TabListHandler { if (!sentPings.contains(player)) { - BungeeCord.instance.broadcast(new PacketC9PlayerListItem(player.getDisplayName(), true, player.getPing())); + BungeeCord.getInstance().broadcast(new PacketC9PlayerListItem(player.getDisplayName(), true, player.getPing())); sentPings.add(player); } } @@ -36,7 +36,7 @@ public class GlobalTabList implements TabListHandler @Override public void onDisconnect(ProxiedPlayer player) { - BungeeCord.instance.broadcast(new PacketC9PlayerListItem(player.getDisplayName(), false, 9999)); + BungeeCord.getInstance().broadcast(new PacketC9PlayerListItem(player.getDisplayName(), false, 9999)); sentPings.remove(player); } diff --git a/proxy/src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java b/proxy/src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java index ea17938c..bff35075 100644 --- a/proxy/src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java +++ b/proxy/src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java @@ -5,6 +5,7 @@ import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import java.util.WeakHashMap; +import net.md_5.bungee.UserConnection; import net.md_5.bungee.api.TabListHandler; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.packet.PacketC9PlayerListItem; @@ -39,7 +40,7 @@ public class ServerUniqueTabList implements TabListHandler { for (String username : usernames) { - player.packetQueue.add(new PacketC9PlayerListItem(username, false, 9999)); + ((UserConnection) player).packetQueue.add(new PacketC9PlayerListItem(username, false, 9999)); } usernames.clear(); } From 55867dbdc363453a487317f11bf7fbd708bb7ba7 Mon Sep 17 00:00:00 2001 From: md_5 Date: Thu, 17 Jan 2013 12:37:02 +1100 Subject: [PATCH 28/45] More work --- .../java/net/md_5/bungee/api/ProxyServer.java | 15 ++ .../bungee/api/event/PluginMessageEvent.java | 4 +- .../bungee/api/event/ServerConnectEvent.java | 26 ++ .../md_5/bungee/api/event/TargetedEvent.java | 5 +- .../java/net/md_5/bungee/Configuration.java | 2 +- .../net/md_5/bungee/GenericConnection.java | 9 +- .../java/net/md_5/bungee/UserConnection.java | 251 +++++++----------- .../md_5/bungee/tablist/GlobalTabList.java | 2 +- 8 files changed, 148 insertions(+), 166 deletions(-) create mode 100644 api/src/main/java/net/md_5/bungee/api/event/ServerConnectEvent.java 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 112beac5..dd51cdd9 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 @@ -98,6 +98,21 @@ public abstract class ProxyServer */ public abstract void setConfigurationAdapter(ConfigurationAdapter adapter); + /** + * Get the currently in use tab list handle. + * + * @return the tab list handler + */ + public abstract TabListHandler getTabListHandler(); + + /** + * Set the used tab list handler, should not be changed once players have + * connected + * + * @param handler the tab list handler to set + */ + public abstract void setTabListHandler(TabListHandler handler); + /** * Gracefully mark this instance for shutdown. */ diff --git a/api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java b/api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java index 8ef3ac9b..7ac4cf86 100644 --- a/api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java +++ b/api/src/main/java/net/md_5/bungee/api/event/PluginMessageEvent.java @@ -22,11 +22,11 @@ public class PluginMessageEvent extends TargetedEvent implements Cancellable /** * Tag specified for this plugin message. */ - private String tag; + private final String tag; /** * Data contained in this plugin message. */ - private byte[] data; + private final byte[] data; public PluginMessageEvent(Connection sender, Connection receiver, String tag, byte[] data) { diff --git a/api/src/main/java/net/md_5/bungee/api/event/ServerConnectEvent.java b/api/src/main/java/net/md_5/bungee/api/event/ServerConnectEvent.java new file mode 100644 index 00000000..b050d582 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/event/ServerConnectEvent.java @@ -0,0 +1,26 @@ +package net.md_5.bungee.api.event; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.connection.Server; +import net.md_5.bungee.api.plugin.Event; + +@Data +@AllArgsConstructor +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class ServerConnectEvent extends Event +{ + + /** + * Player connecting to a new server. + */ + private final ProxiedPlayer player; + /** + * Server the player will be connected to. + */ + private Server target; +} diff --git a/api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java b/api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java index 800990b8..c64105ab 100644 --- a/api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java +++ b/api/src/main/java/net/md_5/bungee/api/event/TargetedEvent.java @@ -2,7 +2,9 @@ package net.md_5.bungee.api.event; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import net.md_5.bungee.api.connection.Connection; +import net.md_5.bungee.api.plugin.Event; /** * An event which occurs in the communication between two nodes. It is not @@ -12,7 +14,8 @@ import net.md_5.bungee.api.connection.Connection; */ @Data @AllArgsConstructor -public abstract class TargetedEvent +@EqualsAndHashCode(callSuper = false) +public abstract class TargetedEvent extends Event { /** diff --git a/proxy/src/main/java/net/md_5/bungee/Configuration.java b/proxy/src/main/java/net/md_5/bungee/Configuration.java index 86545f6c..92ca0ebd 100644 --- a/proxy/src/main/java/net/md_5/bungee/Configuration.java +++ b/proxy/src/main/java/net/md_5/bungee/Configuration.java @@ -268,7 +268,7 @@ public class Configuration */ public void setServer(UserConnection user, String server) { - reconnectLocations.put(user.username, server); + reconnectLocations.put(user.name, server); } /** diff --git a/proxy/src/main/java/net/md_5/bungee/GenericConnection.java b/proxy/src/main/java/net/md_5/bungee/GenericConnection.java index b06fa2d2..a4e89301 100644 --- a/proxy/src/main/java/net/md_5/bungee/GenericConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/GenericConnection.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.RequiredArgsConstructor; import static net.md_5.bungee.Logger.$; import net.md_5.bungee.packet.PacketFFKick; @@ -20,8 +21,10 @@ public class GenericConnection protected final Socket socket; protected final PacketInputStream in; protected final OutputStream out; - public String username; - public String tabListName; + @Getter + public String name; + @Getter + public String displayName; /** * Close the socket with the specified reason. @@ -55,6 +58,6 @@ public class GenericConnection public void log(String message) { - $().info(socket.getInetAddress() + ((username == null) ? " " : " [" + username + "] ") + message); + $().info(socket.getInetAddress() + ((name == null) ? " " : " [" + name + "] ") + message); } } diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index 815cf20c..1dbd5516 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -4,17 +4,18 @@ import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Socket; -import java.net.SocketAddress; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; -import javax.print.attribute.standard.Destination; +import lombok.Getter; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.event.ChatEvent; import net.md_5.bungee.api.event.PluginMessageEvent; +import net.md_5.bungee.api.event.ServerConnectEvent; import net.md_5.bungee.packet.*; public class UserConnection extends GenericConnection implements ProxiedPlayer @@ -23,6 +24,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer public final Packet2Handshake handshake; public Queue packetQueue = new ConcurrentLinkedQueue<>(); public List loginPackets = new ArrayList<>(); + @Getter private ServerConnection server; private UpstreamBridge upBridge; private DownstreamBridge downBridge; @@ -33,6 +35,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer // ping stuff private int trackingPingId; private long pingTime; + @Getter private int ping; public UserConnection instance = this; @@ -40,39 +43,25 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer { super(socket, in, out); this.handshake = handshake; - username = handshake.username; - tabListName = handshake.username; + name = handshake.username; + displayName = handshake.username; this.loginPackets = loginPackets; - BungeeCord.instance.connections.put(username, this); + BungeeCord.instance.connections.put(name, this); BungeeCord.instance.tabListHandler.onJoin(this); } - public void setTabListName(String newName) + @Override + public void setDisplayName(String name) { - BungeeCord.instance.tabListHandler.onDisconnect(this); - tabListName = newName; - BungeeCord.instance.tabListHandler.onJoin(this); + ProxyServer.getInstance().getTabListHandler().onDisconnect(this); + displayName = name; + ProxyServer.getInstance().getTabListHandler().onConnect(this); } - public void connect(String server) + public void connect(Server server) { - ServerConnectEvent event = new ServerConnectEvent(this.server == null, this, server); - event.setNewServer(server); - BungeeCord.instance.pluginManager.onServerConnect(event); - if (event.getMessage() != null) - { - this.sendMessage(event.getMessage()); - } - if (event.getNewServer() == null) - { - if (event.isFirstTime()) - { - event.setNewServer(BungeeCord.instance.config.defaultServerName); - } else - { - return; - } - } + ServerConnectEvent event = new ServerConnectEvent(this, server); + BungeeCord.getInstance().getPluginManager().callEvent(event); InetSocketAddress addr = BungeeCord.instance.config.getServer(event.getNewServer()); connect(server, addr); } @@ -146,21 +135,6 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer } } - public String getServer() - { - return server.name; - } - - public SocketAddress getAddress() - { - return socket.getRemoteSocketAddress(); - } - - public int getPing() - { - return ping; - } - private void setPing(int ping) { BungeeCord.instance.tabListHandler.onPingChange(this, ping); @@ -171,7 +145,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer { if (BungeeCord.instance.isRunning) { - BungeeCord.instance.connections.remove(username); + BungeeCord.instance.connections.remove(name); if (server != null) { List conns = BungeeCord.instance.connectionsByServer.get(server.name); @@ -202,45 +176,10 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer packetQueue.add(new Packet3Chat(message)); } - public void sendPluginMessage(String tag, byte[] data) - { - server.packetQueue.add(new PacketFAPluginMessage(tag, data)); - } - - @Override - public String getName() - { - return username; - } - - @Override - public String getDisplayName() - { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public void setDisplayName(String name) - { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public void connect(Server server) - { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Server getServer() - { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - @Override public void sendData(String channel, byte[] data) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + server.packetQueue.add(new PacketFAPluginMessage(channel, data)); } @Override @@ -284,7 +223,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer public UpstreamBridge() { - super("Upstream Bridge - " + username); + super("Upstream Bridge - " + name); } @Override @@ -298,39 +237,37 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer boolean sendPacket = true; int id = Util.getId(packet); - if (id == 0xFA) + switch (id) { - // Call the onPluginMessage event - PacketFAPluginMessage message = new PacketFAPluginMessage(packet); - PluginMessageEvent event = new PluginMessageEvent(Destination.SERVER, instance); - event.setTag(message.tag); - event.setData(new String(message.data)); - BungeeCord.instance.pluginManager.onPluginMessage(event); + case 0x00: + if (trackingPingId == new Packet0KeepAlive(packet).id) + { + setPing((int) (System.currentTimeMillis() - pingTime)); + } + break; + case 0x03: + Packet3Chat chat = new Packet3Chat(packet); + if (chat.message.startsWith("/")) + { + sendPacket = !ProxyServer.getInstance().getPluginManager().dispatchCommand(UserConnection.this, chat.message.substring(1)); + } else + { + ChatEvent chatEvent = new ChatEvent(UserConnection.this, server, chat.message); + ProxyServer.getInstance().getPluginManager().callEvent(chatEvent); + sendPacket = !chatEvent.isCancelled(); + } + break; + case 0xFA: + // Call the onPluginMessage event + PacketFAPluginMessage message = new PacketFAPluginMessage(packet); + PluginMessageEvent event = new PluginMessageEvent(UserConnection.this, server, message.tag, message.data); + ProxyServer.getInstance().getPluginManager().callEvent(event); - if (event.isCancelled()) - { - continue; - } - } else if (id == 0x03) - { - Packet3Chat chat = new Packet3Chat(packet); - String message = chat.message; - if (message.startsWith("/")) - { - sendPacket = !BungeeCord.instance.dispatchCommand(message.substring(1), UserConnection.this); - } else - { - ChatEvent chatEvent = new ChatEvent(ChatEvent.Destination.SERVER, instance); - chatEvent.setText(message); - BungeeCord.instance.pluginManager.onChat(chatEvent); - sendPacket = !chatEvent.isCancelled(); - } - } else if (id == 0x00) - { - if (trackingPingId == new Packet0KeepAlive(packet).id) - { - setPing((int) (System.currentTimeMillis() - pingTime)); - } + if (event.isCancelled()) + { + continue; + } + break; } while (!server.packetQueue.isEmpty()) @@ -363,7 +300,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer public DownstreamBridge() { - super("Downstream Bridge - " + username); + super("Downstream Bridge - " + name); } @Override @@ -371,61 +308,59 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer { try { + outer: while (!reconnecting) { byte[] packet = server.in.readPacket(); int id = Util.getId(packet); - if (id == 0xFA) + switch (id) { - // Call the onPluginMessage event - PacketFAPluginMessage message = new PacketFAPluginMessage(packet); - PluginMessageEvent event = new PluginMessageEvent(Destination.CLIENT, instance); - event.setTag(message.tag); - event.setData(new String(message.data)); - BungeeCord.instance.pluginManager.onPluginMessage(event); - - if (event.isCancelled()) - { - continue; - } - - message.tag = event.getTag(); - message.data = event.getData().getBytes(); - - // Allow a message for killing the connection outright - if (message.tag.equals("KillCon")) - { + case 0x00: + trackingPingId = new Packet0KeepAlive(packet).id; + pingTime = System.currentTimeMillis(); break; - } + case 0x03: + Packet3Chat chat = new Packet3Chat(packet); + ChatEvent chatEvent = new ChatEvent(server, UserConnection.this, chat.message); + ProxyServer.getInstance().getPluginManager().callEvent(chatEvent); - if (message.tag.equals("RubberBand")) - { - String server = new String(message.data); - connect(server); + if (chatEvent.isCancelled()) + { + continue; + } break; - } - } else if (id == 0x00) - { - trackingPingId = new Packet0KeepAlive(packet).id; - pingTime = System.currentTimeMillis(); - } else if (id == 0x03) - { - Packet3Chat chat = new Packet3Chat(packet); - String message = chat.message; - ChatEvent chatEvent = new ChatEvent(ChatEvent.Destination.CLIENT, instance); - chatEvent.setText(message); - BungeeCord.instance.pluginManager.onChat(chatEvent); - if (chatEvent.isCancelled()) - { - continue; - } - } else if (id == 0xC9) - { - if (!BungeeCord.instance.tabListHandler.onPacketC9(UserConnection.this, new PacketC9PlayerListItem(packet))) - { - continue; - } + case 0xC9: + PacketC9PlayerListItem playerList = new PacketC9PlayerListItem(packet); + if (!ProxyServer.getInstance().getTabListHandler().onListUpdate(instance, playerList.username, playerList.online, playerList.ping)) + { + continue; + } + break; + case 0xFA: + // Call the onPluginMessage event + PacketFAPluginMessage message = new PacketFAPluginMessage(packet); + PluginMessageEvent event = new PluginMessageEvent(server, UserConnection.this, message.tag, message.data); + ProxyServer.getInstance().getPluginManager().callEvent(event); + + if (event.isCancelled()) + { + continue; + } + + switch (message.tag) + { + case "BungeeCord::Disconnect": + break outer; + case "BungeeCord::Connect": + Server server = ProxyServer.getInstance().getServer(new String(message.data)); + if (server != null) + { + connect(server); + break outer; + } + break; + } } while (!packetQueue.isEmpty()) diff --git a/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java index 08432b5a..ec4e551a 100644 --- a/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java +++ b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java @@ -19,7 +19,7 @@ public class GlobalTabList implements TabListHandler { for (UserConnection c : BungeeCord.getInstance().connections.values()) { - c.packetQueue.add(new PacketC9PlayerListItem(c.tabListName, true, c.getPing())); + c.packetQueue.add(new PacketC9PlayerListItem(c.displayName, true, c.getPing())); } } From 32ef5212f8ec8e00dd874cd657a97cea64a11559 Mon Sep 17 00:00:00 2001 From: md_5 Date: Fri, 18 Jan 2013 10:46:55 +1100 Subject: [PATCH 29/45] This is hard >.> --- .../java/net/md_5/bungee/api/ProxyServer.java | 14 ++ .../api/connection/PendingConnection.java | 8 ++ .../bungee/api/connection/ProxiedPlayer.java | 8 -- .../main/java/net/md_5/bungee/BungeeCord.java | 120 ++++-------------- .../java/net/md_5/bungee/InitialHandler.java | 63 +++++---- .../net/md_5/bungee/ServerConnection.java | 8 -- .../md_5/bungee/command/CommandBungee.java | 4 +- 7 files changed, 93 insertions(+), 132 deletions(-) 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 dd51cdd9..8baf0de7 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 @@ -113,6 +113,20 @@ public abstract class ProxyServer */ public abstract void setTabListHandler(TabListHandler handler); + /** + * 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. */ diff --git a/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java b/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java index 4163239a..7f5cc856 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java @@ -28,4 +28,12 @@ public interface PendingConnection extends Connection * @return request virtual host or null if invalid / not specified. */ public InetSocketAddress getVirtualHost(); + + /** + * Completely kick this user from the proxy and all of its child + * connections. + * + * @param reason the disconnect reason displayed to the player + */ + public void disconnect(String reason); } diff --git a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java index e3409786..c61ad882 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java @@ -49,14 +49,6 @@ public interface ProxiedPlayer extends Connection, CommandSender */ public int getPing(); - /** - * Completely kick this user from the proxy and all of its child - * connections. - * - * @param reason the disconnect reason displayed to the player - */ - public void disconnect(String reason); - /** * Send a plugin message to this player. * diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java index 999af46b..c8fde24b 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -9,24 +9,26 @@ import java.net.Socket; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Queue; import java.util.Timer; +import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; import java.util.logging.Logger; import lombok.Getter; +import lombok.Setter; import static net.md_5.bungee.Logger.$; import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.ReconnectHandler; import net.md_5.bungee.api.TabListHandler; import net.md_5.bungee.api.config.ConfigurationAdapter; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.Server; +import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.plugin.PluginManager; import net.md_5.bungee.command.*; import net.md_5.bungee.packet.DefinedPacket; -import net.md_5.bungee.packet.PacketFAPluginMessage; import net.md_5.bungee.tablist.GlobalPingTabList; import net.md_5.bungee.tablist.GlobalTabList; import net.md_5.bungee.tablist.ServerUniqueTabList; @@ -65,10 +67,6 @@ public class BungeeCord extends ProxyServer * Server socket listener. */ private ListenThread listener; - /** - * Current version. - */ - public static String version = (BungeeCord.class.getPackage().getImplementationVersion() == null) ? "unknown" : BungeeCord.class.getPackage().getImplementationVersion(); /** * Fully qualified connections. */ @@ -77,16 +75,17 @@ public class BungeeCord extends ProxyServer /** * Tab list handler */ + @Getter + @Setter public TabListHandler tabListHandler; - /** - * Registered Global Plugin Channels - */ - public Queue globalPluginChannels = new ConcurrentLinkedQueue<>(); /** * Plugin manager. */ @Getter public final PluginManager pluginManager = new PluginManager(); + @Getter + @Setter + private ReconnectHandler reconnectHandler; { @@ -163,14 +162,18 @@ public class BungeeCord extends ProxyServer break; } - // Add RubberBand to the global plugin channel list - globalPluginChannels.add("RubberBand"); - InetSocketAddress addr = Util.getAddr(config.bindHost); listener = new ListenThread(addr); listener.start(); - saveThread.start(); + saveThread.scheduleAtFixedRate(new TimerTask() + { + @Override + public void run() + { + getReconnectHandler().save(); + } + }, 0, TimeUnit.MINUTES.toMillis(5)); $().info("Listening on " + addr); if (config.metricsEnabled) @@ -186,8 +189,11 @@ public class BungeeCord extends ProxyServer public void stop() { this.isRunning = false; - $().info("Disabling plugin"); - pluginManager.onDisable(); + $().info("Disabling plugins"); + for (Plugin plugin : pluginManager.getPlugins()) + { + plugin.onDisable(); + } $().info("Closing listen thread"); try @@ -209,13 +215,7 @@ public class BungeeCord extends ProxyServer } $().info("Saving reconnect locations"); - saveThread.interrupt(); - try - { - saveThread.join(); - } catch (InterruptedException ex) - { - } + saveThread.cancel(); $().info("Thank you and goodbye"); System.exit(0); @@ -248,71 +248,6 @@ public class BungeeCord extends ProxyServer } } - /** - * Broadcasts a plugin message to all servers with currently connected - * players. - * - * @param channel name - * @param message to send - */ - public void broadcastPluginMessage(String channel, String message) - { - broadcastPluginMessage(channel, message, null); - } - - /** - * Broadcasts a plugin message to all servers with currently connected - * players. - * - * @param channel name - * @param message to send - * @param server the message was sent from originally - */ - public void broadcastPluginMessage(String channel, String message, String sourceServer) - { - for (String server : connectionsByServer.keySet()) - { - if (sourceServer == null || !sourceServer.equals(server)) - { - List conns = BungeeCord.instance.connectionsByServer.get(server); - if (conns != null && conns.size() > 0) - { - UserConnection user = conns.get(0); - user.sendPluginMessage(channel, message.getBytes()); - } - } - } - } - - /** - * Send a plugin message to a specific server if it has currently connected - * players. - * - * @param channel name - * @param message to send - * @param server the message is to be sent to - */ - public void sendPluginMessage(String channel, String message, String targetServer) - { - List conns = connectionsByServer.get(targetServer); - if (conns != null && conns.size() > 0) - { - UserConnection user = conns.get(0); - user.sendPluginMessage(channel, message.getBytes()); - } - } - - /** - * Register a plugin channel for all users - * - * @param channel name - */ - public void registerPluginChannel(String channel) - { - globalPluginChannels.add(channel); - broadcast(new PacketFAPluginMessage("REGISTER", channel.getBytes())); - } - @Override public String getName() { @@ -322,7 +257,7 @@ public class BungeeCord extends ProxyServer @Override public String getVersion() { - return version; + return (BungeeCord.class.getPackage().getImplementationVersion() == null) ? "unknown" : BungeeCord.class.getPackage().getImplementationVersion(); } @Override @@ -332,15 +267,16 @@ public class BungeeCord extends ProxyServer } @Override + @SuppressWarnings("unchecked") // TODO: Abstract more public Collection getPlayers() { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + return (Collection) connections.values(); } @Override public ProxiedPlayer getPlayer(String name) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + return connections.get(name); } @Override diff --git a/proxy/src/main/java/net/md_5/bungee/InitialHandler.java b/proxy/src/main/java/net/md_5/bungee/InitialHandler.java index b2fe6660..8211eeda 100644 --- a/proxy/src/main/java/net/md_5/bungee/InitialHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/InitialHandler.java @@ -2,26 +2,30 @@ package net.md_5.bungee; import java.io.IOException; import java.io.OutputStream; +import java.net.InetSocketAddress; import java.net.Socket; import java.util.ArrayList; import java.util.List; import javax.crypto.SecretKey; import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.connection.PendingConnection; +import net.md_5.bungee.api.event.LoginEvent; import net.md_5.bungee.packet.Packet2Handshake; import net.md_5.bungee.packet.PacketFCEncryptionResponse; import net.md_5.bungee.packet.PacketFDEncryptionRequest; import net.md_5.bungee.packet.PacketFFKick; import net.md_5.bungee.packet.PacketInputStream; -import net.md_5.bungee.plugin.LoginEvent; import org.bouncycastle.crypto.io.CipherInputStream; import org.bouncycastle.crypto.io.CipherOutputStream; -public class InitialHandler implements Runnable +public class InitialHandler implements Runnable, PendingConnection { private final Socket socket; private PacketInputStream in; private OutputStream out; + private Packet2Handshake handshake; public InitialHandler(Socket socket) throws IOException { @@ -40,15 +44,7 @@ public class InitialHandler implements Runnable switch (id) { case 0x02: - Packet2Handshake handshake = new Packet2Handshake(packet); - // fire connect event - LoginEvent event = new LoginEvent(handshake.username, socket.getInetAddress(), handshake.host); - BungeeCord.instance.pluginManager.onHandshake(event); - if (event.isCancelled()) - { - throw new KickException(event.getCancelReason()); - } - + handshake = new Packet2Handshake(packet); PacketFDEncryptionRequest request = EncryptionUtil.encryptRequest(); out.write(request.getPacket()); PacketFCEncryptionResponse response = new PacketFCEncryptionResponse(in.readPacket()); @@ -59,8 +55,8 @@ public class InitialHandler implements Runnable throw new KickException("Not authenticated with minecraft.net"); } - // fire post auth event - BungeeCord.instance.pluginManager.onLogin(event); + // fire login event + LoginEvent event = new LoginEvent(this); if (event.isCancelled()) { throw new KickException(event.getCancelReason()); @@ -77,8 +73,6 @@ public class InitialHandler implements Runnable } UserConnection userCon = new UserConnection(socket, in, out, handshake, customPackets); - String server = (BungeeCord.instance.config.forceDefaultServer) ? BungeeCord.instance.config.defaultServerName : BungeeCord.instance.config.getServer(handshake.username, handshake.host); - userCon.connect(server); break; case 0xFE: socket.setSoTimeout(100); @@ -90,14 +84,14 @@ public class InitialHandler implements Runnable } catch (IOException ex) { } - Configuration conf = BungeeCord.instance.config; + Configuration conf = BungeeCord.getInstance().config; String ping = (newPing) ? ChatColor.COLOR_CHAR + "1" + "\00" + BungeeCord.PROTOCOL_VERSION + "\00" + BungeeCord.GAME_VERSION + "\00" + conf.motd - + "\00" + BungeeCord.instance.connections.size() + + "\00" + ProxyServer.getInstance().getPlayers().size() + "\00" + conf.maxPlayers - : conf.motd + ChatColor.COLOR_CHAR + BungeeCord.instance.connections.size() + ChatColor.COLOR_CHAR + conf.maxPlayers; + : conf.motd + ChatColor.COLOR_CHAR + ProxyServer.getInstance().getPlayers().size() + ChatColor.COLOR_CHAR + conf.maxPlayers; throw new KickException(ping); default: if (id == 0xFA) @@ -110,18 +104,19 @@ public class InitialHandler implements Runnable } } catch (KickException ex) { - kick(ex.getMessage()); + disconnect(ex.getMessage()); } catch (Exception ex) { - kick("[Proxy Error] " + Util.exception(ex)); + disconnect("[Proxy Error] " + Util.exception(ex)); } } - private void kick(String message) + @Override + public void disconnect(String reason) { try { - out.write(new PacketFFKick(message).getPacket()); + out.write(new PacketFFKick(reason).getPacket()); } catch (IOException ioe) { } finally @@ -135,4 +130,28 @@ public class InitialHandler implements Runnable } } } + + @Override + public String getName() + { + return (handshake == null) ? null : handshake.username; + } + + @Override + public byte getVersion() + { + return (handshake == null) ? -1 : handshake.procolVersion; + } + + @Override + public InetSocketAddress getVirtualHost() + { + return (handshake == null) ? null : new InetSocketAddress(handshake.host, handshake.port); + } + + @Override + public InetSocketAddress getAddress() + { + return (InetSocketAddress) socket.getRemoteSocketAddress(); + } } diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java index b1afe67b..d7096407 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java @@ -17,7 +17,6 @@ import net.md_5.bungee.packet.DefinedPacket; import net.md_5.bungee.packet.Packet1Login; import net.md_5.bungee.packet.Packet2Handshake; import net.md_5.bungee.packet.PacketCDClientStatus; -import net.md_5.bungee.packet.PacketFAPluginMessage; import net.md_5.bungee.packet.PacketFCEncryptionResponse; import net.md_5.bungee.packet.PacketFDEncryptionRequest; import net.md_5.bungee.packet.PacketFFKick; @@ -84,13 +83,6 @@ public class ServerConnection extends GenericConnection implements Server } Packet1Login login = new Packet1Login(loginResponse); - // Register all global plugin message channels - // TODO: Allow player-specific plugin message channels for full mod support - for (String channel : BungeeCord.getInstance().globalPluginChannels) - { - out.write(new PacketFAPluginMessage("REGISTER", channel.getBytes()).getPacket()); - } - return new ServerConnection(name, socket, in, out, login); } catch (KickException ex) { diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java b/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java index 490e81b9..439a9a20 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java @@ -1,8 +1,8 @@ package net.md_5.bungee.command; -import net.md_5.bungee.BungeeCord; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.Command; public class CommandBungee extends Command @@ -16,6 +16,6 @@ public class CommandBungee extends Command @Override public void execute(CommandSender sender, String[] args) { - sender.sendMessage(ChatColor.BLUE + "This server is running BungeeCord version " + BungeeCord.version + " by md_5"); + sender.sendMessage(ChatColor.BLUE + "This server is running BungeeCord version " + ProxyServer.getInstance().getVersion() + " by md_5"); } } From df37612494fca46f27a5b680e9022f676d5a0650 Mon Sep 17 00:00:00 2001 From: md_5 Date: Fri, 18 Jan 2013 11:11:52 +1100 Subject: [PATCH 30/45] Add permissions --- .../net/md_5/bungee/api/CommandSender.java | 3 +- .../java/net/md_5/bungee/api/ProxyServer.java | 7 ++ .../net/md_5/bungee/api/ReconnectHandler.java | 8 ++ .../net/md_5/bungee/api/TabListHandler.java | 3 +- .../java/net/md_5/bungee/UserConnection.java | 73 ++++++++++++++----- 5 files changed, 72 insertions(+), 22 deletions(-) diff --git a/api/src/main/java/net/md_5/bungee/api/CommandSender.java b/api/src/main/java/net/md_5/bungee/api/CommandSender.java index 7570f457..3596e52f 100644 --- a/api/src/main/java/net/md_5/bungee/api/CommandSender.java +++ b/api/src/main/java/net/md_5/bungee/api/CommandSender.java @@ -20,7 +20,8 @@ public interface CommandSender public void sendMessage(String message); /** - * Get all groups this user is part of. + * Get all groups this user is part of. This returns an unmodifiable + * collection. * * @return the users groups */ 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 8baf0de7..719731fa 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 @@ -90,6 +90,13 @@ public abstract class ProxyServer */ 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()}. diff --git a/api/src/main/java/net/md_5/bungee/api/ReconnectHandler.java b/api/src/main/java/net/md_5/bungee/api/ReconnectHandler.java index b835fc30..dd417587 100644 --- a/api/src/main/java/net/md_5/bungee/api/ReconnectHandler.java +++ b/api/src/main/java/net/md_5/bungee/api/ReconnectHandler.java @@ -13,6 +13,14 @@ public interface ReconnectHandler */ public String getServer(ProxiedPlayer player); + /** + * Save the server of this player before they disconnect so it can be + * retrieved later. + * + * @param player the player to save + */ + public void setServer(ProxiedPlayer player); + /** * Save all pending reconnect locations. Whilst not used for database * connections, this method will be called at a predefined interval to allow diff --git a/api/src/main/java/net/md_5/bungee/api/TabListHandler.java b/api/src/main/java/net/md_5/bungee/api/TabListHandler.java index 832e95c5..e4db4e6f 100644 --- a/api/src/main/java/net/md_5/bungee/api/TabListHandler.java +++ b/api/src/main/java/net/md_5/bungee/api/TabListHandler.java @@ -20,7 +20,8 @@ public interface TabListHandler public void onServerChange(ProxiedPlayer player); /** - * Called when a players ping changes. + * Called when a players ping changes. The new ping will have not updated in + * the player instance until this method returns. * * @param player the player who's ping changed * @param ping the player's new ping. diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index 1dbd5516..8e1ff036 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -1,15 +1,22 @@ package net.md_5.bungee; +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import lombok.Getter; +import lombok.Synchronized; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.Server; @@ -37,7 +44,9 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer private long pingTime; @Getter private int ping; - public UserConnection instance = this; + // Permissions + private final Collection groups = new HashSet<>(); + private final Map permissions = new HashMap<>(); public UserConnection(Socket socket, PacketInputStream in, OutputStream out, Packet2Handshake handshake, List loginPackets) { @@ -135,12 +144,6 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer } } - private void setPing(int ping) - { - BungeeCord.instance.tabListHandler.onPingChange(this, ping); - this.ping = ping; - } - private void destroySelf(String reason) { if (BungeeCord.instance.isRunning) @@ -159,14 +162,14 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer if (server != null) { server.disconnect("Quitting"); - BungeeCord.instance.config.setServer(this, server.name); + ProxyServer.getInstance().getReconnectHandler().setServer(this); } } @Override public void disconnect(String reason) { - BungeeCord.instance.tabListHandler.onDisconnect(this); + ProxyServer.getInstance().getTabListHandler().onDisconnect(this); super.disconnect(reason); } @@ -185,37 +188,57 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer @Override public InetSocketAddress getAddress() { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + return (InetSocketAddress) socket.getRemoteSocketAddress(); } @Override + @Synchronized(value = "permMutex") public Collection getGroups() { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + return Collections.unmodifiableCollection(groups); } @Override + @Synchronized(value = "permMutex") public void addGroups(String... groups) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + for (String group : groups) + { + this.groups.add(group); + for (String permission : ProxyServer.getInstance().getConfigurationAdapter().getPermissions(group)) + { + setPermission(permission, true); + } + } } @Override + @Synchronized(value = "permMutex") public void removeGroups(String... groups) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + for (String group : groups) + { + this.groups.remove(group); + for (String permission : ProxyServer.getInstance().getConfigurationAdapter().getPermissions(group)) + { + setPermission(permission, false); + } + } } @Override + @Synchronized(value = "permMutex") public boolean hasPermission(String permission) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + Boolean val = permissions.get(permission); + return (val == null) ? false : val; } @Override + @Synchronized(value = "permMutex") public void setPermission(String permission, boolean value) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + permissions.put(permission, value); } private class UpstreamBridge extends Thread @@ -235,14 +258,16 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer { byte[] packet = in.readPacket(); boolean sendPacket = true; - int id = Util.getId(packet); + switch (id) { case 0x00: if (trackingPingId == new Packet0KeepAlive(packet).id) { - setPing((int) (System.currentTimeMillis() - pingTime)); + int newPing = (int) (System.currentTimeMillis() - pingTime); + ProxyServer.getInstance().getTabListHandler().onPingChange(UserConnection.this, newPing); + ping = newPing; } break; case 0x03: @@ -312,8 +337,8 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer while (!reconnecting) { byte[] packet = server.in.readPacket(); - int id = Util.getId(packet); + switch (id) { case 0x00: @@ -332,7 +357,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer break; case 0xC9: PacketC9PlayerListItem playerList = new PacketC9PlayerListItem(packet); - if (!ProxyServer.getInstance().getTabListHandler().onListUpdate(instance, playerList.username, playerList.online, playerList.ping)) + if (!ProxyServer.getInstance().getTabListHandler().onListUpdate(UserConnection.this, playerList.username, playerList.online, playerList.ping)) { continue; } @@ -340,6 +365,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer case 0xFA: // Call the onPluginMessage event PacketFAPluginMessage message = new PacketFAPluginMessage(packet); + DataInputStream in = new DataInputStream(new ByteArrayInputStream(message.data)); PluginMessageEvent event = new PluginMessageEvent(server, UserConnection.this, message.tag, message.data); ProxyServer.getInstance().getPluginManager().callEvent(event); @@ -352,8 +378,15 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer { case "BungeeCord::Disconnect": break outer; + case "BungeeCord::Forward": + String target = in.readUTF(); + String channel = in.readUTF(); + short len = in.readShort(); + byte[] data = new byte[len]; + in.readFully(data); + break; case "BungeeCord::Connect": - Server server = ProxyServer.getInstance().getServer(new String(message.data)); + Server server = ProxyServer.getInstance().getServer(in.readUTF()); if (server != null) { connect(server); From 8e3f750c7cfc4ecb35ffccd8a7ed39755c08d529 Mon Sep 17 00:00:00 2001 From: md_5 Date: Fri, 18 Jan 2013 11:33:44 +1100 Subject: [PATCH 31/45] Make the tab list implementations pruddy. --- .../bungee/tablist/GlobalPingTabList.java | 14 +++++++---- .../md_5/bungee/tablist/GlobalTabList.java | 6 +++-- .../bungee/tablist/ServerUniqueTabList.java | 23 +++++++++++-------- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/proxy/src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java index 056ecc28..ba108cec 100644 --- a/proxy/src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java +++ b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalPingTabList.java @@ -1,8 +1,7 @@ package net.md_5.bungee.tablist; -import java.util.Collections; import java.util.Map; -import java.util.WeakHashMap; +import java.util.concurrent.ConcurrentHashMap; import net.md_5.bungee.BungeeCord; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.packet.PacketC9PlayerListItem; @@ -10,8 +9,15 @@ import net.md_5.bungee.packet.PacketC9PlayerListItem; public class GlobalPingTabList extends GlobalTabList { - public static final int PING_THRESHOLD = 20; - private Map lastPings = Collections.synchronizedMap(new WeakHashMap()); + private static final int PING_THRESHOLD = 20; + private final Map lastPings = new ConcurrentHashMap<>(); + + @Override + public void onDisconnect(ProxiedPlayer player) + { + lastPings.remove(player); + super.onDisconnect(player); + } @Override public void onPingChange(ProxiedPlayer player, int ping) diff --git a/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java index ec4e551a..f22d6ee6 100644 --- a/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java +++ b/proxy/src/main/java/net/md_5/bungee/tablist/GlobalTabList.java @@ -1,8 +1,8 @@ package net.md_5.bungee.tablist; -import java.util.Collections; import java.util.HashSet; import java.util.Set; +import lombok.Synchronized; import net.md_5.bungee.BungeeCord; import net.md_5.bungee.UserConnection; import net.md_5.bungee.api.TabListHandler; @@ -12,7 +12,7 @@ import net.md_5.bungee.packet.PacketC9PlayerListItem; public class GlobalTabList implements TabListHandler { - private Set sentPings = Collections.synchronizedSet(new HashSet()); + private final Set sentPings = new HashSet<>(); @Override public void onConnect(ProxiedPlayer player) @@ -24,6 +24,7 @@ public class GlobalTabList implements TabListHandler } @Override + @Synchronized(value = "sentPings") public void onPingChange(ProxiedPlayer player, int ping) { if (!sentPings.contains(player)) @@ -34,6 +35,7 @@ public class GlobalTabList implements TabListHandler } @Override + @Synchronized(value = "sentPings") public void onDisconnect(ProxiedPlayer player) { BungeeCord.getInstance().broadcast(new PacketC9PlayerListItem(player.getDisplayName(), false, 9999)); diff --git a/proxy/src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java b/proxy/src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java index bff35075..f5cef3a8 100644 --- a/proxy/src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java +++ b/proxy/src/main/java/net/md_5/bungee/tablist/ServerUniqueTabList.java @@ -1,10 +1,9 @@ package net.md_5.bungee.tablist; -import java.util.Collections; -import java.util.LinkedHashSet; +import java.util.HashSet; import java.util.Map; import java.util.Set; -import java.util.WeakHashMap; +import java.util.concurrent.ConcurrentHashMap; import net.md_5.bungee.UserConnection; import net.md_5.bungee.api.TabListHandler; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -13,7 +12,7 @@ import net.md_5.bungee.packet.PacketC9PlayerListItem; public class ServerUniqueTabList implements TabListHandler { - private Map> sentUsernames = Collections.synchronizedMap(new WeakHashMap>()); + private final Map> sentUsernames = new ConcurrentHashMap<>(); @Override public void onConnect(ProxiedPlayer player) @@ -28,6 +27,7 @@ public class ServerUniqueTabList implements TabListHandler @Override public void onDisconnect(ProxiedPlayer player) { + sentUsernames.remove(player); } @Override @@ -53,16 +53,19 @@ public class ServerUniqueTabList implements TabListHandler Set usernames = sentUsernames.get(player); if (usernames == null) { - usernames = new LinkedHashSet<>(); + usernames = new HashSet<>(); sentUsernames.put(player, usernames); } - if (online) + synchronized (usernames) { - usernames.add(name); - } else - { - usernames.remove(name); + if (online) + { + usernames.add(name); + } else + { + usernames.remove(name); + } } return true; From 4ba699303932b74091e20449e6ab45ba17aa5586 Mon Sep 17 00:00:00 2001 From: md_5 Date: Fri, 18 Jan 2013 11:39:15 +1100 Subject: [PATCH 32/45] Clean commands a bit. --- .../main/java/net/md_5/bungee/command/CommandAlert.java | 2 +- .../main/java/net/md_5/bungee/command/CommandMotd.java | 3 +-- .../main/java/net/md_5/bungee/command/CommandReload.java | 3 +-- .../main/java/net/md_5/bungee/command/CommandServer.java | 2 -- .../net/md_5/bungee/command/ConsoleCommandSender.java | 8 +++++++- .../java/net/md_5/bungee/packet/PacketInputStream.java | 3 --- 6 files changed, 10 insertions(+), 11 deletions(-) diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandAlert.java b/proxy/src/main/java/net/md_5/bungee/command/CommandAlert.java index 5958c967..a584e300 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandAlert.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandAlert.java @@ -31,7 +31,7 @@ public class CommandAlert extends Command for (String s : args) { - s = s.replace("&h", ""); + s = s.substring(1, s.length()); builder.append(ChatColor.translateAlternateColorCodes('&', s)); builder.append(" "); } diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java b/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java index 22a5ee1c..a253f185 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java @@ -3,7 +3,6 @@ package net.md_5.bungee.command; import net.md_5.bungee.BungeeCord; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.Command; /** @@ -27,6 +26,6 @@ public class CommandMotd extends Command newMOTD.append(s); newMOTD.append(" "); } - ((BungeeCord) ProxyServer.getInstance()).config.motd = ChatColor.translateAlternateColorCodes('&', newMOTD.substring(0, newMOTD.length() - 1)); + BungeeCord.getInstance().config.motd = ChatColor.translateAlternateColorCodes('&', newMOTD.substring(0, newMOTD.length() - 1)); } } diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandReload.java b/proxy/src/main/java/net/md_5/bungee/command/CommandReload.java index 268a8d46..99a47ecc 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandReload.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandReload.java @@ -3,7 +3,6 @@ package net.md_5.bungee.command; import net.md_5.bungee.BungeeCord; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.Command; public class CommandReload extends Command @@ -17,7 +16,7 @@ public class CommandReload extends Command @Override public void execute(CommandSender sender, String[] args) { - ((BungeeCord) ProxyServer.getInstance()).config.load(); + BungeeCord.getInstance().config.load(); sender.sendMessage(ChatColor.GREEN + "Reloaded config, please restart if you have any issues"); } } diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java b/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java index 746b585a..92f01c99 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java @@ -1,8 +1,6 @@ package net.md_5.bungee.command; import java.util.Collection; -import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.UserConnection; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.ProxyServer; diff --git a/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java b/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java index 77a1a956..3c637882 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java +++ b/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java @@ -2,6 +2,7 @@ package net.md_5.bungee.command; import java.util.Collection; import java.util.Collections; +import lombok.Getter; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.CommandSender; @@ -11,7 +12,12 @@ import net.md_5.bungee.api.CommandSender; public class ConsoleCommandSender implements CommandSender { - public static final ConsoleCommandSender instance = new ConsoleCommandSender(); + @Getter + private static final ConsoleCommandSender instance = new ConsoleCommandSender(); + + private ConsoleCommandSender() + { + } @Override public void sendMessage(String message) diff --git a/proxy/src/main/java/net/md_5/bungee/packet/PacketInputStream.java b/proxy/src/main/java/net/md_5/bungee/packet/PacketInputStream.java index 66753a83..30a39ac1 100644 --- a/proxy/src/main/java/net/md_5/bungee/packet/PacketInputStream.java +++ b/proxy/src/main/java/net/md_5/bungee/packet/PacketInputStream.java @@ -2,11 +2,8 @@ package net.md_5.bungee.packet; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; -import java.io.EOFException; import java.io.IOException; import java.io.InputStream; -import net.md_5.bungee.Util; -import net.md_5.mendax.PacketDefinitions; import net.md_5.mendax.datainput.DataInputPacketReader; /** From 8bff34b8b6af76c5fa477ba16b1db8780957f76d Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 19 Jan 2013 10:13:55 +1100 Subject: [PATCH 33/45] Add the start of a config loader. --- .../api/config/ConfigurationAdapter.java | 19 +- .../md_5/bungee/api/config/ListenerInfo.java | 9 + .../main/java/net/md_5/bungee/BungeeCord.java | 1 + .../java/net/md_5/bungee/Configuration.java | 294 ------------------ .../java/net/md_5/bungee/InitialHandler.java | 1 + .../src/main/java/net/md_5/bungee/Logger.java | 2 +- .../main/java/net/md_5/bungee/Metrics.java | 2 +- .../java/net/md_5/bungee/UserConnection.java | 1 + .../net/md_5/bungee/command/CommandMotd.java | 31 -- .../net/md_5/bungee/config/Configuration.java | 84 +++++ .../net/md_5/bungee/config/YamlConfig.java | 150 +++++++++ 11 files changed, 255 insertions(+), 339 deletions(-) delete mode 100644 proxy/src/main/java/net/md_5/bungee/Configuration.java delete mode 100644 proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java create mode 100644 proxy/src/main/java/net/md_5/bungee/config/Configuration.java create mode 100644 proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java diff --git a/api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java b/api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java index 7e5981d5..54f35220 100644 --- a/api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java +++ b/api/src/main/java/net/md_5/bungee/api/config/ConfigurationAdapter.java @@ -1,6 +1,7 @@ package net.md_5.bungee.api.config; import java.util.Collection; +import java.util.Map; /** * This class allows plugins to set their own configuration adapter to load @@ -13,32 +14,26 @@ public interface ConfigurationAdapter * Gets an integer from the specified path. * * @param path the path to retrieve the integer from + * @param def the default value * @return the retrieved integer */ - public int getInt(String path); + public int getInt(String path, int def); /** * Gets a string from the specified path. * * @param path the path to retrieve the string from. + * @param def the default value * @return the retrieved string */ - public String getString(String path); - - /** - * Get a string list from the specified path. - * - * @param path the path to retrieve the list from. - * @return the retrieved list. - */ - public Collection getStrings(String path); + public String getString(String path, String def); /** * Get the configuration all servers which may be accessible via the proxy. * - * @return all accessible servers + * @return all accessible servers, keyed by name */ - public Collection getServers(); + public Map getServers(); /** * Get information about all hosts to bind the proxy to. diff --git a/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java b/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java index 84765ad7..150a79f3 100644 --- a/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java +++ b/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java @@ -23,4 +23,13 @@ public class ListenerInfo * Max amount of slots displayed on the ping page. */ private final int maxPlayers; + /** + * Name of the server which users will be taken to by default. + */ + private final String defaultServer; + /** + * Whether reconnect locations will be used, or else the user is simply + * transferred to the default server on connect. + */ + private final boolean forceDefault; } diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java index c8fde24b..cff36b5f 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -1,5 +1,6 @@ package net.md_5.bungee; +import net.md_5.bungee.config.Configuration; import java.io.BufferedReader; import java.io.File; import java.io.IOException; diff --git a/proxy/src/main/java/net/md_5/bungee/Configuration.java b/proxy/src/main/java/net/md_5/bungee/Configuration.java deleted file mode 100644 index 92ca0ebd..00000000 --- a/proxy/src/main/java/net/md_5/bungee/Configuration.java +++ /dev/null @@ -1,294 +0,0 @@ -package net.md_5.bungee; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import static net.md_5.bungee.Logger.$; -import net.md_5.bungee.api.ChatColor; -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.Yaml; - -/** - * Core configuration for the proxy. - */ -public class Configuration -{ - - /** - * Reconnect locations file. - */ - private transient File reconnect = new File("locations.yml"); - /** - * Loaded reconnect locations. - */ - private transient Map reconnectLocations; - /** - * Config file. - */ - private transient File file = new File("config.yml"); - /** - * Yaml instance. - */ - private transient Yaml yaml; - /** - * Loaded config. - */ - private transient Map config; - /** - * Bind host. - */ - public String bindHost = "0.0.0.0:25577"; - /** - * Server ping motd. - */ - public String motd = "BungeeCord Proxy Instance"; - /** - * Name of default server. - */ - public String defaultServerName = "default"; - /** - * Max players as displayed in list ping. Soft limit. - */ - public int maxPlayers = 1; - /** - * Tab list 1: For a tab list that is global over all server (using their - * Minecraft name) and updating their ping frequently 2: Same as 1 but does - * not update their ping frequently, just once, 3: Makes the individual - * servers handle the tab list (server unique). - */ - public int tabList = 1; - /** - * Socket timeout. - */ - public int timeout = 15000; - /** - * All servers. - */ - public Map servers = new HashMap() - { - - { - put(defaultServerName, "127.0.0.1:1338"); - put("pvp", "127.0.0.1:1337"); - } - }; - /** - * Forced servers. - */ - public Map forcedServers = new HashMap() - { - - { - put("pvp.md-5.net", "pvp"); - } - }; - /** - * Proxy admins. - */ - public List admins = new ArrayList() - { - - { - add("Insert Admins Here"); - } - }; - /** - * Proxy moderators. - */ - public List moderators = new ArrayList() - { - - { - add("Insert Moderators Here"); - } - }; - /** - * Commands which will be blocked completely. - */ - public List disabledCommands = new ArrayList() - { - - { - add("glist"); - } - }; - /** - * Maximum number of lines to log before old ones are removed. - */ - public int logNumLines = 1 << 14; - /** - * UUID for Metrics. - */ - public String statsUuid = UUID.randomUUID().toString(); - public boolean metricsEnabled = true; - public boolean forceDefaultServer = false; - - /** - * Load the configuration and save default values. - */ - public void load() - { - try - { - file.createNewFile(); - DumperOptions options = new DumperOptions(); - options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - yaml = new Yaml(options); - - try (InputStream is = new FileInputStream(file)) - { - config = (Map) yaml.load(is); - } - - if (config == null) - { - config = new LinkedHashMap<>(); - } - - $().info("-------------- Loading configuration ----------------"); - for (Field field : getClass().getDeclaredFields()) - { - if (!Modifier.isTransient(field.getModifiers())) - { - String name = Util.normalize(field.getName()); - try - { - Object def = field.get(this); - Object value = get(name, def); - - field.set(this, value); - - $().info(name + ": " + value); - } catch (IllegalAccessException ex) - { - $().severe("Could not get config node: " + name); - } - } - } - $().info("-----------------------------------------------------"); - - if (servers.get(defaultServerName) == null) - { - throw new IllegalArgumentException("Server '" + defaultServerName + "' not defined"); - } - - if (forcedServers != null) - { - for (String server : forcedServers.values()) - { - if (!servers.containsKey(server)) - { - throw new IllegalArgumentException("Forced server " + server + " is not defined in servers"); - } - } - } - - motd = ChatColor.translateAlternateColorCodes('&', motd); - - reconnect.createNewFile(); - try (FileInputStream recon = new FileInputStream(reconnect)) - { - reconnectLocations = (Map) yaml.load(recon); - } - if (reconnectLocations == null) - { - reconnectLocations = new LinkedHashMap<>(); - } - - } catch (IOException ex) - { - $().severe("Could not load config!"); - ex.printStackTrace(); - } - } - - private T get(String path, T def) - { - if (!config.containsKey(path)) - { - config.put(path, def); - save(file, config); - } - return (T) config.get(path); - } - - private void save(File fileToSave, Map toSave) - { - try - { - try (FileWriter wr = new FileWriter(fileToSave)) - { - yaml.dump(toSave, wr); - } - } catch (IOException ex) - { - $().severe("Could not save config file " + fileToSave); - ex.printStackTrace(); - } - } - - /** - * Get which server a user should be connected to, taking into account their - * name and virtual host. - * - * @param user to get a server for - * @param requestedHost the host which they connected to - * @return the name of the server which they should be connected to. - */ - public String getServer(String user, String requestedHost) - { - String server = (forcedServers == null) ? null : forcedServers.get(requestedHost); - if (server == null) - { - server = reconnectLocations.get(user); - } - if (server == null) - { - server = defaultServerName; - } - return server; - } - - /** - * Save the last server which the user was on. - * - * @param user the name of the user - * @param server which they were last on - */ - public void setServer(UserConnection user, String server) - { - reconnectLocations.put(user.name, server); - } - - /** - * Gets the connectable address of a server defined in the configuration. - * - * @param name the friendly name of a server - * @return the usable {@link InetSocketAddress} mapped to this server - */ - public InetSocketAddress getServer(String name) - { - String server = servers.get((name == null) ? defaultServerName : name); - return (server != null) ? Util.getAddr(server) : getServer(null); - } - - /** - * Save the current mappings of users to servers. - */ - public void saveHosts() - { - save(reconnect, reconnectLocations); - $().info("Saved reconnect locations to " + reconnect); - } -} diff --git a/proxy/src/main/java/net/md_5/bungee/InitialHandler.java b/proxy/src/main/java/net/md_5/bungee/InitialHandler.java index 8211eeda..d1c03d92 100644 --- a/proxy/src/main/java/net/md_5/bungee/InitialHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/InitialHandler.java @@ -1,5 +1,6 @@ package net.md_5.bungee; +import net.md_5.bungee.config.Configuration; import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; diff --git a/proxy/src/main/java/net/md_5/bungee/Logger.java b/proxy/src/main/java/net/md_5/bungee/Logger.java index 63964fe1..5f570159 100644 --- a/proxy/src/main/java/net/md_5/bungee/Logger.java +++ b/proxy/src/main/java/net/md_5/bungee/Logger.java @@ -23,7 +23,7 @@ public class Logger extends java.util.logging.Logger super("RubberBand", null); try { - FileHandler handler = new FileHandler("proxy.log", BungeeCord.getInstance().config.logNumLines, 1, true); + FileHandler handler = new FileHandler("proxy.log", 1 << 14, 1, true); handler.setFormatter(formatter); addHandler(handler); } catch (IOException ex) diff --git a/proxy/src/main/java/net/md_5/bungee/Metrics.java b/proxy/src/main/java/net/md_5/bungee/Metrics.java index 2be00b5a..a770a093 100644 --- a/proxy/src/main/java/net/md_5/bungee/Metrics.java +++ b/proxy/src/main/java/net/md_5/bungee/Metrics.java @@ -74,7 +74,7 @@ public class Metrics extends Thread { // Construct the post data final StringBuilder data = new StringBuilder(); - data.append(encode("guid")).append('=').append(encode(BungeeCord.getInstance().config.statsUuid)); + data.append(encode("guid")).append('=').append(encode(BungeeCord.getInstance().config.getUuid())); encodeDataPair(data, "version", ProxyServer.getInstance().getVersion()); encodeDataPair(data, "server", "0"); encodeDataPair(data, "players", Integer.toString(ProxyServer.getInstance().getPlayers().size())); diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index 8e1ff036..aa4a7da9 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -47,6 +47,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer // Permissions private final Collection groups = new HashSet<>(); private final Map permissions = new HashMap<>(); + private final Object permMutex = new Object(); public UserConnection(Socket socket, PacketInputStream in, OutputStream out, Packet2Handshake handshake, List loginPackets) { diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java b/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java deleted file mode 100644 index a253f185..00000000 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandMotd.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.md_5.bungee.command; - -import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.plugin.Command; - -/** - * Command to set a temp copy of the motd in real-time without stopping the - * proxy. - */ -public class CommandMotd extends Command -{ - - public CommandMotd() - { - super("bungeecord.command.motd"); - } - - @Override - public void execute(CommandSender sender, String[] args) - { - StringBuilder newMOTD = new StringBuilder(); - for (String s : args) - { - newMOTD.append(s); - newMOTD.append(" "); - } - BungeeCord.getInstance().config.motd = ChatColor.translateAlternateColorCodes('&', newMOTD.substring(0, newMOTD.length() - 1)); - } -} diff --git a/proxy/src/main/java/net/md_5/bungee/config/Configuration.java b/proxy/src/main/java/net/md_5/bungee/config/Configuration.java new file mode 100644 index 00000000..0e6c73e1 --- /dev/null +++ b/proxy/src/main/java/net/md_5/bungee/config/Configuration.java @@ -0,0 +1,84 @@ +package net.md_5.bungee.config; + +import com.google.common.base.Preconditions; +import java.util.Collection; +import java.util.Map; +import java.util.UUID; +import lombok.Getter; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.config.ConfigurationAdapter; +import net.md_5.bungee.api.config.ListenerInfo; +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.tablist.GlobalPingTabList; +import net.md_5.bungee.tablist.GlobalTabList; +import net.md_5.bungee.tablist.ServerUniqueTabList; + +/** + * Core configuration for the proxy. + */ +@Getter +public class Configuration +{ + + /** + * The default tab list options available for picking. + */ + private enum DefaultTabList + { + + GLOBAL, GLOBAL_PING, SERVER; + } + /** + * Time before users are disconnected due to no network activity. + */ + private int timeout = 30000; + /** + * UUID used for metrics. + */ + private String uuid = UUID.randomUUID().toString(); + /** + * Set of all listeners. + */ + private Collection listeners; + /** + * Set of all servers. + */ + private Map servers; + + public void load() + { + ConfigurationAdapter adapter = ProxyServer.getInstance().getConfigurationAdapter(); + + timeout = adapter.getInt("timeout", timeout); + uuid = adapter.getString("stats", uuid); + + DefaultTabList tab = DefaultTabList.valueOf(adapter.getString("tab_list", "GLOBAL_PING")); + if (tab == null) + { + tab = DefaultTabList.GLOBAL_PING; + } + switch (tab) + { + case GLOBAL: + ProxyServer.getInstance().setTabListHandler(new GlobalTabList()); + break; + case GLOBAL_PING: + ProxyServer.getInstance().setTabListHandler(new GlobalPingTabList()); + break; + case SERVER: + ProxyServer.getInstance().setTabListHandler(new ServerUniqueTabList()); + break; + } + + listeners = adapter.getListeners(); + Preconditions.checkArgument(listeners != null && !listeners.isEmpty(), "No listeners defined."); + + servers = adapter.getServers(); + Preconditions.checkArgument(servers != null && !servers.isEmpty(), "No servers defined"); + + for (ListenerInfo listener : listeners) + { + Preconditions.checkArgument(servers.containsKey(listener.getDefaultServer())); + } + } +} diff --git a/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java b/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java new file mode 100644 index 00000000..b9cfe567 --- /dev/null +++ b/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java @@ -0,0 +1,150 @@ +package net.md_5.bungee.config; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.InetSocketAddress; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Map; +import net.md_5.bungee.Util; +import net.md_5.bungee.api.config.ConfigurationAdapter; +import net.md_5.bungee.api.config.ListenerInfo; +import net.md_5.bungee.api.config.ServerInfo; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; + +public class YamlConfig implements ConfigurationAdapter +{ + + private boolean loaded; + private Yaml yaml; + private Map config; + + public void load() + { + try + { + File file = new File("config.yml"); + file.createNewFile(); + DumperOptions options = new DumperOptions(); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + yaml = new Yaml(options); + + try (InputStream is = new FileInputStream(file)) + { + config = (Map) yaml.load(is); + } + + if (config == null) + { + config = new LinkedHashMap<>(); + } + + loaded = true; + } catch (IOException ex) + { + throw new RuntimeException("Could not load configuration!", ex); + } + } + + private T get(String path, T def) + { + return get(path, def, config); + } + + private T get(String path, T def, Map submap) + { + if (!loaded) + { + load(); + } + + int index = path.indexOf('.'); + if (index == -1) + { + Object val = submap.get(path); + return (val != null) ? (T) val : def; + } else + { + String first = path.substring(0, index); + String second = path.substring(index, path.length()); + Map sub = (Map) submap.get(first); + return (sub != null) ? get(second, def, sub) : def; + } + } + + @Override + public int getInt(String path, int def) + { + return get(path, def); + } + + @Override + public String getString(String path, String def) + { + return get(path, def); + } + + @Override + @SuppressWarnings("unchecked") + public Map getServers() + { + Map> base = get("servers", Collections.EMPTY_MAP); + Map ret = new HashMap<>(); + + for (Map.Entry> entry : base.entrySet()) + { + Map val = entry.getValue(); + String name = get("name", null, val); + String permission = get("permission", null, val); + String addr = get("address", null, val); + InetSocketAddress address = Util.getAddr(addr); + ServerInfo info = new ServerInfo(name, address, permission); + ret.put(name, info); + } + + return ret; + } + + @Override + @SuppressWarnings("unchecked") + public Collection getListeners() + { + Map> base = get("listeners", Collections.EMPTY_MAP); + Collection ret = new HashSet<>(); + + for (Map.Entry> entry : base.entrySet()) + { + Map val = entry.getValue(); + String motd = get("motd", null, val); + int maxPlayers = get("motd", null, val); + String defaultServer = get("default", null, val); + boolean forceDefault = get("force_default", null, val); + String host = get("host", null, val); + InetSocketAddress address = Util.getAddr(host); + ListenerInfo info = new ListenerInfo(address, motd, maxPlayers, defaultServer, forceDefault); + ret.add(info); + } + + return ret; + } + + @Override + @SuppressWarnings("unchecked") + public Collection getGroups(String player) + { + return get("groups." + player, Collections.EMPTY_SET); + } + + @Override + @SuppressWarnings("unchecked") + public Collection getPermissions(String group) + { + return get("permissions." + group, Collections.EMPTY_SET); + } +} From cf42a10ba4921d1711d51665bde0771bb655d8b5 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 19 Jan 2013 10:49:11 +1100 Subject: [PATCH 34/45] Pretty close to compiling for the first time in ages. It wont be anywhere near working though. --- .../java/net/md_5/bungee/api/ProxyServer.java | 8 +- .../md_5/bungee/api/config/ServerInfo.java | 42 +++++++++ .../bungee/api/connection/ProxiedPlayer.java | 7 +- .../bungee/api/event/ServerConnectEvent.java | 4 +- .../main/java/net/md_5/bungee/BungeeCord.java | 83 +++++++----------- .../java/net/md_5/bungee/UserConnection.java | 85 ++++++++----------- .../md_5/bungee/command/CommandServer.java | 11 +-- 7 files changed, 120 insertions(+), 120 deletions(-) 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 719731fa..4d916129 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 @@ -6,6 +6,7 @@ import java.util.Collection; 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.connection.Server; import net.md_5.bungee.api.plugin.Plugin; @@ -74,13 +75,6 @@ public abstract class ProxyServer */ public abstract Server getServer(String name); - /** - * Return all servers configured as proxy targets. - * - * @return all known target servers - */ - public abstract Collection getServers(); - /** * Get the {@link PluginManager} associated with loading plugins and * dispatching events. It is recommended that implementations use the diff --git a/api/src/main/java/net/md_5/bungee/api/config/ServerInfo.java b/api/src/main/java/net/md_5/bungee/api/config/ServerInfo.java index 65aee741..a53f9f5c 100644 --- a/api/src/main/java/net/md_5/bungee/api/config/ServerInfo.java +++ b/api/src/main/java/net/md_5/bungee/api/config/ServerInfo.java @@ -1,8 +1,13 @@ package net.md_5.bungee.api.config; import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.Synchronized; +import net.md_5.bungee.api.connection.ProxiedPlayer; /** * Class used to represent a server to connect to. @@ -24,4 +29,41 @@ public class ServerInfo * Permission node required to access this server. */ private String permission; + /** + * Players connected to a server defined by these properties. + */ + private final Collection players = new ArrayList<>(); + + /** + * Add a player to the internal set of this server. + * + * @param player the player to add + */ + @Synchronized("players") + public void addPlayer(ProxiedPlayer player) + { + players.add(player); + } + + /** + * Remove a player form the internal set of this server. + * + * @param player the player to remove + */ + @Synchronized("players") + public void removePlayer(ProxiedPlayer player) + { + players.remove(player); + } + + /** + * Get the set of all players on this server. + * + * @return an unmodifiable collection of all players on this server + */ + @Synchronized("players") + public Collection getPlayers() + { + return Collections.unmodifiableCollection(players); + } } diff --git a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java index c61ad882..59515a8b 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java @@ -1,8 +1,7 @@ package net.md_5.bungee.api.connection; -import lombok.Getter; -import lombok.Setter; import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.config.ServerInfo; /** * Represents a player who's connection is being connected to somewhere else, @@ -31,9 +30,9 @@ public interface ProxiedPlayer extends Connection, CommandSender * closing the current one. Depending on the implementation, this method * might return before the user has been connected. * - * @param server the new server to connect to + * @param target the new server to connect to */ - public void connect(Server server); + public void connect(ServerInfo target); /** * Gets the server this player is connected to. diff --git a/api/src/main/java/net/md_5/bungee/api/event/ServerConnectEvent.java b/api/src/main/java/net/md_5/bungee/api/event/ServerConnectEvent.java index b050d582..2637bc32 100644 --- a/api/src/main/java/net/md_5/bungee/api/event/ServerConnectEvent.java +++ b/api/src/main/java/net/md_5/bungee/api/event/ServerConnectEvent.java @@ -4,8 +4,8 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.plugin.Event; @Data @@ -22,5 +22,5 @@ public class ServerConnectEvent extends Event /** * Server the player will be connected to. */ - private Server target; + private ServerInfo target; } diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java index cff36b5f..24645bf7 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -8,6 +8,7 @@ import java.io.InputStreamReader; import java.net.InetSocketAddress; import java.net.Socket; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Timer; @@ -16,6 +17,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import java.util.logging.Level; import java.util.logging.Logger; import lombok.Getter; import lombok.Setter; @@ -24,15 +26,14 @@ import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.ReconnectHandler; import net.md_5.bungee.api.TabListHandler; import net.md_5.bungee.api.config.ConfigurationAdapter; +import net.md_5.bungee.api.config.ListenerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.plugin.PluginManager; import net.md_5.bungee.command.*; +import net.md_5.bungee.config.YamlConfig; import net.md_5.bungee.packet.DefinedPacket; -import net.md_5.bungee.tablist.GlobalPingTabList; -import net.md_5.bungee.tablist.GlobalTabList; -import net.md_5.bungee.tablist.ServerUniqueTabList; /** * Main BungeeCord proxy class. @@ -67,7 +68,7 @@ public class BungeeCord extends ProxyServer /** * Server socket listener. */ - private ListenThread listener; + private Collection listeners = new HashSet<>(); /** * Fully qualified connections. */ @@ -87,17 +88,18 @@ public class BungeeCord extends ProxyServer @Getter @Setter private ReconnectHandler reconnectHandler; + @Getter + @Setter + private ConfigurationAdapter configurationAdapter = new YamlConfig(); { - getPluginManager().registerCommand(new CommandReload()); getPluginManager().registerCommand(new CommandReload()); getPluginManager().registerCommand(new CommandEnd()); getPluginManager().registerCommand(new CommandList()); getPluginManager().registerCommand(new CommandServer()); getPluginManager().registerCommand(new CommandIP()); getPluginManager().registerCommand(new CommandAlert()); - getPluginManager().registerCommand(new CommandMotd()); getPluginManager().registerCommand(new CommandBungee()); } @@ -125,7 +127,7 @@ public class BungeeCord extends ProxyServer String line = br.readLine(); if (line != null) { - boolean handled = getInstance().getPluginManager().dispatchCommand(ConsoleCommandSender.instance, line); + boolean handled = getInstance().getPluginManager().dispatchCommand(ConsoleCommandSender.getInstance(), line); if (!handled) { System.err.println("Command not found"); @@ -149,24 +151,15 @@ public class BungeeCord extends ProxyServer plugins.mkdir(); pluginManager.loadPlugins(plugins); - switch (config.tabList) + for (ListenerInfo info : config.getListeners()) { - default: - case 1: - tabListHandler = new GlobalPingTabList(); - break; - case 2: - tabListHandler = new GlobalTabList(); - break; - case 3: - tabListHandler = new ServerUniqueTabList(); - break; + InetSocketAddress addr = info.getHost(); + $().info("Listening on " + addr); + ListenThread listener = new ListenThread(addr); + listener.start(); + listeners.add(listener); } - InetSocketAddress addr = Util.getAddr(config.bindHost); - listener = new ListenThread(addr); - listener.start(); - saveThread.scheduleAtFixedRate(new TimerTask() { @Override @@ -175,18 +168,11 @@ public class BungeeCord extends ProxyServer getReconnectHandler().save(); } }, 0, TimeUnit.MINUTES.toMillis(5)); - $().info("Listening on " + addr); - if (config.metricsEnabled) - { - new Metrics().start(); - } + new Metrics().start(); } - /** - * Destroy this proxy instance cleanly by kicking all users, saving the - * configuration and closing all sockets. - */ + @Override public void stop() { this.isRunning = false; @@ -196,14 +182,17 @@ public class BungeeCord extends ProxyServer plugin.onDisable(); } - $().info("Closing listen thread"); - try + for (ListenThread listener : listeners) { - listener.socket.close(); - listener.join(); - } catch (InterruptedException | IOException ex) - { - $().severe("Could not close listen thread"); + $().log(Level.INFO, "Closing listen thread {0}", listener.socket); + try + { + listener.socket.close(); + listener.join(); + } catch (InterruptedException | IOException ex) + { + $().severe("Could not close listen thread"); + } } $().info("Closing pending connections"); @@ -216,6 +205,7 @@ public class BungeeCord extends ProxyServer } $().info("Saving reconnect locations"); + reconnectHandler.save(); saveThread.cancel(); $().info("Thank you and goodbye"); @@ -231,7 +221,7 @@ public class BungeeCord extends ProxyServer */ public void setSocketOptions(Socket socket) throws IOException { - socket.setSoTimeout(config.timeout); + socket.setSoTimeout(config.getTimeout()); socket.setTrafficClass(0x18); socket.setTcpNoDelay(true); } @@ -283,18 +273,7 @@ public class BungeeCord extends ProxyServer @Override public Server getServer(String name) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Collection getServers() - { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public void setConfigurationAdapter(ConfigurationAdapter adapter) - { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + List users = connectionsByServer.get(name); + return (users != null && !users.isEmpty()) ? users.get(0).getServer() : null; } } diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index aa4a7da9..3e6f3205 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -18,8 +18,8 @@ import java.util.concurrent.ConcurrentLinkedQueue; import lombok.Getter; import lombok.Synchronized; import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.event.ChatEvent; import net.md_5.bungee.api.event.PluginMessageEvent; import net.md_5.bungee.api.event.ServerConnectEvent; @@ -56,8 +56,6 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer name = handshake.username; displayName = handshake.username; this.loginPackets = loginPackets; - BungeeCord.instance.connections.put(name, this); - BungeeCord.instance.tabListHandler.onJoin(this); } @Override @@ -68,17 +66,21 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer ProxyServer.getInstance().getTabListHandler().onConnect(this); } - public void connect(Server server) + @Override + public void connect(ServerInfo target) { - ServerConnectEvent event = new ServerConnectEvent(this, server); - BungeeCord.getInstance().getPluginManager().callEvent(event); - InetSocketAddress addr = BungeeCord.instance.config.getServer(event.getNewServer()); - connect(server, addr); - } + if (server == null) + { + // First join + ProxyServer.getInstance().getPlayers().add(this); + ProxyServer.getInstance().getTabListHandler().onConnect(this); + } - private void connect(String name, InetSocketAddress serverAddr) - { - BungeeCord.instance.tabListHandler.onServerChange(this); + ServerConnectEvent event = new ServerConnectEvent(this, target); + BungeeCord.getInstance().getPluginManager().callEvent(event); + target = event.getTarget(); // Update in case the event changed target + + ProxyServer.getInstance().getTabListHandler().onServerChange(this); try { reconnecting = true; @@ -89,9 +91,10 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer out.write(new Packet9Respawn((byte) -1, (byte) 0, (byte) 0, (short) 256, "DEFAULT").getPacket()); } - ServerConnection newServer = ServerConnection.connect(this, name, serverAddr, handshake, true); + ServerConnection newServer = ServerConnection.connect(this, name, target.getAddress(), handshake, true); if (server == null) { + // Once again, first connection clientEntityId = newServer.loginPacket.entityId; serverEntityId = newServer.loginPacket.entityId; out.write(newServer.loginPacket.getPacket()); @@ -113,27 +116,18 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer serverEntityId = login.entityId; out.write(new Packet9Respawn(login.dimension, login.difficulty, login.gameMode, (short) 256, login.levelType).getPacket()); } + + // Reconnect process has finished, lets get the player moving again reconnecting = false; - downBridge = new DownstreamBridge(); - if (server != null) - { - List conns = BungeeCord.instance.connectionsByServer.get(server.name); - if (conns != null) - { - conns.remove(this); - } - } + + // Remove from the old by server list + server.getInfo().removePlayer(this); + // Add to new + target.addPlayer(this); + + // Start the bridges and move on server = newServer; - List conns = BungeeCord.instance.connectionsByServer.get(server.name); - if (conns == null) - { - conns = new ArrayList<>(); - BungeeCord.instance.connectionsByServer.put(server.name, conns); - } - if (!conns.contains(this)) - { - conns.add(this); - } + downBridge = new DownstreamBridge(); downBridge.start(); } catch (KickException ex) { @@ -147,18 +141,9 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer private void destroySelf(String reason) { - if (BungeeCord.instance.isRunning) - { - BungeeCord.instance.connections.remove(name); - if (server != null) - { - List conns = BungeeCord.instance.connectionsByServer.get(server.name); - if (conns != null) - { - conns.remove(this); - } - } - } + server.getInfo().removePlayer(this); + ProxyServer.getInstance().getPlayers().remove(this); + disconnect(reason); if (server != null) { @@ -193,14 +178,14 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer } @Override - @Synchronized(value = "permMutex") + @Synchronized("permMutex") public Collection getGroups() { return Collections.unmodifiableCollection(groups); } @Override - @Synchronized(value = "permMutex") + @Synchronized("permMutex") public void addGroups(String... groups) { for (String group : groups) @@ -214,7 +199,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer } @Override - @Synchronized(value = "permMutex") + @Synchronized( "permMutex") public void removeGroups(String... groups) { for (String group : groups) @@ -228,7 +213,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer } @Override - @Synchronized(value = "permMutex") + @Synchronized("permMutex") public boolean hasPermission(String permission) { Boolean val = permissions.get(permission); @@ -236,7 +221,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer } @Override - @Synchronized(value = "permMutex") + @Synchronized( "permMutex") public void setPermission(String permission, boolean value) { permissions.put(permission, value); @@ -387,7 +372,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer in.readFully(data); break; case "BungeeCord::Connect": - Server server = ProxyServer.getInstance().getServer(in.readUTF()); + ServerInfo server = ProxyServer.getInstance().getConfigurationAdapter().getServers().get(in.readUTF()); if (server != null) { connect(server); diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java b/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java index 92f01c99..c3b36db8 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java @@ -1,9 +1,10 @@ package net.md_5.bungee.command; -import java.util.Collection; +import java.util.Map; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.plugin.Command; @@ -27,20 +28,20 @@ public class CommandServer extends Command return; } ProxiedPlayer player = (ProxiedPlayer) sender; - Collection servers = ProxyServer.getInstance().getServers(); + Map servers = ProxyServer.getInstance().getConfigurationAdapter().getServers(); if (args.length == 0) { StringBuilder serverList = new StringBuilder(); - for (Server server : servers) + for (String server : servers.keySet()) { - serverList.append(server.getInfo().getName()); + serverList.append(server); serverList.append(", "); } serverList.setLength(serverList.length() - 2); player.sendMessage(ChatColor.GOLD + "You may connect to the following servers at this time: " + serverList.toString()); } else { - Server server = ProxyServer.getInstance().getServer(args[0]); + ServerInfo server = servers.get(args[0]); if (server == null) { player.sendMessage(ChatColor.RED + "The specified server does not exist"); From bf1e7f09a9d160459edfbe843319147fa7fbecaa Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 19 Jan 2013 13:33:04 +1100 Subject: [PATCH 35/45] Well, it compiles, time to start fixing stuff. --- .../java/net/md_5/bungee/api/ProxyServer.java | 14 +++++++++++++- .../net/md_5/bungee/api/connection/Server.java | 11 ----------- .../main/java/net/md_5/bungee/BungeeCord.java | 13 +++++++++---- .../java/net/md_5/bungee/InitialHandler.java | 17 ++++++++++++----- .../main/java/net/md_5/bungee/ListenThread.java | 12 +++++++----- .../java/net/md_5/bungee/ServerConnection.java | 14 +++----------- .../java/net/md_5/bungee/UserConnection.java | 7 +++++-- .../net/md_5/bungee/command/CommandServer.java | 5 ++--- 8 files changed, 51 insertions(+), 42 deletions(-) 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 4d916129..6bd86f96 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,6 +3,7 @@ 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.Map; import java.util.logging.Logger; import lombok.Getter; import net.md_5.bungee.api.config.ConfigurationAdapter; @@ -68,13 +69,24 @@ public abstract class ProxyServer public abstract ProxiedPlayer getPlayer(String name); /** - * Get a server by its name. + * Get a server by its name. The instance returned will be taken from a + * player currently on that server to facilitate abstract proxy -> server + * actions. * * @param name the name to lookup * @return the associated server */ public abstract Server getServer(String name); + /** + * 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 getServers(); + /** * Get the {@link PluginManager} associated with loading plugins and * dispatching events. It is recommended that implementations use the diff --git a/api/src/main/java/net/md_5/bungee/api/connection/Server.java b/api/src/main/java/net/md_5/bungee/api/connection/Server.java index 1bb0d04f..caa8dd45 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/Server.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/Server.java @@ -1,9 +1,5 @@ package net.md_5.bungee.api.connection; -import java.net.InetSocketAddress; -import java.util.Collection; -import lombok.Getter; -import lombok.RequiredArgsConstructor; import net.md_5.bungee.api.Callback; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.ServerPing; @@ -35,11 +31,4 @@ public interface Server extends Connection * @param callback the callback to call when the count has been retrieved. */ public abstract void ping(Callback callback); - - /** - * Get all players on this instance connected to this server. - * - * @return all players connected to this server - */ - public abstract Collection getPlayers(); } diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java index 24645bf7..a9b9d589 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -5,7 +5,6 @@ import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; -import java.net.InetSocketAddress; import java.net.Socket; import java.util.Collection; import java.util.HashSet; @@ -27,6 +26,7 @@ import net.md_5.bungee.api.ReconnectHandler; import net.md_5.bungee.api.TabListHandler; import net.md_5.bungee.api.config.ConfigurationAdapter; import net.md_5.bungee.api.config.ListenerInfo; +import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.plugin.Plugin; @@ -153,9 +153,8 @@ public class BungeeCord extends ProxyServer for (ListenerInfo info : config.getListeners()) { - InetSocketAddress addr = info.getHost(); - $().info("Listening on " + addr); - ListenThread listener = new ListenThread(addr); + $().info("Listening on " + info.getHost()); + ListenThread listener = new ListenThread(info); listener.start(); listeners.add(listener); } @@ -276,4 +275,10 @@ public class BungeeCord extends ProxyServer List users = connectionsByServer.get(name); return (users != null && !users.isEmpty()) ? users.get(0).getServer() : null; } + + @Override + public Map getServers() + { + return config.getServers(); + } } diff --git a/proxy/src/main/java/net/md_5/bungee/InitialHandler.java b/proxy/src/main/java/net/md_5/bungee/InitialHandler.java index d1c03d92..605f0e4b 100644 --- a/proxy/src/main/java/net/md_5/bungee/InitialHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/InitialHandler.java @@ -10,6 +10,8 @@ import java.util.List; import javax.crypto.SecretKey; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.config.ListenerInfo; +import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.event.LoginEvent; import net.md_5.bungee.packet.Packet2Handshake; @@ -24,13 +26,15 @@ public class InitialHandler implements Runnable, PendingConnection { private final Socket socket; + private final ListenerInfo info; private PacketInputStream in; private OutputStream out; private Packet2Handshake handshake; - public InitialHandler(Socket socket) throws IOException + public InitialHandler(Socket socket, ListenerInfo info) throws IOException { this.socket = socket; + this.info = info; in = new PacketInputStream(socket.getInputStream()); out = socket.getOutputStream(); } @@ -73,7 +77,10 @@ public class InitialHandler implements Runnable, PendingConnection customPackets.add(custom); } - UserConnection userCon = new UserConnection(socket, in, out, handshake, customPackets); + UserConnection userCon = new UserConnection(socket, info, in, out, handshake, customPackets); + String server = ProxyServer.getInstance().getReconnectHandler().getServer(userCon); + ServerInfo s = BungeeCord.getInstance().config.getServers().get(server); + userCon.connect(s); break; case 0xFE: socket.setSoTimeout(100); @@ -89,10 +96,10 @@ public class InitialHandler implements Runnable, PendingConnection String ping = (newPing) ? ChatColor.COLOR_CHAR + "1" + "\00" + BungeeCord.PROTOCOL_VERSION + "\00" + BungeeCord.GAME_VERSION - + "\00" + conf.motd + + "\00" + info.getMotd() + "\00" + ProxyServer.getInstance().getPlayers().size() - + "\00" + conf.maxPlayers - : conf.motd + ChatColor.COLOR_CHAR + ProxyServer.getInstance().getPlayers().size() + ChatColor.COLOR_CHAR + conf.maxPlayers; + + "\00" + info.getMaxPlayers() + : info.getMotd() + ChatColor.COLOR_CHAR + ProxyServer.getInstance().getPlayers().size() + ChatColor.COLOR_CHAR + info.getMaxPlayers(); throw new KickException(ping); default: if (id == 0xFA) diff --git a/proxy/src/main/java/net/md_5/bungee/ListenThread.java b/proxy/src/main/java/net/md_5/bungee/ListenThread.java index 5d6cbae1..ab54b1ff 100644 --- a/proxy/src/main/java/net/md_5/bungee/ListenThread.java +++ b/proxy/src/main/java/net/md_5/bungee/ListenThread.java @@ -1,11 +1,11 @@ package net.md_5.bungee; import java.io.IOException; -import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import static net.md_5.bungee.Logger.$; +import net.md_5.bungee.api.config.ListenerInfo; /** * Thread to listen and dispatch incoming connections to the proxy. @@ -14,12 +14,14 @@ public class ListenThread extends Thread { public final ServerSocket socket; + private final ListenerInfo info; - public ListenThread(InetSocketAddress addr) throws IOException + public ListenThread(ListenerInfo info) throws IOException { - super("Listen Thread"); + super("Listen Thread - "+ info); + this.info = info; socket = new ServerSocket(); - socket.bind(addr); + socket.bind(info.getHost()); } @Override @@ -32,7 +34,7 @@ public class ListenThread extends Thread Socket client = socket.accept(); BungeeCord.getInstance().setSocketOptions(client); $().info(client.getInetAddress() + " has connected"); - InitialHandler handler = new InitialHandler(client); + InitialHandler handler = new InitialHandler(client,info); BungeeCord.getInstance().threadPool.submit(handler); } catch (SocketException ex) { diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java index d7096407..65d1c5d1 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java @@ -4,14 +4,12 @@ import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.security.PublicKey; -import java.util.Collection; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import javax.crypto.SecretKey; import net.md_5.bungee.api.Callback; import net.md_5.bungee.api.ServerPing; import net.md_5.bungee.api.config.ServerInfo; -import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.packet.DefinedPacket; import net.md_5.bungee.packet.Packet1Login; @@ -46,7 +44,7 @@ public class ServerConnection extends GenericConnection implements Server try { Socket socket = new Socket(); - socket.connect(address, BungeeCord.getInstance().config.timeout); + socket.connect(address, BungeeCord.getInstance().config.getTimeout()); BungeeCord.getInstance().setSocketOptions(socket); PacketInputStream in = new PacketInputStream(socket.getInputStream()); @@ -89,7 +87,7 @@ public class ServerConnection extends GenericConnection implements Server throw ex; } catch (Exception ex) { - InetSocketAddress def = BungeeCord.getInstance().config.getServer(null); + InetSocketAddress def = BungeeCord.getInstance().config.getServers().get(user.info.getDefaultServer()).getAddress(); if (retry && !address.equals(def)) { return connect(user, name, def, handshake, false); @@ -118,15 +116,9 @@ public class ServerConnection extends GenericConnection implements Server throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } - @Override - public Collection getPlayers() - { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - @Override public InetSocketAddress getAddress() { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + return getInfo().getAddress(); } } diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index 3e6f3205..bb557304 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -18,6 +18,7 @@ import java.util.concurrent.ConcurrentLinkedQueue; import lombok.Getter; import lombok.Synchronized; import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.config.ListenerInfo; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.event.ChatEvent; @@ -31,6 +32,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer public final Packet2Handshake handshake; public Queue packetQueue = new ConcurrentLinkedQueue<>(); public List loginPackets = new ArrayList<>(); +final ListenerInfo info; @Getter private ServerConnection server; private UpstreamBridge upBridge; @@ -49,9 +51,10 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer private final Map permissions = new HashMap<>(); private final Object permMutex = new Object(); - public UserConnection(Socket socket, PacketInputStream in, OutputStream out, Packet2Handshake handshake, List loginPackets) + public UserConnection(Socket socket, ListenerInfo info, PacketInputStream in, OutputStream out, Packet2Handshake handshake, List loginPackets) { super(socket, in, out); + this.info = info; this.handshake = handshake; name = handshake.username; displayName = handshake.username; @@ -372,7 +375,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer in.readFully(data); break; case "BungeeCord::Connect": - ServerInfo server = ProxyServer.getInstance().getConfigurationAdapter().getServers().get(in.readUTF()); + ServerInfo server = BungeeCord.getInstance().config.getServers().get(in.readUTF()); if (server != null) { connect(server); diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java b/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java index c3b36db8..29d5e5ec 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java @@ -1,12 +1,11 @@ package net.md_5.bungee.command; import java.util.Map; +import net.md_5.bungee.BungeeCord; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.plugin.Command; /** @@ -28,7 +27,7 @@ public class CommandServer extends Command return; } ProxiedPlayer player = (ProxiedPlayer) sender; - Map servers = ProxyServer.getInstance().getConfigurationAdapter().getServers(); + Map servers = BungeeCord.getInstance().config.getServers(); if (args.length == 0) { StringBuilder serverList = new StringBuilder(); From 355afba6daa92070548a2d94ba316dff764c4803 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 19 Jan 2013 14:05:33 +1100 Subject: [PATCH 36/45] Fix config, up next, reconnect handler. --- .../java/net/md_5/bungee/api/ProxyServer.java | 2 +- .../md_5/bungee/api/config/ServerInfo.java | 4 -- .../net/md_5/bungee/config/YamlConfig.java | 60 ++++++++++++++----- 3 files changed, 46 insertions(+), 20 deletions(-) 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 6bd86f96..f51dec1f 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 @@ -27,7 +27,7 @@ public abstract class ProxyServer public static void setInstance(ProxyServer instance) { Preconditions.checkNotNull(instance, "instance"); - Preconditions.checkArgument(instance == null, "Instance already set"); + Preconditions.checkArgument(ProxyServer.instance == null, "Instance already set"); ProxyServer.instance = instance; } diff --git a/api/src/main/java/net/md_5/bungee/api/config/ServerInfo.java b/api/src/main/java/net/md_5/bungee/api/config/ServerInfo.java index a53f9f5c..4ed5ddfa 100644 --- a/api/src/main/java/net/md_5/bungee/api/config/ServerInfo.java +++ b/api/src/main/java/net/md_5/bungee/api/config/ServerInfo.java @@ -25,10 +25,6 @@ public class ServerInfo * Connectable address of this server. */ private final InetSocketAddress address; - /** - * Permission node required to access this server. - */ - private String permission; /** * Players connected to a server defined by these properties. */ diff --git a/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java b/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java index b9cfe567..3982f229 100644 --- a/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java +++ b/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java @@ -2,16 +2,20 @@ package net.md_5.bungee.config; import java.io.File; import java.io.FileInputStream; +import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.net.InetSocketAddress; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; +import java.util.logging.Level; import net.md_5.bungee.Util; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.config.ConfigurationAdapter; import net.md_5.bungee.api.config.ListenerInfo; import net.md_5.bungee.api.config.ServerInfo; @@ -24,12 +28,12 @@ public class YamlConfig implements ConfigurationAdapter private boolean loaded; private Yaml yaml; private Map config; + File file = new File("config.yml"); public void load() { try { - File file = new File("config.yml"); file.createNewFile(); DumperOptions options = new DumperOptions(); options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); @@ -54,9 +58,14 @@ public class YamlConfig implements ConfigurationAdapter private T get(String path, T def) { + if (!loaded) + { + load(); + } return get(path, def, config); } + @SuppressWarnings("unchecked") private T get(String path, T def, Map submap) { if (!loaded) @@ -68,7 +77,13 @@ public class YamlConfig implements ConfigurationAdapter if (index == -1) { Object val = submap.get(path); - return (val != null) ? (T) val : def; + if (val == null) + { + val = def; + submap.put(path, def); + save(); + } + return (T) val; } else { String first = path.substring(0, index); @@ -78,6 +93,20 @@ public class YamlConfig implements ConfigurationAdapter } } + private void save() + { + try + { + try (FileWriter wr = new FileWriter(file)) + { + yaml.dump(config, wr); + } + } catch (IOException ex) + { + ProxyServer.getInstance().getLogger().log(Level.WARNING, "Could not save config", ex); + } + } + @Override public int getInt(String path, int def) { @@ -94,17 +123,16 @@ public class YamlConfig implements ConfigurationAdapter @SuppressWarnings("unchecked") public Map getServers() { - Map> base = get("servers", Collections.EMPTY_MAP); + Map> base = get("servers", (Map) Collections.singletonMap("lobby", new HashMap<>())); Map ret = new HashMap<>(); for (Map.Entry> entry : base.entrySet()) { Map val = entry.getValue(); - String name = get("name", null, val); - String permission = get("permission", null, val); - String addr = get("address", null, val); + String name = entry.getKey(); + String addr = get("address", "localhost:25565", val); InetSocketAddress address = Util.getAddr(addr); - ServerInfo info = new ServerInfo(name, address, permission); + ServerInfo info = new ServerInfo(name, address); ret.put(name, info); } @@ -115,17 +143,19 @@ public class YamlConfig implements ConfigurationAdapter @SuppressWarnings("unchecked") public Collection getListeners() { - Map> base = get("listeners", Collections.EMPTY_MAP); + Collection> base = get("listeners", (Collection) Arrays.asList(new Map[] + { + new HashMap() + })); Collection ret = new HashSet<>(); - for (Map.Entry> entry : base.entrySet()) + for (Map val : base) { - Map val = entry.getValue(); - String motd = get("motd", null, val); - int maxPlayers = get("motd", null, val); - String defaultServer = get("default", null, val); - boolean forceDefault = get("force_default", null, val); - String host = get("host", null, val); + String motd = get("motd", "Another Bungee server", val); + int maxPlayers = get("max_players", 1, val); + String defaultServer = get("default_server", "lobby", val); + boolean forceDefault = get("force_default_server", false, val); + String host = get("host", "0.0.0.0:25577", val); InetSocketAddress address = Util.getAddr(host); ListenerInfo info = new ListenerInfo(address, motd, maxPlayers, defaultServer, forceDefault); ret.add(info); From 77d5398124822f5048552944062e7bd117dc25b5 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 19 Jan 2013 17:02:49 +1100 Subject: [PATCH 37/45] Add yaml reconnect handler. --- .../api/connection/PendingConnection.java | 8 ++ .../bungee/api/connection/ProxiedPlayer.java | 7 ++ .../main/java/net/md_5/bungee/BungeeCord.java | 2 +- .../java/net/md_5/bungee/InitialHandler.java | 14 ++-- .../net/md_5/bungee/ServerConnection.java | 2 +- .../java/net/md_5/bungee/UserConnection.java | 8 +- .../net/md_5/bungee/YamlReconnectHandler.java | 81 +++++++++++++++++++ 7 files changed, 111 insertions(+), 11 deletions(-) create mode 100644 proxy/src/main/java/net/md_5/bungee/YamlReconnectHandler.java diff --git a/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java b/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java index 7f5cc856..4c952f37 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java @@ -1,6 +1,7 @@ package net.md_5.bungee.api.connection; import java.net.InetSocketAddress; +import net.md_5.bungee.api.config.ListenerInfo; /** * Represents a user attempting to log into the proxy. @@ -36,4 +37,11 @@ public interface PendingConnection extends Connection * @param reason the disconnect reason displayed to the player */ public void disconnect(String reason); + + /** + * Get the listener that accepted this connection. + * + * @return the accepting listener + */ + public ListenerInfo getListener(); } diff --git a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java index 59515a8b..b0e45598 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java @@ -55,4 +55,11 @@ public interface ProxiedPlayer extends Connection, CommandSender * @param data the data to send */ public void sendData(String channel, byte[] data); + + /** + * Get the pending connection that belongs to this player. + * + * @return the pending connection that this player used + */ + public PendingConnection getPendingConnection(); } diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java index a9b9d589..ded8ae36 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -87,7 +87,7 @@ public class BungeeCord extends ProxyServer public final PluginManager pluginManager = new PluginManager(); @Getter @Setter - private ReconnectHandler reconnectHandler; + private ReconnectHandler reconnectHandler = new YamlReconnectHandler(); @Getter @Setter private ConfigurationAdapter configurationAdapter = new YamlConfig(); diff --git a/proxy/src/main/java/net/md_5/bungee/InitialHandler.java b/proxy/src/main/java/net/md_5/bungee/InitialHandler.java index 605f0e4b..611cc1c6 100644 --- a/proxy/src/main/java/net/md_5/bungee/InitialHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/InitialHandler.java @@ -8,6 +8,7 @@ import java.net.Socket; import java.util.ArrayList; import java.util.List; import javax.crypto.SecretKey; +import lombok.Getter; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.config.ListenerInfo; @@ -26,7 +27,8 @@ public class InitialHandler implements Runnable, PendingConnection { private final Socket socket; - private final ListenerInfo info; + @Getter + private final ListenerInfo listener; private PacketInputStream in; private OutputStream out; private Packet2Handshake handshake; @@ -34,7 +36,7 @@ public class InitialHandler implements Runnable, PendingConnection public InitialHandler(Socket socket, ListenerInfo info) throws IOException { this.socket = socket; - this.info = info; + this.listener = info; in = new PacketInputStream(socket.getInputStream()); out = socket.getOutputStream(); } @@ -77,7 +79,7 @@ public class InitialHandler implements Runnable, PendingConnection customPackets.add(custom); } - UserConnection userCon = new UserConnection(socket, info, in, out, handshake, customPackets); + UserConnection userCon = new UserConnection(socket, this, in, out, handshake, customPackets); String server = ProxyServer.getInstance().getReconnectHandler().getServer(userCon); ServerInfo s = BungeeCord.getInstance().config.getServers().get(server); userCon.connect(s); @@ -96,10 +98,10 @@ public class InitialHandler implements Runnable, PendingConnection String ping = (newPing) ? ChatColor.COLOR_CHAR + "1" + "\00" + BungeeCord.PROTOCOL_VERSION + "\00" + BungeeCord.GAME_VERSION - + "\00" + info.getMotd() + + "\00" + listener.getMotd() + "\00" + ProxyServer.getInstance().getPlayers().size() - + "\00" + info.getMaxPlayers() - : info.getMotd() + ChatColor.COLOR_CHAR + ProxyServer.getInstance().getPlayers().size() + ChatColor.COLOR_CHAR + info.getMaxPlayers(); + + "\00" + listener.getMaxPlayers() + : listener.getMotd() + ChatColor.COLOR_CHAR + ProxyServer.getInstance().getPlayers().size() + ChatColor.COLOR_CHAR + listener.getMaxPlayers(); throw new KickException(ping); default: if (id == 0xFA) diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java index 65d1c5d1..1a56ab2c 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java @@ -87,7 +87,7 @@ public class ServerConnection extends GenericConnection implements Server throw ex; } catch (Exception ex) { - InetSocketAddress def = BungeeCord.getInstance().config.getServers().get(user.info.getDefaultServer()).getAddress(); + InetSocketAddress def = BungeeCord.getInstance().config.getServers().get(user.getPendingConnection().getListener().getDefaultServer()).getAddress(); if (retry && !address.equals(def)) { return connect(user, name, def, handshake, false); diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index bb557304..d7bd7648 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -20,6 +20,7 @@ import lombok.Synchronized; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.config.ListenerInfo; import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.event.ChatEvent; import net.md_5.bungee.api.event.PluginMessageEvent; @@ -32,7 +33,8 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer public final Packet2Handshake handshake; public Queue packetQueue = new ConcurrentLinkedQueue<>(); public List loginPackets = new ArrayList<>(); -final ListenerInfo info; + @Getter + private final PendingConnection pendingConnection; @Getter private ServerConnection server; private UpstreamBridge upBridge; @@ -51,11 +53,11 @@ final ListenerInfo info; private final Map permissions = new HashMap<>(); private final Object permMutex = new Object(); - public UserConnection(Socket socket, ListenerInfo info, PacketInputStream in, OutputStream out, Packet2Handshake handshake, List loginPackets) + public UserConnection(Socket socket, PendingConnection pendingConnection, PacketInputStream in, OutputStream out, Packet2Handshake handshake, List loginPackets) { super(socket, in, out); - this.info = info; this.handshake = handshake; + this.pendingConnection = pendingConnection; name = handshake.username; displayName = handshake.username; this.loginPackets = loginPackets; diff --git a/proxy/src/main/java/net/md_5/bungee/YamlReconnectHandler.java b/proxy/src/main/java/net/md_5/bungee/YamlReconnectHandler.java new file mode 100644 index 00000000..6f1ced11 --- /dev/null +++ b/proxy/src/main/java/net/md_5/bungee/YamlReconnectHandler.java @@ -0,0 +1,81 @@ +package net.md_5.bungee; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Level; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.ReconnectHandler; +import net.md_5.bungee.api.config.ListenerInfo; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import org.yaml.snakeyaml.Yaml; + +public class YamlReconnectHandler implements ReconnectHandler +{ + + private final Yaml yaml = new Yaml(); + private final File file = new File("locations.yml"); + /*========================================================================*/ + private Map data; + + @SuppressWarnings("unchecked") + public YamlReconnectHandler() + { + try (FileReader rd = new FileReader(file)) + { + data = yaml.loadAs(rd, Map.class); + } catch (IOException ex) + { + ProxyServer.getInstance().getLogger().log(Level.WARNING, "Could not load reconnect locations", ex); + } + + if (data == null) + { + data = new ConcurrentHashMap<>(); + } else + { + data = new ConcurrentHashMap<>(data); + } + } + + @Override + public String getServer(ProxiedPlayer player) + { + ListenerInfo listener = player.getPendingConnection().getListener(); + if (listener.isForceDefault()) + { + return listener.getDefaultServer(); + } + + String server = data.get(key(player)); + return (server != null) ? server : listener.getDefaultServer(); + } + + @Override + public void setServer(ProxiedPlayer player) + { + data.put(key(player), player.getServer().getInfo().getName()); + } + + private String key(ProxiedPlayer player) + { + InetSocketAddress host = player.getPendingConnection().getVirtualHost(); + return player.getName() + ";" + host.getHostString() + ":" + host.getPort(); + } + + @Override + public void save() + { + try (FileWriter wr = new FileWriter(file)) + { + yaml.dump(data, wr); + } catch (IOException ex) + { + ProxyServer.getInstance().getLogger().log(Level.WARNING, "Could not save reconnect locations", ex); + } + } +} From 9ce148681d246dd82eaf21bec6fc22821f66e4ea Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 20 Jan 2013 15:02:45 +1100 Subject: [PATCH 38/45] Add server connected event --- .../api/event/ServerConnectedEvent.java | 30 +++++++++++++++++++ .../net/md_5/bungee/ServerConnection.java | 7 ++++- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 api/src/main/java/net/md_5/bungee/api/event/ServerConnectedEvent.java diff --git a/api/src/main/java/net/md_5/bungee/api/event/ServerConnectedEvent.java b/api/src/main/java/net/md_5/bungee/api/event/ServerConnectedEvent.java new file mode 100644 index 00000000..e8370b88 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/event/ServerConnectedEvent.java @@ -0,0 +1,30 @@ +package net.md_5.bungee.api.event; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.connection.Server; +import net.md_5.bungee.api.plugin.Event; + +/** + * Not to be confused with {@link ServerConnectEvent}, this event is called once + * a connection to a server is fully operational, and is about to hand over + * control of the session to the player. It is useful if you wish to send + * information to the server before the player logs in. + */ +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class ServerConnectedEvent extends Event +{ + + /** + * Player whom the server is for. + */ + private final ProxiedPlayer player; + /** + * The server itself. + */ + private final Server server; +} diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java index 1a56ab2c..415003f7 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java @@ -8,9 +8,11 @@ import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import javax.crypto.SecretKey; import net.md_5.bungee.api.Callback; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.ServerPing; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.Server; +import net.md_5.bungee.api.event.ServerConnectedEvent; import net.md_5.bungee.packet.DefinedPacket; import net.md_5.bungee.packet.Packet1Login; import net.md_5.bungee.packet.Packet2Handshake; @@ -81,7 +83,10 @@ public class ServerConnection extends GenericConnection implements Server } Packet1Login login = new Packet1Login(loginResponse); - return new ServerConnection(name, socket, in, out, login); + ServerConnection server = new ServerConnection(name, socket, in, out, login); + ServerConnectedEvent event = new ServerConnectedEvent(user, server); + ProxyServer.getInstance().getPluginManager().callEvent(event); + return server; } catch (KickException ex) { throw ex; From c281f008c34f980d6dccdcb5e1ff4b61c2da4cfa Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 20 Jan 2013 15:09:13 +1100 Subject: [PATCH 39/45] Ok, I guess tomorrow is testing day. --- proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java b/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java index 3982f229..b28b1808 100644 --- a/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java +++ b/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java @@ -28,7 +28,7 @@ public class YamlConfig implements ConfigurationAdapter private boolean loaded; private Yaml yaml; private Map config; - File file = new File("config.yml"); + private final File file = new File("config.yml"); public void load() { From 57576912c162504f20e828098003e642a25c794f Mon Sep 17 00:00:00 2001 From: md_5 Date: Mon, 21 Jan 2013 14:04:46 +1100 Subject: [PATCH 40/45] Add forced servers back. --- .../main/java/net/md_5/bungee/api/config/ListenerInfo.java | 6 ++++++ .../src/main/java/net/md_5/bungee/YamlReconnectHandler.java | 4 ++-- proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java | 6 +++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java b/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java index 150a79f3..7b0f0997 100644 --- a/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java +++ b/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java @@ -1,6 +1,7 @@ package net.md_5.bungee.api.config; import java.net.InetSocketAddress; +import java.util.Map; import lombok.Data; /** @@ -32,4 +33,9 @@ public class ListenerInfo * transferred to the default server on connect. */ private final boolean forceDefault; + /** + * A list of host to server name mappings which will force a user to be + * transferred depending on the host they connect to. + */ + private final Map forcedHosts; } diff --git a/proxy/src/main/java/net/md_5/bungee/YamlReconnectHandler.java b/proxy/src/main/java/net/md_5/bungee/YamlReconnectHandler.java index 6f1ced11..50c60d71 100644 --- a/proxy/src/main/java/net/md_5/bungee/YamlReconnectHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/YamlReconnectHandler.java @@ -50,8 +50,8 @@ public class YamlReconnectHandler implements ReconnectHandler { return listener.getDefaultServer(); } - - String server = data.get(key(player)); + String forced = listener.getForcedHosts().get(player.getPendingConnection().getVirtualHost().getHostName()); + String server = (forced == null) ? data.get(key(player)) : forced; return (server != null) ? server : listener.getDefaultServer(); } diff --git a/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java b/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java index b28b1808..e36b9dfa 100644 --- a/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java +++ b/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java @@ -147,6 +147,9 @@ public class YamlConfig implements ConfigurationAdapter { new HashMap() })); + Map forcedDef = new HashMap<>(); + forcedDef.put("pvp.md-5.net", "pvp"); + Collection ret = new HashSet<>(); for (Map val : base) @@ -157,7 +160,8 @@ public class YamlConfig implements ConfigurationAdapter boolean forceDefault = get("force_default_server", false, val); String host = get("host", "0.0.0.0:25577", val); InetSocketAddress address = Util.getAddr(host); - ListenerInfo info = new ListenerInfo(address, motd, maxPlayers, defaultServer, forceDefault); + Map forced = get("forced_hosts", forcedDef, val); + ListenerInfo info = new ListenerInfo(address, motd, maxPlayers, defaultServer, forceDefault, forced); ret.add(info); } From 39506f3fa62f9b8be428bd3826e24c7f3540d409 Mon Sep 17 00:00:00 2001 From: md_5 Date: Mon, 21 Jan 2013 17:49:34 +1100 Subject: [PATCH 41/45] Add crucial getter for server info --- .../net/md_5/bungee/ServerConnection.java | 29 +++++++++---------- .../java/net/md_5/bungee/UserConnection.java | 2 +- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java index 415003f7..110e53e4 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java @@ -7,6 +7,7 @@ import java.security.PublicKey; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import javax.crypto.SecretKey; +import lombok.Getter; import net.md_5.bungee.api.Callback; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.ServerPing; @@ -17,6 +18,7 @@ import net.md_5.bungee.packet.DefinedPacket; import net.md_5.bungee.packet.Packet1Login; import net.md_5.bungee.packet.Packet2Handshake; import net.md_5.bungee.packet.PacketCDClientStatus; +import net.md_5.bungee.packet.PacketFAPluginMessage; import net.md_5.bungee.packet.PacketFCEncryptionResponse; import net.md_5.bungee.packet.PacketFDEncryptionRequest; import net.md_5.bungee.packet.PacketFFKick; @@ -30,23 +32,24 @@ import org.bouncycastle.crypto.io.CipherOutputStream; public class ServerConnection extends GenericConnection implements Server { - public final String name; + @Getter + private final ServerInfo info; public final Packet1Login loginPacket; public Queue packetQueue = new ConcurrentLinkedQueue<>(); - public ServerConnection(String name, Socket socket, PacketInputStream in, OutputStream out, Packet1Login loginPacket) + public ServerConnection(Socket socket, ServerInfo info, PacketInputStream in, OutputStream out, Packet1Login loginPacket) { super(socket, in, out); - this.name = name; + this.info = info; this.loginPacket = loginPacket; } - public static ServerConnection connect(UserConnection user, String name, InetSocketAddress address, Packet2Handshake handshake, boolean retry) + public static ServerConnection connect(UserConnection user, ServerInfo info, Packet2Handshake handshake, boolean retry) { try { Socket socket = new Socket(); - socket.connect(address, BungeeCord.getInstance().config.getTimeout()); + socket.connect(info.getAddress(), BungeeCord.getInstance().config.getTimeout()); BungeeCord.getInstance().setSocketOptions(socket); PacketInputStream in = new PacketInputStream(socket.getInputStream()); @@ -83,7 +86,7 @@ public class ServerConnection extends GenericConnection implements Server } Packet1Login login = new Packet1Login(loginResponse); - ServerConnection server = new ServerConnection(name, socket, in, out, login); + ServerConnection server = new ServerConnection(socket, info, in, out, login); ServerConnectedEvent event = new ServerConnectedEvent(user, server); ProxyServer.getInstance().getPluginManager().callEvent(event); return server; @@ -92,10 +95,10 @@ public class ServerConnection extends GenericConnection implements Server throw ex; } catch (Exception ex) { - InetSocketAddress def = BungeeCord.getInstance().config.getServers().get(user.getPendingConnection().getListener().getDefaultServer()).getAddress(); - if (retry && !address.equals(def)) + ServerInfo def = ProxyServer.getInstance().getServers().get(user.getPendingConnection().getListener().getDefaultServer()); + if (retry && !info.equals(def)) { - return connect(user, name, def, handshake, false); + return connect(user, def, handshake, false); } else { throw new RuntimeException("Could not connect to target server " + Util.exception(ex)); @@ -103,16 +106,10 @@ public class ServerConnection extends GenericConnection implements Server } } - @Override - public ServerInfo getInfo() - { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - @Override public void sendData(String channel, byte[] data) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + packetQueue.add(new PacketFAPluginMessage(channel, data)); } @Override diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index d7bd7648..77f622d0 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -96,7 +96,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer out.write(new Packet9Respawn((byte) -1, (byte) 0, (byte) 0, (short) 256, "DEFAULT").getPacket()); } - ServerConnection newServer = ServerConnection.connect(this, name, target.getAddress(), handshake, true); + ServerConnection newServer = ServerConnection.connect(this, target, handshake, true); if (server == null) { // Once again, first connection From 4b9b2cbb96b10aa7aa6d5b98900c849e69a511cb Mon Sep 17 00:00:00 2001 From: md_5 Date: Tue, 22 Jan 2013 10:20:33 +1100 Subject: [PATCH 42/45] Add plugin channel support for plugins. --- .../java/net/md_5/bungee/api/ProxyServer.java | 22 ++++++++++ .../main/java/net/md_5/bungee/BungeeCord.java | 42 +++++++++++++++++-- .../net/md_5/bungee/ServerConnection.java | 3 ++ .../java/net/md_5/bungee/UserConnection.java | 2 + 4 files changed, 66 insertions(+), 3 deletions(-) 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 f51dec1f..1d4522c6 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 @@ -152,4 +152,26 @@ public abstract class ProxyServer * 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 getChannels(); } diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java index ded8ae36..c0f038db 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -7,6 +7,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -20,6 +21,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import lombok.Getter; import lombok.Setter; +import lombok.Synchronized; import static net.md_5.bungee.Logger.$; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.ReconnectHandler; @@ -34,6 +36,7 @@ import net.md_5.bungee.api.plugin.PluginManager; import net.md_5.bungee.command.*; import net.md_5.bungee.config.YamlConfig; import net.md_5.bungee.packet.DefinedPacket; +import net.md_5.bungee.packet.PacketFAPluginMessage; /** * Main BungeeCord proxy class. @@ -73,7 +76,6 @@ public class BungeeCord extends ProxyServer * Fully qualified connections. */ public Map connections = new ConcurrentHashMap<>(); - public Map> connectionsByServer = new ConcurrentHashMap<>(); /** * Tab list handler */ @@ -91,6 +93,7 @@ public class BungeeCord extends ProxyServer @Getter @Setter private ConfigurationAdapter configurationAdapter = new YamlConfig(); + private final Collection pluginChannels = new HashSet<>(); { @@ -272,8 +275,8 @@ public class BungeeCord extends ProxyServer @Override public Server getServer(String name) { - List users = connectionsByServer.get(name); - return (users != null && !users.isEmpty()) ? users.get(0).getServer() : null; + Collection users = getServers().get(name).getPlayers(); + return (users != null && !users.isEmpty()) ? users.iterator().next().getServer() : null; } @Override @@ -281,4 +284,37 @@ public class BungeeCord extends ProxyServer { return config.getServers(); } + + @Override + @Synchronized("pluginChannels") + public void registerChannel(String channel) + { + pluginChannels.add(channel); + } + + @Override + @Synchronized("pluginChannels") + public void unregisterChannel(String channel) + { + pluginChannels.remove(channel); + } + + @Override + @Synchronized("pluginChannels") + public Collection getChannels() + { + return Collections.unmodifiableCollection(pluginChannels); + } + + public PacketFAPluginMessage registerChannels() + { + StringBuilder sb = new StringBuilder(); + for (String s : getChannels()) + { + sb.append(s); + sb.append('\00'); + } + byte[] payload = sb.substring(0, sb.length() - 1).getBytes(); + return new PacketFAPluginMessage("REGISTER", payload); + } } diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java index 110e53e4..57994e55 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java @@ -89,6 +89,9 @@ public class ServerConnection extends GenericConnection implements Server ServerConnection server = new ServerConnection(socket, info, in, out, login); ServerConnectedEvent event = new ServerConnectedEvent(user, server); ProxyServer.getInstance().getPluginManager().callEvent(event); + + out.write(BungeeCord.getInstance().registerChannels().getPacket()); + return server; } catch (KickException ex) { diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index 77f622d0..a5405896 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -103,6 +103,8 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer clientEntityId = newServer.loginPacket.entityId; serverEntityId = newServer.loginPacket.entityId; out.write(newServer.loginPacket.getPacket()); + out.write(BungeeCord.getInstance().registerChannels().getPacket()); + upBridge = new UpstreamBridge(); upBridge.start(); } else From ade3fe43116cdd92e17e3dc066f0977687e7684d Mon Sep 17 00:00:00 2001 From: md_5 Date: Tue, 22 Jan 2013 10:39:21 +1100 Subject: [PATCH 43/45] Just need to add default permissions and we are ready for release. --- .../main/java/net/md_5/bungee/BungeeCord.java | 7 +++++- .../java/net/md_5/bungee/InitialHandler.java | 1 + .../java/net/md_5/bungee/UserConnection.java | 23 +++++++++++++++---- .../net/md_5/bungee/YamlReconnectHandler.java | 8 +++++-- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java index c0f038db..bc0f83ec 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -89,7 +89,7 @@ public class BungeeCord extends ProxyServer public final PluginManager pluginManager = new PluginManager(); @Getter @Setter - private ReconnectHandler reconnectHandler = new YamlReconnectHandler(); + private ReconnectHandler reconnectHandler; @Getter @Setter private ConfigurationAdapter configurationAdapter = new YamlConfig(); @@ -104,6 +104,10 @@ public class BungeeCord extends ProxyServer getPluginManager().registerCommand(new CommandIP()); getPluginManager().registerCommand(new CommandAlert()); getPluginManager().registerCommand(new CommandBungee()); + + registerChannel("BungeeCord::Disconnect"); + registerChannel("BungeeCord::Connect"); + registerChannel("BungeeCord::Forward"); } public static BungeeCord getInstance() @@ -148,6 +152,7 @@ public class BungeeCord extends ProxyServer public void start() throws IOException { config.load(); + reconnectHandler = new YamlReconnectHandler(); isRunning = true; File plugins = new File("plugins"); diff --git a/proxy/src/main/java/net/md_5/bungee/InitialHandler.java b/proxy/src/main/java/net/md_5/bungee/InitialHandler.java index 611cc1c6..d09f9dfa 100644 --- a/proxy/src/main/java/net/md_5/bungee/InitialHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/InitialHandler.java @@ -118,6 +118,7 @@ public class InitialHandler implements Runnable, PendingConnection } catch (Exception ex) { disconnect("[Proxy Error] " + Util.exception(ex)); + ex.printStackTrace(); } } diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index a5405896..5b893456 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -18,10 +18,10 @@ import java.util.concurrent.ConcurrentLinkedQueue; import lombok.Getter; import lombok.Synchronized; import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.config.ListenerInfo; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.event.ChatEvent; import net.md_5.bungee.api.event.PluginMessageEvent; import net.md_5.bungee.api.event.ServerConnectEvent; @@ -77,7 +77,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer if (server == null) { // First join - ProxyServer.getInstance().getPlayers().add(this); + BungeeCord.getInstance().connections.put(name, this); ProxyServer.getInstance().getTabListHandler().onConnect(this); } @@ -118,6 +118,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer } server.disconnect("Quitting"); + server.getInfo().removePlayer(this); Packet1Login login = newServer.loginPacket; serverEntityId = login.entityId; @@ -127,8 +128,6 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer // Reconnect process has finished, lets get the player moving again reconnecting = false; - // Remove from the old by server list - server.getInfo().removePlayer(this); // Add to new target.addPlayer(this); @@ -141,8 +140,8 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer destroySelf(ex.getMessage()); } catch (Exception ex) { - destroySelf("Could not connect to server - " + ex.getClass().getSimpleName()); ex.printStackTrace(); // TODO: Remove + destroySelf("Could not connect to server - " + ex.getClass().getSimpleName()); } } @@ -377,6 +376,20 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer short len = in.readShort(); byte[] data = new byte[len]; in.readFully(data); + + if (target.equals("ALL")) + { + for (String s : BungeeCord.getInstance().getServers().keySet()) + { + Server server = BungeeCord.getInstance().getServer(s); + server.sendData(channel, data); + } + } else + { + Server server = BungeeCord.getInstance().getServer(target); + server.sendData(channel, data); + } + break; case "BungeeCord::Connect": ServerInfo server = BungeeCord.getInstance().config.getServers().get(in.readUTF()); diff --git a/proxy/src/main/java/net/md_5/bungee/YamlReconnectHandler.java b/proxy/src/main/java/net/md_5/bungee/YamlReconnectHandler.java index 50c60d71..cd9e227a 100644 --- a/proxy/src/main/java/net/md_5/bungee/YamlReconnectHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/YamlReconnectHandler.java @@ -25,9 +25,13 @@ public class YamlReconnectHandler implements ReconnectHandler @SuppressWarnings("unchecked") public YamlReconnectHandler() { - try (FileReader rd = new FileReader(file)) + try { - data = yaml.loadAs(rd, Map.class); + file.createNewFile(); + try (FileReader rd = new FileReader(file)) + { + data = yaml.loadAs(rd, Map.class); + } } catch (IOException ex) { ProxyServer.getInstance().getLogger().log(Level.WARNING, "Could not load reconnect locations", ex); From a22f57c1f58b80d0cc7be8294eb4b3838c68bb1e Mon Sep 17 00:00:00 2001 From: md_5 Date: Tue, 22 Jan 2013 12:29:46 +1100 Subject: [PATCH 44/45] Add default permissions --- .../net/md_5/bungee/config/YamlConfig.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java b/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java index e36b9dfa..d288ee80 100644 --- a/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java +++ b/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java @@ -46,7 +46,7 @@ public class YamlConfig implements ConfigurationAdapter if (config == null) { - config = new LinkedHashMap<>(); + config = new HashMap(); } loaded = true; @@ -54,6 +54,25 @@ public class YamlConfig implements ConfigurationAdapter { throw new RuntimeException("Could not load configuration!", ex); } + + Map permissions = get("permissions", new HashMap()); + if (permissions.isEmpty()) + { + permissions.put("default", Arrays.asList(new String[] + { + "bungeecord.command.server", "bungeecord.command.list" + })); + permissions.put("admin", Arrays.asList(new String[] + { + "bungeecord.command.alert", "bungeecord.command.end", "bungeecord.command.ip", "bungeecord.command.reload" + })); + } + + Map groups = get("groups", new HashMap()); + if (groups.isEmpty()) + { + groups.put("md_5", Collections.singletonList("admin")); + } } private T get(String path, T def) @@ -87,7 +106,7 @@ public class YamlConfig implements ConfigurationAdapter } else { String first = path.substring(0, index); - String second = path.substring(index, path.length()); + String second = path.substring(index + 1, path.length()); Map sub = (Map) submap.get(first); return (sub != null) ? get(second, def, sub) : def; } @@ -172,7 +191,7 @@ public class YamlConfig implements ConfigurationAdapter @SuppressWarnings("unchecked") public Collection getGroups(String player) { - return get("groups." + player, Collections.EMPTY_SET); + return get("groups." + player, Collections.singleton("default")); } @Override From cae71552cdabc4cd1ce3f9736d59de4caadac434 Mon Sep 17 00:00:00 2001 From: md_5 Date: Tue, 22 Jan 2013 13:21:04 +1100 Subject: [PATCH 45/45] Fix permissions and stuff, we are go for master! --- proxy/src/main/java/net/md_5/bungee/ServerConnection.java | 2 ++ proxy/src/main/java/net/md_5/bungee/UserConnection.java | 5 +++++ .../main/java/net/md_5/bungee/command/CommandServer.java | 2 +- proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java | 6 ++++-- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java index 57994e55..54db34e3 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java @@ -9,6 +9,7 @@ import java.util.concurrent.ConcurrentLinkedQueue; import javax.crypto.SecretKey; import lombok.Getter; import net.md_5.bungee.api.Callback; +import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.ServerPing; import net.md_5.bungee.api.config.ServerInfo; @@ -101,6 +102,7 @@ public class ServerConnection extends GenericConnection implements Server ServerInfo def = ProxyServer.getInstance().getServers().get(user.getPendingConnection().getListener().getDefaultServer()); if (retry && !info.equals(def)) { + user.sendMessage(ChatColor.RED + "Could not connect to target server, you have been moved to the default server"); return connect(user, def, handshake, false); } else { diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index 5b893456..32a2c154 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -61,6 +61,11 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer name = handshake.username; displayName = handshake.username; this.loginPackets = loginPackets; + Collection g = ProxyServer.getInstance().getConfigurationAdapter().getGroups(name); + for (String s : g) + { + addGroups(s); + } } @Override diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java b/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java index 29d5e5ec..1c518efc 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java +++ b/proxy/src/main/java/net/md_5/bungee/command/CommandServer.java @@ -44,7 +44,7 @@ public class CommandServer extends Command if (server == null) { player.sendMessage(ChatColor.RED + "The specified server does not exist"); - } else if (server == player.getServer()) + } else if (server.equals(player.getServer().getInfo())) { player.sendMessage(ChatColor.RED + "You are already on this server."); } else diff --git a/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java b/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java index d288ee80..a3da837e 100644 --- a/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java +++ b/proxy/src/main/java/net/md_5/bungee/config/YamlConfig.java @@ -11,7 +11,6 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; import net.md_5.bungee.Util; @@ -191,7 +190,10 @@ public class YamlConfig implements ConfigurationAdapter @SuppressWarnings("unchecked") public Collection getGroups(String player) { - return get("groups." + player, Collections.singleton("default")); + Collection groups = get("groups." + player, Collections.EMPTY_LIST); + Collection ret = new HashSet<>(groups); + ret.add("default"); + return ret; } @Override