mirror of
https://github.com/PaperMC/Waterfall.git
synced 2024-11-28 13:15:31 +01:00
Added more stuff from old Waterfall
This commit is contained in:
parent
2fc007f3e4
commit
1cf5557c48
@ -0,0 +1,89 @@
|
||||
From 22251b09127f2cebcb6853666cf391f6c07641dd Mon Sep 17 00:00:00 2001
|
||||
From: Ichbinjoe <joe@ibj.io>
|
||||
Date: Sun, 3 Jul 2016 03:54:14 -0400
|
||||
Subject: [PATCH] Add timeout variant to connect methods Also added more
|
||||
connect methods to ProxiedPlayer, in addition to the new method
|
||||
|
||||
|
||||
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 375815c..c49e900 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
|
||||
@@ -69,6 +69,38 @@ public interface ProxiedPlayer extends Connection, CommandSender
|
||||
*/
|
||||
void connect(ServerInfo target, Callback<Boolean> callback);
|
||||
|
||||
+ // Waterfall start
|
||||
+ /**
|
||||
+ * 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 target the new server to connect to
|
||||
+ * @param callback the method called when the connection is complete, or
|
||||
+ * when an exception is encountered. The boolean parameter denotes success
|
||||
+ * or failure.
|
||||
+ * @param retry whether to retry the connection if the initial connection
|
||||
+ * fails.
|
||||
+ */
|
||||
+ void connect(ServerInfo target, Callback<Boolean> callback, boolean retry);
|
||||
+
|
||||
+ /**
|
||||
+ * 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 target the new server to connect to
|
||||
+ * @param callback the method called when the connection is complete, or
|
||||
+ * when an exception is encountered. The boolean parameter denotes success
|
||||
+ * or failure.
|
||||
+ * @param retry whether to retry the connection if the initial connection
|
||||
+ * fails.
|
||||
+ * @param timeout timeout in milliseconds of the connection created to the
|
||||
+ * target server
|
||||
+ */
|
||||
+ void connect(ServerInfo target, Callback<Boolean> callback, boolean retry, int timeout);
|
||||
+ // Waterfall end
|
||||
+
|
||||
/**
|
||||
* Gets the server this player is connected to.
|
||||
*
|
||||
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 ff103bf..47b37c0 100644
|
||||
--- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java
|
||||
+++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java
|
||||
@@ -251,6 +251,13 @@ public final class UserConnection implements ProxiedPlayer
|
||||
|
||||
public void connect(ServerInfo info, final Callback<Boolean> callback, final boolean retry)
|
||||
{
|
||||
+ // Waterfall start
|
||||
+ connect(info, callback, retry, 5000); // todo: configurable
|
||||
+ }
|
||||
+
|
||||
+ public void connect(ServerInfo info, final Callback<Boolean> callback, final boolean retry, final int timeout)
|
||||
+ {
|
||||
+ // Waterfall end
|
||||
Preconditions.checkNotNull( info, "info" );
|
||||
|
||||
ServerConnectEvent event = new ServerConnectEvent( this, info );
|
||||
@@ -319,7 +326,7 @@ public final class UserConnection implements ProxiedPlayer
|
||||
if ( retry && def != null && ( getServer() == null || def != getServer().getInfo() ) )
|
||||
{
|
||||
sendMessage( bungee.getTranslation( "fallback_lobby" ) );
|
||||
- connect( def, null, false );
|
||||
+ connect( def, null, false, timeout ); // Waterfall
|
||||
} else
|
||||
{
|
||||
disconnect( bungee.getTranslation( "fallback_kick", future.cause().getClass().getName() ) );
|
||||
@@ -331,7 +338,7 @@ public final class UserConnection implements ProxiedPlayer
|
||||
.channel( PipelineUtils.getChannel() )
|
||||
.group( ch.getHandle().eventLoop() )
|
||||
.handler( initializer )
|
||||
- .option( ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000 ) // TODO: Configurable
|
||||
+ .option( ChannelOption.CONNECT_TIMEOUT_MILLIS, timeout ) // Waterfall
|
||||
.remoteAddress( target.getAddress() );
|
||||
// Windows is bugged, multi homed users will just have to live with random connecting IPs
|
||||
if ( getPendingConnection().getListener().isSetLocalAddress() && !PlatformDependent.isWindows() )
|
||||
--
|
||||
2.7.4 (Apple Git-66)
|
||||
|
219
BungeeCord-Patches/0042-Proxy-query-event.patch
Normal file
219
BungeeCord-Patches/0042-Proxy-query-event.patch
Normal file
@ -0,0 +1,219 @@
|
||||
From 2df0089bfe96dcd1abf5a192a4f21b025867bfa8 Mon Sep 17 00:00:00 2001
|
||||
From: minecrafter <unknown@unknown>
|
||||
Date: Sun, 3 Jul 2016 04:03:21 -0400
|
||||
Subject: [PATCH] Proxy query event
|
||||
|
||||
|
||||
diff --git a/api/src/main/java/io/github/waterfallmc/waterfall/QueryResult.java b/api/src/main/java/io/github/waterfallmc/waterfall/QueryResult.java
|
||||
new file mode 100644
|
||||
index 0000000..1e33cd1
|
||||
--- /dev/null
|
||||
+++ b/api/src/main/java/io/github/waterfallmc/waterfall/QueryResult.java
|
||||
@@ -0,0 +1,62 @@
|
||||
+package io.github.waterfallmc.waterfall;
|
||||
+
|
||||
+import lombok.AllArgsConstructor;
|
||||
+import lombok.Data;
|
||||
+import lombok.NonNull;
|
||||
+
|
||||
+import java.util.List;
|
||||
+
|
||||
+@Data
|
||||
+@AllArgsConstructor
|
||||
+public class QueryResult {
|
||||
+ /**
|
||||
+ * The message of the day to return.
|
||||
+ */
|
||||
+ @NonNull
|
||||
+ private String motd;
|
||||
+ /**
|
||||
+ * The game type to return, usually SMP.
|
||||
+ */
|
||||
+ @NonNull
|
||||
+ private String gameType;
|
||||
+ /**
|
||||
+ * The world name to return.
|
||||
+ */
|
||||
+ @NonNull
|
||||
+ private String worldName;
|
||||
+ /**
|
||||
+ * The number of players currently online.
|
||||
+ */
|
||||
+ @NonNull
|
||||
+ private int onlinePlayers;
|
||||
+ /**
|
||||
+ * The maximum number of players that can be online.
|
||||
+ */
|
||||
+ @NonNull
|
||||
+ private int maxPlayers;
|
||||
+ /**
|
||||
+ * The port for this server.
|
||||
+ */
|
||||
+ @NonNull
|
||||
+ private int port;
|
||||
+ /**
|
||||
+ * The hostname for this server.
|
||||
+ */
|
||||
+ @NonNull
|
||||
+ private String address;
|
||||
+ /**
|
||||
+ * The game ID for this server, usually MINECRAFT.
|
||||
+ */
|
||||
+ @NonNull
|
||||
+ private String gameId;
|
||||
+ /**
|
||||
+ * The players currently online.
|
||||
+ */
|
||||
+ @NonNull
|
||||
+ private final List<String> players;
|
||||
+ /**
|
||||
+ * The version to return for this server.
|
||||
+ */
|
||||
+ @NonNull
|
||||
+ private String version;
|
||||
+}
|
||||
diff --git a/api/src/main/java/io/github/waterfallmc/waterfall/event/ProxyQueryEvent.java b/api/src/main/java/io/github/waterfallmc/waterfall/event/ProxyQueryEvent.java
|
||||
new file mode 100644
|
||||
index 0000000..220d59f
|
||||
--- /dev/null
|
||||
+++ b/api/src/main/java/io/github/waterfallmc/waterfall/event/ProxyQueryEvent.java
|
||||
@@ -0,0 +1,28 @@
|
||||
+package io.github.waterfallmc.waterfall.event;
|
||||
+
|
||||
+import io.github.waterfallmc.waterfall.QueryResult;
|
||||
+import lombok.AllArgsConstructor;
|
||||
+import lombok.Data;
|
||||
+import lombok.EqualsAndHashCode;
|
||||
+import lombok.NonNull;
|
||||
+import net.md_5.bungee.api.config.ListenerInfo;
|
||||
+import net.md_5.bungee.api.plugin.Event;
|
||||
+
|
||||
+/**
|
||||
+ * This event will be posted whenever a Query request is received.
|
||||
+ */
|
||||
+@AllArgsConstructor
|
||||
+@EqualsAndHashCode(callSuper = false)
|
||||
+@Data
|
||||
+public class ProxyQueryEvent extends Event {
|
||||
+ /**
|
||||
+ * The listener associated with this query.
|
||||
+ */
|
||||
+ @NonNull
|
||||
+ private final ListenerInfo listener;
|
||||
+ /**
|
||||
+ * The query to return.
|
||||
+ */
|
||||
+ @NonNull
|
||||
+ private QueryResult result;
|
||||
+}
|
||||
diff --git a/query/src/main/java/net/md_5/bungee/query/QueryHandler.java b/query/src/main/java/net/md_5/bungee/query/QueryHandler.java
|
||||
index 0be915c..e577b3f 100644
|
||||
--- a/query/src/main/java/net/md_5/bungee/query/QueryHandler.java
|
||||
+++ b/query/src/main/java/net/md_5/bungee/query/QueryHandler.java
|
||||
@@ -1,17 +1,18 @@
|
||||
package net.md_5.bungee.query;
|
||||
|
||||
+import io.github.waterfallmc.waterfall.QueryResult;
|
||||
+import io.github.waterfallmc.waterfall.event.ProxyQueryEvent;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.channel.AddressedEnvelope;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.SimpleChannelInboundHandler;
|
||||
import io.netty.channel.socket.DatagramPacket;
|
||||
import java.nio.ByteOrder;
|
||||
-import java.util.HashMap;
|
||||
-import java.util.LinkedHashMap;
|
||||
-import java.util.Map;
|
||||
-import java.util.Random;
|
||||
+import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.logging.Level;
|
||||
+import java.util.stream.Collectors;
|
||||
+
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import net.md_5.bungee.api.ProxyServer;
|
||||
import net.md_5.bungee.api.config.ListenerInfo;
|
||||
@@ -82,19 +83,30 @@ public class QueryHandler extends SimpleChannelInboundHandler<DatagramPacket>
|
||||
throw new IllegalStateException( "No session!" );
|
||||
}
|
||||
|
||||
+ // Waterfall start
|
||||
+ List<String> players = bungee.getPlayers().stream().map(ProxiedPlayer::getName).collect(Collectors.toList());
|
||||
+
|
||||
+ ProxyQueryEvent event = new ProxyQueryEvent(listener, new QueryResult(listener.getMotd(), "SMP", "Waterfall_Proxy",
|
||||
+ bungee.getOnlineCount(), listener.getMaxPlayers(), listener.getHost().getPort(),
|
||||
+ listener.getHost().getHostString(), "MINECRAFT", players, bungee.getGameVersion()));
|
||||
+ QueryResult result = bungee.getPluginManager().callEvent(event).getResult();
|
||||
+ // Waterfall end
|
||||
+
|
||||
out.writeByte( 0x00 );
|
||||
out.writeInt( sessionId );
|
||||
|
||||
if ( in.readableBytes() == 0 )
|
||||
{
|
||||
// Short response
|
||||
- writeString( out, listener.getMotd() ); // MOTD
|
||||
- writeString( out, "SMP" ); // Game Type
|
||||
- writeString( out, "BungeeCord_Proxy" ); // World Name
|
||||
- writeNumber( out, bungee.getOnlineCount() ); // Online Count
|
||||
- writeNumber( out, listener.getMaxPlayers() ); // Max Players
|
||||
- writeShort( out, listener.getHost().getPort() ); // Port
|
||||
- writeString( out, listener.getHost().getHostString() ); // IP
|
||||
+ // Waterfall start
|
||||
+ writeString( out, result.getMotd() ); // MOTD
|
||||
+ writeString( out, result.getGameType() ); // Game Type
|
||||
+ writeString( out, result.getWorldName() ); // World Name
|
||||
+ writeNumber( out, result.getOnlinePlayers() ); // Online Count
|
||||
+ writeNumber( out, result.getMaxPlayers() ); // Max Players
|
||||
+ writeShort( out, result.getPort() ); // Port
|
||||
+ writeString( out, result.getAddress() ); // IP
|
||||
+ // Waterfall end
|
||||
} else if ( in.readableBytes() == 4 )
|
||||
{
|
||||
// Long Response
|
||||
@@ -104,18 +116,20 @@ public class QueryHandler extends SimpleChannelInboundHandler<DatagramPacket>
|
||||
} );
|
||||
Map<String, String> data = new LinkedHashMap<>();
|
||||
|
||||
- data.put( "hostname", listener.getMotd() );
|
||||
- data.put( "gametype", "SMP" );
|
||||
+ // Waterfall start
|
||||
+ data.put( "hostname", result.getMotd() );
|
||||
+ data.put( "gametype", result.getGameType() );
|
||||
// Start Extra Info
|
||||
- data.put( "game_id", "MINECRAFT" );
|
||||
- data.put( "version", bungee.getGameVersion() );
|
||||
- data.put( "plugins", "" );
|
||||
+ data.put( "game_id", result.getGameId() );
|
||||
+ data.put( "version", result.getVersion() );
|
||||
+ data.put( "plugins", "" ); // TODO: Allow population?
|
||||
// End Extra Info
|
||||
- data.put( "map", "BungeeCord_Proxy" );
|
||||
- data.put( "numplayers", Integer.toString( bungee.getOnlineCount() ) );
|
||||
- data.put( "maxplayers", Integer.toString( listener.getMaxPlayers() ) );
|
||||
- data.put( "hostport", Integer.toString( listener.getHost().getPort() ) );
|
||||
- data.put( "hostip", listener.getHost().getHostString() );
|
||||
+ data.put( "map", result.getWorldName() );
|
||||
+ data.put( "numplayers", Integer.toString( result.getOnlinePlayers() ) );
|
||||
+ data.put( "maxplayers", Integer.toString( result.getMaxPlayers() ) );
|
||||
+ data.put( "hostport", Integer.toString( result.getPort() ) );
|
||||
+ data.put( "hostip", result.getAddress() );
|
||||
+ // Waterfall end
|
||||
|
||||
for ( Map.Entry<String, String> entry : data.entrySet() )
|
||||
{
|
||||
@@ -127,10 +141,7 @@ public class QueryHandler extends SimpleChannelInboundHandler<DatagramPacket>
|
||||
// Padding
|
||||
writeString( out, "\01player_\00" );
|
||||
// Player List
|
||||
- for ( ProxiedPlayer p : bungee.getPlayers() )
|
||||
- {
|
||||
- writeString( out, p.getName() );
|
||||
- }
|
||||
+ result.getPlayers().stream().forEach(p -> writeString(out, p)); // Waterfall
|
||||
out.writeByte( 0x00 ); // Null
|
||||
} else
|
||||
{
|
||||
--
|
||||
2.7.4 (Apple Git-66)
|
||||
|
Loading…
Reference in New Issue
Block a user