mirror of
https://github.com/PaperMC/Waterfall.git
synced 2024-11-16 07:15:14 +01:00
85c0a35f0b
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing BungeeCord Changes: 6613aaea Add test fix for library classes being visible to non-dependent plugins 53ce6b93 #3200: Fix protocol for 21w40a d8e29384 #2466: Use switch in "BungeeCord" plugin message handling 5cf869df #3198: Remove terminally deprecated SecurityManager f26f7d88 Add optional 1.18 (21w40a) snapshot protocol support
216 lines
8.2 KiB
Diff
216 lines
8.2 KiB
Diff
From dad0bc898469685c8de63dd5fba41e50d048da34 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 00000000..9a262c8a
|
|
--- /dev/null
|
|
+++ b/api/src/main/java/io/github/waterfallmc/waterfall/QueryResult.java
|
|
@@ -0,0 +1,59 @@
|
|
+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.
|
|
+ */
|
|
+ private int onlinePlayers;
|
|
+ /**
|
|
+ * The maximum number of players that can be online.
|
|
+ */
|
|
+ private int maxPlayers;
|
|
+ /**
|
|
+ * The port for this server.
|
|
+ */
|
|
+ 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 00000000..220d59f0
|
|
--- /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 9b81197f..ac99d02c 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
|
|
@@ -2,6 +2,8 @@ package net.md_5.bungee.query;
|
|
|
|
import com.google.common.cache.Cache;
|
|
import com.google.common.cache.CacheBuilder;
|
|
+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;
|
|
@@ -9,10 +11,12 @@ import io.netty.channel.SimpleChannelInboundHandler;
|
|
import io.netty.channel.socket.DatagramPacket;
|
|
import java.net.InetAddress;
|
|
import java.util.LinkedHashMap;
|
|
+import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Random;
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.logging.Level;
|
|
+import java.util.stream.Collectors;
|
|
import lombok.Data;
|
|
import lombok.RequiredArgsConstructor;
|
|
import net.md_5.bungee.api.ProxyServer;
|
|
@@ -95,19 +99,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
|
|
@@ -117,18 +132,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() )
|
|
{
|
|
@@ -140,10 +157,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.30.1 (Apple Git-130)
|
|
|